|
@@ -296,14 +296,12 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|
|
if (state.VideoStream is null
|
|
|
|| !options.EnableTonemapping
|
|
|
|| GetVideoColorBitDepth(state) != 10
|
|
|
- || !_mediaEncoder.SupportsFilter("tonemapx")
|
|
|
- || !(string.Equals(state.VideoStream?.ColorTransfer, "smpte2084", StringComparison.OrdinalIgnoreCase) || string.Equals(state.VideoStream?.ColorTransfer, "arib-std-b67", StringComparison.OrdinalIgnoreCase)))
|
|
|
+ || !_mediaEncoder.SupportsFilter("tonemapx"))
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- return state.VideoStream.VideoRange == VideoRange.HDR
|
|
|
- && state.VideoStream.VideoRangeType is VideoRangeType.HDR10 or VideoRangeType.HLG or VideoRangeType.DOVIWithHDR10 or VideoRangeType.DOVIWithHLG;
|
|
|
+ return state.VideoStream.VideoRange == VideoRange.HDR;
|
|
|
}
|
|
|
|
|
|
private bool IsHwTonemapAvailable(EncodingJobInfo state, EncodingOptions options)
|
|
@@ -3435,6 +3433,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|
|
var doDeintHevc = state.DeInterlace("h265", true) || state.DeInterlace("hevc", true);
|
|
|
var doDeintH2645 = doDeintH264 || doDeintHevc;
|
|
|
var doToneMap = IsSwTonemapAvailable(state, options);
|
|
|
+ var requireDoviReshaping = doToneMap && state.VideoStream.VideoRangeType == VideoRangeType.DOVI;
|
|
|
|
|
|
var hasSubs = state.SubtitleStream is not null && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode;
|
|
|
var hasTextSubs = hasSubs && state.SubtitleStream.IsTextSubtitleStream;
|
|
@@ -3472,11 +3471,13 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|
|
// sw scale
|
|
|
mainFilters.Add(swScaleFilter);
|
|
|
|
|
|
- // sw tonemap <= TODO: finish dovi tone mapping
|
|
|
-
|
|
|
+ // sw tonemap
|
|
|
if (doToneMap)
|
|
|
{
|
|
|
- var tonemapArgs = $"tonemapx=tonemap={options.TonemappingAlgorithm}:desat={options.TonemappingDesat}:peak={options.TonemappingPeak}:t=bt709:m=bt709:p=bt709:format={outFormat}";
|
|
|
+ // tonemapx requires yuv420p10 input for dovi reshaping, let ffmpeg convert the frame when necessary
|
|
|
+ var tonemapFormat = requireDoviReshaping ? "yuv420p" : outFormat;
|
|
|
+
|
|
|
+ var tonemapArgs = $"tonemapx=tonemap={options.TonemappingAlgorithm}:desat={options.TonemappingDesat}:peak={options.TonemappingPeak}:t=bt709:m=bt709:p=bt709:format={tonemapFormat}";
|
|
|
|
|
|
if (options.TonemappingParam != 0)
|
|
|
{
|
|
@@ -3490,6 +3491,13 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|
|
}
|
|
|
|
|
|
mainFilters.Add(tonemapArgs);
|
|
|
+
|
|
|
+ // convert back to nv12 for VAAPI encoders
|
|
|
+ // Q: Is this still being used?
|
|
|
+ if (requireDoviReshaping && isVaapiEncoder)
|
|
|
+ {
|
|
|
+ mainFilters.Add("format=" + outFormat);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|