Browse Source

Backport pull request #9485 from jellyfin/release-10.8.z

Fix the bitrate scale factor for h264-to-hevc transcoding

Original-merge: 173a963dbf6072897b1086abf3f378ddfa7fda5a

Merged-by: Nyanmisaka <nst799610810@gmail.com>

Backported-by: crobibero <cody@robibe.ro>
Shadowghost 2 years ago
parent
commit
21dc3fa042
1 changed files with 11 additions and 3 deletions
  1. 11 3
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

+ 11 - 3
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -2116,14 +2116,20 @@ namespace MediaBrowser.Controller.MediaEncoding
 
 
         private static double GetVideoBitrateScaleFactor(string codec)
         private static double GetVideoBitrateScaleFactor(string codec)
         {
         {
+            // hevc & vp9 - 40% more efficient than h.264
             if (string.Equals(codec, "h265", StringComparison.OrdinalIgnoreCase)
             if (string.Equals(codec, "h265", StringComparison.OrdinalIgnoreCase)
                 || string.Equals(codec, "hevc", StringComparison.OrdinalIgnoreCase)
                 || string.Equals(codec, "hevc", StringComparison.OrdinalIgnoreCase)
-                || string.Equals(codec, "vp9", StringComparison.OrdinalIgnoreCase)
-                || string.Equals(codec, "av1", StringComparison.OrdinalIgnoreCase))
+                || string.Equals(codec, "vp9", StringComparison.OrdinalIgnoreCase))
             {
             {
                 return .6;
                 return .6;
             }
             }
 
 
+            // av1 - 50% more efficient than h.264
+            if (string.Equals(codec, "av1", StringComparison.OrdinalIgnoreCase))
+            {
+                return .5;
+            }
+
             return 1;
             return 1;
         }
         }
 
 
@@ -2131,7 +2137,9 @@ namespace MediaBrowser.Controller.MediaEncoding
         {
         {
             var inputScaleFactor = GetVideoBitrateScaleFactor(inputVideoCodec);
             var inputScaleFactor = GetVideoBitrateScaleFactor(inputVideoCodec);
             var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
             var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
-            var scaleFactor = outputScaleFactor / inputScaleFactor;
+
+            // Don't scale the real bitrate lower than the requested bitrate
+            var scaleFactor = Math.Min(outputScaleFactor / inputScaleFactor, 1);
 
 
             if (bitrate <= 500000)
             if (bitrate <= 500000)
             {
             {