Browse Source

adjust bitrate in h264/h265 conversions

Luke Pulverenti 9 years ago
parent
commit
faefbf36cc

+ 8 - 2
MediaBrowser.Api/Playback/BaseStreamingService.cs

@@ -1207,7 +1207,7 @@ namespace MediaBrowser.Api.Playback
             }
         }
 
-        private int? GetVideoBitrateParamValue(VideoStreamRequest request, MediaStream videoStream)
+        private int? GetVideoBitrateParamValue(VideoStreamRequest request, MediaStream videoStream, string outputVideoCodec)
         {
             var bitrate = request.VideoBitRate;
 
@@ -1232,6 +1232,12 @@ namespace MediaBrowser.Api.Playback
                 }
             }
 
+            if (bitrate.HasValue)
+            {
+                var inputVideoCodec = videoStream == null ? null : videoStream.Codec;
+                bitrate = ResolutionNormalizer.ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
+            }
+
             return bitrate;
         }
 
@@ -1692,7 +1698,7 @@ namespace MediaBrowser.Api.Playback
             if (videoRequest != null)
             {
                 state.OutputVideoCodec = state.VideoRequest.VideoCodec;
-                state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream);
+                state.OutputVideoBitrate = GetVideoBitrateParamValue(state.VideoRequest, state.VideoStream, state.OutputVideoCodec);
 
                 if (state.OutputVideoBitrate.HasValue)
                 {

+ 1 - 1
MediaBrowser.Api/Subtitles/SubtitleService.cs

@@ -221,7 +221,7 @@ namespace MediaBrowser.Api.Subtitles
 
                     if (string.Equals(request.Format, "vtt", StringComparison.OrdinalIgnoreCase) && request.AddVttTimeMap)
                     {
-                        text = text.Replace("WEBVTT", "WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000");
+                        //text = text.Replace("WEBVTT", "WEBVTT\nX-TIMESTAMP-MAP=MPEGTS:900000,LOCAL:00:00:00.000");
                     }
 
                     return ResultFactory.GetResult(text, MimeTypes.GetMimeType("file." + request.Format));

+ 8 - 2
MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs

@@ -99,7 +99,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             if (videoRequest != null)
             {
                 state.OutputVideoCodec = state.Options.VideoCodec;
-                state.OutputVideoBitrate = GetVideoBitrateParamValue(state.Options, state.VideoStream);
+                state.OutputVideoBitrate = GetVideoBitrateParamValue(state.Options, state.VideoStream, state.OutputVideoCodec);
 
                 if (state.OutputVideoBitrate.HasValue)
                 {
@@ -396,7 +396,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
             return request.AudioChannels;
         }
 
-        private int? GetVideoBitrateParamValue(EncodingJobOptions request, MediaStream videoStream)
+        private int? GetVideoBitrateParamValue(EncodingJobOptions request, MediaStream videoStream, string outputVideoCodec)
         {
             var bitrate = request.VideoBitRate;
 
@@ -421,6 +421,12 @@ namespace MediaBrowser.MediaEncoding.Encoder
                 }
             }
 
+            if (bitrate.HasValue)
+            {
+                var inputVideoCodec = videoStream == null ? null : videoStream.Codec;
+                bitrate = ResolutionNormalizer.ScaleBitrate(bitrate.Value, inputVideoCodec, outputVideoCodec);
+            }
+
             return bitrate;
         }
 

+ 20 - 0
MediaBrowser.Model/Dlna/ResolutionNormalizer.cs

@@ -56,5 +56,25 @@ namespace MediaBrowser.Model.Dlna
                 MaxHeight = maxHeight
             };
         }
+
+        private static double GetVideoBitrateScaleFactor(string codec)
+        {
+            if (string.Equals(codec, "h265", StringComparison.OrdinalIgnoreCase) ||
+                string.Equals(codec, "hevc", StringComparison.OrdinalIgnoreCase))
+            {
+                return .5;
+            }
+            return 1;
+        }
+
+        public static int ScaleBitrate(int bitrate, string inputVideoCodec, string outputVideoCodec)
+        {
+            var inputScaleFactor = GetVideoBitrateScaleFactor(inputVideoCodec);
+            var outputScaleFactor = GetVideoBitrateScaleFactor(outputVideoCodec);
+            var scaleFactor = outputScaleFactor/inputScaleFactor;
+            var newBitrate = scaleFactor*bitrate;
+
+            return Convert.ToInt32(newBitrate);
+        }
     }
 }