mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-31 10:37:22 -04:00 
			
		
		
		
	Merge pull request #2099 from cryptobank/master
Fix VAAPI encoding on 10-bit hevc. Update QSV encoding and scaling to...
This commit is contained in:
		
						commit
						61b9845e0f
					
				| @ -949,7 +949,17 @@ namespace MediaBrowser.Api.Playback.Hls | |||||||
| 
 | 
 | ||||||
|                 var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode; |                 var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode; | ||||||
| 
 | 
 | ||||||
|                 args += " " + EncodingHelper.GetVideoQualityParam(state, codec, encodingOptions, GetDefaultEncoderPreset()) + keyFrameArg; |                 args += " " + EncodingHelper.GetVideoQualityParam(state, codec, encodingOptions, GetDefaultEncoderPreset()); | ||||||
|  | 
 | ||||||
|  |                 // Unable to force key frames to h264_qsv transcode | ||||||
|  |                 if (string.Equals(codec, "h264_qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     Logger.LogInformation("Bug Workaround: Disabling force_key_frames for h264_qsv");  | ||||||
|  |                 }  | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     args += " " + keyFrameArg; | ||||||
|  |                 }  | ||||||
| 
 | 
 | ||||||
|                 //args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0"; |                 //args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb=0:weightp=0"; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -467,6 +467,27 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|                     .Append(' '); |                     .Append(' '); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             if (state.IsVideoRequest  | ||||||
|  |                 && string.Equals(encodingOptions.HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |             { | ||||||
|  |                 var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, encodingOptions); | ||||||
|  |                 var outputVideoCodec = GetVideoEncoder(state, encodingOptions); | ||||||
|  | 
 | ||||||
|  |                 if (encodingOptions.EnableHardwareEncoding && outputVideoCodec.Contains("qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     if (!string.IsNullOrEmpty(videoDecoder) && videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                     { | ||||||
|  |                         arg.Append("-hwaccel qsv "); | ||||||
|  |                     }  | ||||||
|  |                     else  | ||||||
|  |                     { | ||||||
|  |                         arg.Append("-init_hw_device qsv=hw -filter_hw_device hw "); | ||||||
|  |                     }	 | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 arg.Append(videoDecoder + " "); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             arg.Append("-i ") |             arg.Append("-i ") | ||||||
|                 .Append(GetInputPathArgument(state)); |                 .Append(GetInputPathArgument(state)); | ||||||
| 
 | 
 | ||||||
| @ -1562,6 +1583,7 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
| 
 | 
 | ||||||
|             var videoSizeParam = string.Empty; |             var videoSizeParam = string.Empty; | ||||||
| 
 | 
 | ||||||
|  |             // Setup subtitle scaling | ||||||
|             if (state.VideoStream != null && state.VideoStream.Width.HasValue && state.VideoStream.Height.HasValue) |             if (state.VideoStream != null && state.VideoStream.Width.HasValue && state.VideoStream.Height.HasValue) | ||||||
|             { |             { | ||||||
|                 videoSizeParam = string.Format( |                 videoSizeParam = string.Format( | ||||||
| @ -1570,7 +1592,11 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|                     state.VideoStream.Width.Value, |                     state.VideoStream.Width.Value, | ||||||
|                     state.VideoStream.Height.Value); |                     state.VideoStream.Height.Value); | ||||||
| 
 | 
 | ||||||
|                 videoSizeParam += ":force_original_aspect_ratio=decrease"; |                 //For QSV, feed it into hardware encoder now | ||||||
|  |                 if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     videoSizeParam += ",hwupload=extra_hw_frames=64"; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var mapPrefix = state.SubtitleStream.IsExternal ? |             var mapPrefix = state.SubtitleStream.IsExternal ? | ||||||
| @ -1581,9 +1607,31 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|                 ? 0 |                 ? 0 | ||||||
|                 : state.SubtitleStream.Index; |                 : state.SubtitleStream.Index; | ||||||
| 
 | 
 | ||||||
|  |             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, options); | ||||||
|  | 
 | ||||||
|  |             // Setup default filtergraph utilizing FFMpeg overlay() and FFMpeg scale() (see the return of this function for index reference) | ||||||
|  |             var retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay{3}\""; | ||||||
|  | 
 | ||||||
|  |             if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase))  | ||||||
|  |             { | ||||||
|  |                 /* | ||||||
|  |                     QSV in FFMpeg can now setup hardware overlay for transcodes. | ||||||
|  |                     For software decoding and hardware encoding option, frames must be hwuploaded into hardware | ||||||
|  |                     with fixed frame size.  | ||||||
|  |                 */ | ||||||
|  |                 if (!string.IsNullOrEmpty(videoDecoder) && videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay_qsv=x=(W-w)/2:y=(H-h)/2{3}\""; | ||||||
|  |                 }  | ||||||
|  |                 else  | ||||||
|  |                 { | ||||||
|  |                     retStr = " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}]hwupload=extra_hw_frames=64[v];[v][sub]overlay_qsv=x=(W-w)/2:y=(H-h)/2{3}\""; | ||||||
|  |                 } | ||||||
|  |             }  | ||||||
|  | 
 | ||||||
|             return string.Format( |             return string.Format( | ||||||
|                 CultureInfo.InvariantCulture, |                 CultureInfo.InvariantCulture, | ||||||
|                 " -filter_complex \"[{0}:{1}]{4}[sub];[0:{2}][sub]overlay{3}\"", |                 retStr, | ||||||
|                 mapPrefix, |                 mapPrefix, | ||||||
|                 subtitleStreamIndex, |                 subtitleStreamIndex, | ||||||
|                 state.VideoStream.Index, |                 state.VideoStream.Index, | ||||||
| @ -1647,31 +1695,34 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|                 requestedMaxWidth, |                 requestedMaxWidth, | ||||||
|                 requestedMaxHeight); |                 requestedMaxHeight); | ||||||
| 
 | 
 | ||||||
|             if (string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase) |             if ((string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase) || string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|                 && width.HasValue |                 && width.HasValue | ||||||
|                 && height.HasValue) |                 && height.HasValue) | ||||||
|             { |             { | ||||||
|                 // Work around vaapi's reduced scaling features |  | ||||||
|                 var scaler = "scale_vaapi"; |  | ||||||
| 
 |  | ||||||
|                 // Given the input dimensions (inputWidth, inputHeight), determine the output dimensions |                 // Given the input dimensions (inputWidth, inputHeight), determine the output dimensions | ||||||
|                 // (outputWidth, outputHeight). The user may request precise output dimensions or maximum |                 // (outputWidth, outputHeight). The user may request precise output dimensions or maximum | ||||||
|                 // output dimensions. Output dimensions are guaranteed to be even. |                 // output dimensions. Output dimensions are guaranteed to be even. | ||||||
|                 var outputWidth = width.Value; |                 var outputWidth = width.Value; | ||||||
|                 var outputHeight = height.Value; |                 var outputHeight = height.Value; | ||||||
|  |                 var vaapi_or_qsv = string.Equals(videoEncoder, "h264_qsv", StringComparison.OrdinalIgnoreCase) ? "qsv" : "vaapi"; | ||||||
| 
 | 
 | ||||||
|                 if (!videoWidth.HasValue |                 if (!videoWidth.HasValue | ||||||
|                     || outputWidth != videoWidth.Value |                     || outputWidth != videoWidth.Value | ||||||
|                     || !videoHeight.HasValue |                     || !videoHeight.HasValue | ||||||
|                     || outputHeight != videoHeight.Value) |                     || outputHeight != videoHeight.Value) | ||||||
|                 { |                 { | ||||||
|  |                     // Force nv12 pixel format to enable 10-bit to 8-bit colour conversion. | ||||||
|                     filters.Add( |                     filters.Add( | ||||||
|                         string.Format( |                         string.Format( | ||||||
|                             CultureInfo.InvariantCulture, |                             CultureInfo.InvariantCulture, | ||||||
|                             "{0}=w={1}:h={2}", |                             "scale_{0}=w={1}:h={2}:format=nv12", | ||||||
|                             scaler, |                             vaapi_or_qsv, | ||||||
|                             outputWidth, |                             outputWidth, | ||||||
|                             outputHeight)); |                             outputHeight)); | ||||||
|  |                 }  | ||||||
|  |                 else  | ||||||
|  |                 { | ||||||
|  |                     filters.Add(string.Format(CultureInfo.InvariantCulture, "scale_{0}=format=nv12", vaapi_or_qsv)); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             else if ((videoDecoder ?? string.Empty).IndexOf("_cuvid", StringComparison.OrdinalIgnoreCase) != -1 |             else if ((videoDecoder ?? string.Empty).IndexOf("_cuvid", StringComparison.OrdinalIgnoreCase) != -1 | ||||||
| @ -1914,10 +1965,26 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|                 filters.Add("hwupload"); |                 filters.Add("hwupload"); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if (state.DeInterlace("h264", true) |             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, options); | ||||||
|                 && string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) | 
 | ||||||
|  |             // If we are software decoding, and hardware encoding	   | ||||||
|  |             if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)  | ||||||
|  |                 && (string.IsNullOrEmpty(videoDecoder) || !videoDecoder.Contains("qsv", StringComparison.OrdinalIgnoreCase))) | ||||||
|             { |             { | ||||||
|                 filters.Add(string.Format(CultureInfo.InvariantCulture, "deinterlace_vaapi")); |                 filters.Add("format=nv12|qsv"); | ||||||
|  |                 filters.Add("hwupload=extra_hw_frames=64"); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (state.DeInterlace("h264", true)) | ||||||
|  |             { | ||||||
|  |                 if (string.Equals(outputVideoCodec, "h264_vaapi", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     filters.Add(string.Format(CultureInfo.InvariantCulture, "deinterlace_vaapi")); | ||||||
|  |                 } | ||||||
|  |                 else if (string.Equals(outputVideoCodec, "h264_qsv", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     filters.Add(string.Format(CultureInfo.InvariantCulture, "deinterlace_qsv")); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if ((state.DeInterlace("h264", true) || state.DeInterlace("h265", true) || state.DeInterlace("hevc", true)) |             if ((state.DeInterlace("h264", true) || state.DeInterlace("h265", true) || state.DeInterlace("hevc", true)) | ||||||
| @ -1940,8 +2007,6 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|             var inputHeight = videoStream?.Height; |             var inputHeight = videoStream?.Height; | ||||||
|             var threeDFormat = state.MediaSource.Video3DFormat; |             var threeDFormat = state.MediaSource.Video3DFormat; | ||||||
| 
 | 
 | ||||||
|             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, options); |  | ||||||
| 
 |  | ||||||
|             filters.AddRange(GetScalingFilters(inputWidth, inputHeight, threeDFormat, videoDecoder, outputVideoCodec, request.Width, request.Height, request.MaxWidth, request.MaxHeight)); |             filters.AddRange(GetScalingFilters(inputWidth, inputHeight, threeDFormat, videoDecoder, outputVideoCodec, request.Width, request.Height, request.MaxWidth, request.MaxHeight)); | ||||||
| 
 | 
 | ||||||
|             var output = string.Empty; |             var output = string.Empty; | ||||||
| @ -2134,6 +2199,7 @@ namespace MediaBrowser.Controller.MediaEncoding | |||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, encodingOptions); |             var videoDecoder = GetHardwareAcceleratedVideoDecoder(state, encodingOptions); | ||||||
|  | 
 | ||||||
|             if (!string.IsNullOrEmpty(videoDecoder)) |             if (!string.IsNullOrEmpty(videoDecoder)) | ||||||
|             { |             { | ||||||
|                 inputModifier += " " + videoDecoder; |                 inputModifier += " " + videoDecoder; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user