using System; using System.Globalization; using System.Text; namespace Jellyfin.Api.Helpers { /// /// Hls Codec string helpers. /// public static class HlsCodecStringHelpers { /// /// Gets a MP3 codec string. /// /// MP3 codec string. public static string GetMP3String() { return "mp4a.40.34"; } /// /// Gets an AAC codec string. /// /// AAC profile. /// AAC codec string. public static string GetAACString(string profile) { StringBuilder result = new StringBuilder("mp4a", 9); if (string.Equals(profile, "HE", StringComparison.OrdinalIgnoreCase)) { result.Append(".40.5"); } else { // Default to LC if profile is invalid result.Append(".40.2"); } return result.ToString(); } /// /// Gets a H.264 codec string. /// /// H.264 profile. /// H.264 level. /// H.264 string. public static string GetH264String(string profile, int level) { StringBuilder result = new StringBuilder("avc1", 11); if (string.Equals(profile, "high", StringComparison.OrdinalIgnoreCase)) { result.Append(".6400"); } else if (string.Equals(profile, "main", StringComparison.OrdinalIgnoreCase)) { result.Append(".4D40"); } else if (string.Equals(profile, "baseline", StringComparison.OrdinalIgnoreCase)) { result.Append(".42E0"); } else { // Default to constrained baseline if profile is invalid result.Append(".4240"); } string levelHex = level.ToString("X2", CultureInfo.InvariantCulture); result.Append(levelHex); return result.ToString(); } /// /// Gets a H.265 codec string. /// /// H.265 profile. /// H.265 level. /// H.265 string. public static string GetH265String(string profile, int level) { // The h265 syntax is a bit of a mystery at the time this comment was written. // This is what I've found through various sources: // FORMAT: [codecTag].[profile].[constraint?].L[level * 30].[UNKNOWN] StringBuilder result = new StringBuilder("hev1", 16); if (string.Equals(profile, "main10", StringComparison.OrdinalIgnoreCase)) { result.Append(".2.6"); } else { // Default to main if profile is invalid result.Append(".1.6"); } result.Append(".L") .Append(level * 3) .Append(".B0"); return result.ToString(); } /// /// Gets an AC-3 codec string. /// /// AC-3 codec string. public static string GetAC3String() { return "mp4a.a5"; } /// /// Gets an E-AC-3 codec string. /// /// E-AC-3 codec string. public static string GetEAC3String() { return "mp4a.a6"; } } }