diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 0fe1e533d4..d64c009a07 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -879,7 +879,7 @@ namespace MediaBrowser.Api.Playback.Hls // Add resolution params, if specified if (!hasGraphicalSubs) { - args += EncodingHelper.GetOutputSizeParam(state, codec, EnableCopyTs(state)); + args += EncodingHelper.GetOutputSizeParam(state, codec, true); } // This is for internal graphical subs @@ -891,7 +891,7 @@ namespace MediaBrowser.Api.Playback.Hls //args += " -flags -global_header"; } - if (EnableCopyTs(state) && args.IndexOf("-copyts", StringComparison.OrdinalIgnoreCase) == -1) + if (args.IndexOf("-copyts", StringComparison.OrdinalIgnoreCase) == -1) { args += " -copyts"; } @@ -901,13 +901,9 @@ namespace MediaBrowser.Api.Playback.Hls args += " -vsync " + state.OutputVideoSync; } - return args; - } + args += EncodingHelper.GetOutputFFlags(state); - private bool EnableCopyTs(StreamState state) - { - //return state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream && state.VideoRequest.SubtitleMethod == SubtitleDeliveryMethod.Encode; - return true; + return args; } protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding) diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index 22c6202e4f..e32970be53 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -124,6 +124,8 @@ namespace MediaBrowser.Api.Playback.Hls args += " -vsync " + state.OutputVideoSync; } + args += EncodingHelper.GetOutputFFlags(state); + return args; } diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs index ca0b97a9f6..11311905c2 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs @@ -1306,7 +1306,8 @@ namespace MediaBrowser.Controller.MediaEncoding filters.Add("format=nv12|vaapi"); filters.Add("hwupload"); } - else if (state.DeInterlace && !string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) + + if (state.DeInterlace && !string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) { filters.Add("yadif=0:-1:0"); } @@ -1533,14 +1534,26 @@ namespace MediaBrowser.Controller.MediaEncoding } var flags = new List(); - if (state.IgnoreDts) + if (state.IgnoreInputDts) { flags.Add("+igndts"); } - if (state.IgnoreIndex) + if (state.IgnoreInputIndex) { flags.Add("+ignidx"); } + if (state.GenPtsInput) + { + flags.Add("+genpts"); + } + if (state.DiscardCorruptFramesInput) + { + flags.Add("+discardcorrupt"); + } + if (state.EnableFastSeekInput) + { + flags.Add("+fastseek"); + } if (flags.Count > 0) { @@ -1864,6 +1877,22 @@ namespace MediaBrowser.Controller.MediaEncoding ).Trim(); } + public string GetOutputFFlags(EncodingJobInfo state) + { + var flags = new List(); + if (state.GenPtsOutput) + { + flags.Add("+genpts"); + } + + if (flags.Count > 0) + { + return " -fflags " + string.Join("", flags.ToArray()); + } + + return string.Empty; + } + public string GetProgressiveVideoArguments(EncodingJobInfo state, EncodingOptions encodingOptions, string videoCodec, string defaultH264Preset) { var args = "-codec:v:0 " + videoCodec; @@ -1943,6 +1972,8 @@ namespace MediaBrowser.Controller.MediaEncoding args += " -vsync " + state.OutputVideoSync; } + args += GetOutputFFlags(state); + return args; } diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs index 28ada9daeb..409dec482c 100644 --- a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs +++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs @@ -39,14 +39,52 @@ namespace MediaBrowser.Controller.MediaEncoding public bool ReadInputAtNativeFramerate { get; set; } - public bool IgnoreDts + public bool IgnoreInputDts { - get { return MediaSource.IgnoreDts; } + get + { + return MediaSource.IgnoreDts; + } } - public bool IgnoreIndex + public bool IgnoreInputIndex { - get { return MediaSource.IgnoreIndex; } + get + { + return MediaSource.IgnoreIndex; + } + } + + public bool GenPtsInput + { + get + { + return false; + } + } + + public bool DiscardCorruptFramesInput + { + get + { + return false; + } + } + + public bool EnableFastSeekInput + { + get + { + return false; + } + } + + public bool GenPtsOutput + { + get + { + return false; + } } public string OutputContainer { get; set; }