Переглянути джерело

Fix transcode bitrate control

JMCC 6 роки тому
батько
коміт
012e4a3e63
1 змінених файлів з 36 додано та 13 видалено
  1. 36 13
      MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

+ 36 - 13
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -1083,27 +1083,50 @@ namespace MediaBrowser.Controller.MediaEncoding
         {
             var bitrate = request.VideoBitRate;
 
-            // If specific values were requested, then force the caller to supply a bitrate as well
-            if (request.Height.HasValue && request.Width.HasValue)
-            {
-                return bitrate;
-            }
-
             if (videoStream != null)
             {
-                if (bitrate.HasValue)
-                {
-                    var inputVideoCodec = videoStream.Codec;
-                    bitrate = ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
+                var isUpscaling = request.Height.HasValue && videoStream.Height.HasValue &&
+                                   request.Height.Value > videoStream.Height.Value && request.Width.HasValue && videoStream.Width.HasValue &&
+                    request.Width.Value > videoStream.Width.Value;
 
-                    // If a max bitrate was requested, don't let the scaled bitrate exceed it
-                    if (request.VideoBitRate.HasValue)
+                // Don't allow bitrate increases unless upscaling
+                if (!isUpscaling)
+                {
+                    if (bitrate.HasValue && videoStream.BitRate.HasValue)
                     {
-                        bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value);
+                        bitrate = GetMinBitrate(videoStream.BitRate.Value, bitrate.Value);
                     }
                 }
             }
 
+            if (bitrate.HasValue)
+            {
+                var inputVideoCodec = videoStream.Codec;
+                bitrate = ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
+
+                // If a max bitrate was requested, don't let the scaled bitrate exceed it
+                if (request.VideoBitRate.HasValue)
+                {
+                    bitrate = Math.Min(bitrate.Value, request.VideoBitRate.Value);
+                }
+            }
+
+            return bitrate;
+        }
+
+        private int GetMinBitrate(int sourceBitrate, int requestedBitrate)
+        {
+            if (sourceBitrate <= 2000000)
+            {
+                sourceBitrate = Convert.ToInt32(sourceBitrate * 2.5);
+            }
+            else if (sourceBitrate <= 3000000)
+            {
+                sourceBitrate = Convert.ToInt32(sourceBitrate * 2);
+            }
+
+            var bitrate = Math.Min(sourceBitrate, requestedBitrate);
+
             return bitrate;
         }