|
@@ -182,6 +182,68 @@ public static class HlsCodecStringHelpers
|
|
|
return result.ToString();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// Gets a VP9 codec string.
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="width">Video width.</param>
|
|
|
+ /// <param name="height">Video height.</param>
|
|
|
+ /// <param name="pixelFormat">Video pixel format.</param>
|
|
|
+ /// <param name="framerate">Video framerate.</param>
|
|
|
+ /// <param name="bitDepth">Video bitDepth.</param>
|
|
|
+ /// <returns>The VP9 codec string.</returns>
|
|
|
+ public static string GetVp9String(int width, int height, string pixelFormat, float framerate, int bitDepth)
|
|
|
+ {
|
|
|
+ // refer: https://www.webmproject.org/vp9/mp4/
|
|
|
+ StringBuilder result = new StringBuilder("vp09", 13);
|
|
|
+
|
|
|
+ var profileString = pixelFormat switch
|
|
|
+ {
|
|
|
+ "yuv420p" => "00",
|
|
|
+ "yuvj420p" => "00",
|
|
|
+ "yuv422p" => "01",
|
|
|
+ "yuv444p" => "01",
|
|
|
+ "yuv420p10le" => "02",
|
|
|
+ "yuv420p12le" => "02",
|
|
|
+ "yuv422p10le" => "03",
|
|
|
+ "yuv422p12le" => "03",
|
|
|
+ "yuv444p10le" => "03",
|
|
|
+ "yuv444p12le" => "03",
|
|
|
+ _ => "00"
|
|
|
+ };
|
|
|
+
|
|
|
+ var lumaPictureSize = width * height;
|
|
|
+ var lumaSampleRate = lumaPictureSize * framerate;
|
|
|
+ var levelString = lumaPictureSize switch
|
|
|
+ {
|
|
|
+ <= 0 => "00",
|
|
|
+ <= 36864 => "10",
|
|
|
+ <= 73728 => "11",
|
|
|
+ <= 122880 => "20",
|
|
|
+ <= 245760 => "21",
|
|
|
+ <= 552960 => "30",
|
|
|
+ <= 983040 => "31",
|
|
|
+ <= 2228224 => lumaSampleRate <= 83558400 ? "40" : "41",
|
|
|
+ <= 8912896 => lumaSampleRate <= 311951360 ? "50" : (lumaSampleRate <= 588251136 ? "51" : "52"),
|
|
|
+ <= 35651584 => lumaSampleRate <= 1176502272 ? "60" : (lumaSampleRate <= 4706009088 ? "61" : "62"),
|
|
|
+ _ => "00" // This should not happen
|
|
|
+ };
|
|
|
+
|
|
|
+ if (bitDepth != 8
|
|
|
+ && bitDepth != 10
|
|
|
+ && bitDepth != 12)
|
|
|
+ {
|
|
|
+ // Default to 8 bits
|
|
|
+ bitDepth = 8;
|
|
|
+ }
|
|
|
+
|
|
|
+ result.Append('.').Append(profileString).Append('.').Append(levelString);
|
|
|
+ var bitDepthD2 = bitDepth.ToString("D2", CultureInfo.InvariantCulture);
|
|
|
+ result.Append('.')
|
|
|
+ .Append(bitDepthD2);
|
|
|
+
|
|
|
+ return result.ToString();
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Gets an AV1 codec string.
|
|
|
/// </summary>
|