@ -182,6 +182,68 @@ public static class HlsCodecStringHelpers
return result . ToString ( ) ;
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>
/// <summary>
/// Gets an AV1 codec string.
/// Gets an AV1 codec string.
/// </summary>
/// </summary>