Skip to content

Commit

Permalink
Apply review
Browse files Browse the repository at this point in the history
  • Loading branch information
nyanmisaka committed Dec 3, 2021
1 parent fe7a5c6 commit 32d8dca
Showing 1 changed file with 61 additions and 87 deletions.
148 changes: 61 additions & 87 deletions MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -595,29 +595,19 @@ private string GetVaapiDeviceArgs(string renderNodePath, string kernelDriver, st
private string GetQsvDeviceArgs(string alias)
{
var arg = " -init_hw_device qsv=" + (alias ?? QsvAlias);
var args = new StringBuilder();
var isWindows = OperatingSystem.IsWindows();
var isLinux = OperatingSystem.IsLinux();
if (isLinux)
if (OperatingSystem.IsLinux())
{
// derive qsv from vaapi device
string srcAlias = VaapiAlias;
args.Append(GetVaapiDeviceArgs(null, "i915", "iHD", srcAlias))
.Append(arg + "@" + srcAlias);
return GetVaapiDeviceArgs(null, "i915", "iHD", VaapiAlias) + arg + "@" + VaapiAlias;
}
else if (isWindows)

if (OperatingSystem.IsWindows())
{
// derive qsv from d3d11va device
string srcAlias = D3d11vaAlias;
args.Append(GetD3d11vaDeviceArgs(0, "0x8086", srcAlias))
.Append(arg + "@" + srcAlias);
}
else
{
return null;
return GetD3d11vaDeviceArgs(0, "0x8086", D3d11vaAlias) + arg + "@" + D3d11vaAlias;
}

return args.ToString();
return null;
}

private string GetFilterHwDeviceArgs(string alias)
Expand Down Expand Up @@ -699,7 +689,7 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
return string.Empty;
}

var vaArgs = GetVaapiDeviceArgs(options.VaapiDevice, null, null, VaapiAlias);
args.Append(GetVaapiDeviceArgs(options.VaapiDevice, null, null, VaapiAlias));
var filterDevArgs = GetFilterHwDeviceArgs(VaapiAlias);

if (isHwTonemapAvailable && IsOpenclFullSupported())
Expand All @@ -708,24 +698,23 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
{
if (!isVaapiDecoder)
{
vaArgs += GetOpenclDeviceArgs(0, null, VaapiAlias, OpenclAlias);
args.Append(GetOpenclDeviceArgs(0, null, VaapiAlias, OpenclAlias));
filterDevArgs = GetFilterHwDeviceArgs(OpenclAlias);
}
}
else if (_mediaEncoder.IsVaapiDeviceAmd)
{
vaArgs += GetOpenclDeviceArgs(0, "Advanced Micro Devices", null, OpenclAlias);
args.Append(GetOpenclDeviceArgs(0, "Advanced Micro Devices", null, OpenclAlias));
filterDevArgs = GetFilterHwDeviceArgs(OpenclAlias);
}
else
{
vaArgs += GetOpenclDeviceArgs(0, null, null, OpenclAlias);
args.Append(GetOpenclDeviceArgs(0, null, null, OpenclAlias));
filterDevArgs = GetFilterHwDeviceArgs(OpenclAlias);
}
}

args.Append(vaArgs)
.Append(filterDevArgs);
args.Append(filterDevArgs);
}
else if (string.Equals(optHwaccelType, "qsv", StringComparison.OrdinalIgnoreCase))
{
Expand All @@ -744,24 +733,23 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
return string.Empty;
}

var qsvArgs = GetQsvDeviceArgs(QsvAlias);
args.Append(GetQsvDeviceArgs(QsvAlias));
var filterDevArgs = GetFilterHwDeviceArgs(QsvAlias);
// child device used by qsv.
if (_mediaEncoder.SupportsHwaccel("vaapi") || _mediaEncoder.SupportsHwaccel("d3d11va"))
{
if (isHwTonemapAvailable && IsOpenclFullSupported())
{
var srcAlias = isLinux ? VaapiAlias : D3d11vaAlias;
qsvArgs += GetOpenclDeviceArgs(0, null, srcAlias, OpenclAlias);
args.Append(GetOpenclDeviceArgs(0, null, srcAlias, OpenclAlias));
if (!isHwDecoder)
{
filterDevArgs = GetFilterHwDeviceArgs(OpenclAlias);
}
}
}

args.Append(qsvArgs)
.Append(filterDevArgs);
args.Append(filterDevArgs);
}
else if (string.Equals(optHwaccelType, "nvenc", StringComparison.OrdinalIgnoreCase))
{
Expand All @@ -779,16 +767,12 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
return string.Empty;
}

var cuArgs = GetCudaDeviceArgs(0, CudaAlias);
var filterDevArgs = GetFilterHwDeviceArgs(CudaAlias);
args.Append(GetCudaDeviceArgs(0, CudaAlias))
.Append(GetFilterHwDeviceArgs(CudaAlias));

// workaround for "No decoder surfaces left" error,
// but will increase vram usage. https://trac.ffmpeg.org/ticket/7562
var extraHwFramesArgs = " -extra_hw_frames 3";

args.Append(cuArgs)
.Append(filterDevArgs)
.Append(extraHwFramesArgs);
args.Append(" -extra_hw_frames 3");
}
else if (string.Equals(optHwaccelType, "amf", StringComparison.OrdinalIgnoreCase))
{
Expand All @@ -805,16 +789,15 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
}

// no dxva video processor hw filter.
var dx11Args = GetD3d11vaDeviceArgs(0, "0x1002", D3d11vaAlias);
args.Append(GetD3d11vaDeviceArgs(0, "0x1002", D3d11vaAlias));
var filterDevArgs = string.Empty;
if (IsOpenclFullSupported())
{
dx11Args += GetOpenclDeviceArgs(0, null, D3d11vaAlias, OpenclAlias);
args.Append(GetOpenclDeviceArgs(0, null, D3d11vaAlias, OpenclAlias));
filterDevArgs = GetFilterHwDeviceArgs(OpenclAlias);
}

args.Append(dx11Args)
.Append(filterDevArgs);
args.Append(filterDevArgs);
}
else if (string.Equals(optHwaccelType, "videotoolbox", StringComparison.OrdinalIgnoreCase))
{
Expand All @@ -831,8 +814,7 @@ public string GetInputVideoHwaccelArgs(EncodingJobInfo state, EncodingOptions op
}

// no videotoolbox hw filter.
var vtArgs = GetVideoToolboxDeviceArgs(VideotoolboxAlias);
args.Append(vtArgs);
args.Append(GetVideoToolboxDeviceArgs(VideotoolboxAlias));
}

if (!string.IsNullOrEmpty(vidDecoder))
Expand Down Expand Up @@ -1084,8 +1066,8 @@ public string GetTextSubtitlesFilter(EncodingJobInfo state, bool enableAlpha, bo
? string.Empty
: string.Format(CultureInfo.InvariantCulture, ",setpts=PTS -{0}/TB", seconds);

var alphaParam = enableAlpha ? (":alpha=" + Convert.ToInt32(enableAlpha)) : string.Empty;
var sub2videoParam = enableSub2video ? (":sub2video=" + Convert.ToInt32(enableSub2video)) : string.Empty;
var alphaParam = enableAlpha ? ":alpha=" + Convert.ToInt32(enableAlpha) : string.Empty;
var sub2videoParam = enableSub2video ? ":sub2video=" + Convert.ToInt32(enableSub2video) : string.Empty;

// TODO
// var fallbackFontPath = Path.Combine(_appPaths.ProgramDataPath, "fonts", "DroidSansFallback.ttf");
Expand Down Expand Up @@ -1612,14 +1594,12 @@ public string GetVideoQualityParam(EncodingJobInfo state, string videoEncoder, E
param += " -level " + level;
}
else if (string.Equals(videoEncoder, "h264_nvenc", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoEncoder, "hevc_nvenc", StringComparison.OrdinalIgnoreCase))
|| string.Equals(videoEncoder, "hevc_nvenc", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoEncoder, "hevc_vaapi", StringComparison.OrdinalIgnoreCase))
{
// level option may cause NVENC to fail.
// NVENC cannot adjust the given level, just throw an error.
}
else if (string.Equals(videoEncoder, "h264_vaapi", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoEncoder, "hevc_vaapi", StringComparison.OrdinalIgnoreCase))
{
// level option may cause corrupted frames on AMD VAAPI.
}
else if (!string.Equals(videoEncoder, "h264_omx", StringComparison.OrdinalIgnoreCase)
Expand Down Expand Up @@ -2437,7 +2417,7 @@ public MediaStream GetMediaStream(IEnumerable<MediaStream> allStream, int? desir
return string.Empty;
}

public static List<string> GetSwScaleFilter(
public static string GetSwScaleFilter(
EncodingJobInfo state,
EncodingOptions options,
string videoEncoder,
Expand Down Expand Up @@ -2548,7 +2528,7 @@ public MediaStream GetMediaStream(IEnumerable<MediaStream> allStream, int? desir
scaleVal));
}

return filters;
return filters.ToString();
}

private static string GetFixedSwScaleFilter(Video3DFormat? threedFormat, int requestedWidth, int requestedHeight)
Expand Down Expand Up @@ -2724,7 +2704,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
outFormat = "nv12";
}
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);

if (doDeintH2645)
Expand Down Expand Up @@ -2836,7 +2816,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
var outFormat = doCuTonemap ? "yuv420p10" : "yuv420p";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -3020,7 +3000,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
var outFormat = doOclTonemap ? "yuv420p10" : "yuv420p";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -3236,7 +3216,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
var outFormat = doOclTonemap ? "yuv420p10" : "yuv420p";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -3429,7 +3409,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
var outFormat = doOclTonemap ? "yuv420p10" : "yuv420p";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -3698,7 +3678,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
var outFormat = doOclTonemap ? "yuv420p10" : "nv12";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -3891,7 +3871,7 @@ public static string GetHwTonemapFilter(EncodingOptions options, string hwTonema
outFormat = doOclTonemap ? "yuv420p10" : "nv12";
var swScaleFilter = GetSwScaleFilter(state, options, vidEncoder, inW, inH, threeDFormat, reqW, reqH, reqMaxW, reqMaxH);
// sw scale
mainFilters.AddRange(swScaleFilter);
mainFilters.Add(swScaleFilter);
mainFilters.Add("format=" + outFormat);
// sw deint
if (doDeintH2645)
Expand Down Expand Up @@ -4141,10 +4121,8 @@ public string GetOverwriteColorPropertiesParam(EncodingJobInfo state, bool isTon
{
return GetInputHdrParam(state.VideoStream?.ColorTransfer);
}
else
{
return GetOutputSdrParam(null);
}

return GetOutputSdrParam(null);
}

public string GetInputHdrParam(string colorTransfer)
Expand All @@ -4154,11 +4132,9 @@ public string GetInputHdrParam(string colorTransfer)
// HLG
return "setparams=color_primaries=bt2020:color_trc=arib-std-b67:colorspace=bt2020nc";
}
else
{
// HDR10
return "setparams=color_primaries=bt2020:color_trc=smpte2084:colorspace=bt2020nc";
}

// HDR10
return "setparams=color_primaries=bt2020:color_trc=smpte2084:colorspace=bt2020nc";
}

public string GetOutputSdrParam(string tonemappingRange)
Expand Down Expand Up @@ -4241,10 +4217,11 @@ protected string GetHardwareVideoDecoder(EncodingJobInfo state, EncodingOptions
var bitDepth = GetVideoColorBitDepth(state);

// Only HEVC, VP9 and AV1 formats have 10-bit hardware decoder support now.
if (bitDepth == 10 && !(string.Equals(videoStream.Codec, "hevc", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "h265", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "vp9", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "av1", StringComparison.OrdinalIgnoreCase)))
if (bitDepth == 10
&& !(string.Equals(videoStream.Codec, "hevc", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "h265", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "vp9", StringComparison.OrdinalIgnoreCase)
|| string.Equals(videoStream.Codec, "av1", StringComparison.OrdinalIgnoreCase)))
{
return null;
}
Expand Down Expand Up @@ -4280,19 +4257,18 @@ protected string GetHardwareVideoDecoder(EncodingJobInfo state, EncodingOptions
}
}

var whichCodec = videoStream.Codec?.ToLowerInvariant();
switch (whichCodec)
var whichCodec = videoStream.Codec;
if (string.Equals(whichCodec, "avc", StringComparison.OrdinalIgnoreCase))
{
case "avc":
whichCodec = "h264";
break;
case "h265":
whichCodec = "hevc";
break;
whichCodec = "h264";
}
else if (string.Equals(whichCodec, "h265", StringComparison.OrdinalIgnoreCase))
{
whichCodec = "hevc";
}

// Avoid a second attempt if no hardware acceleration is being used
options.HardwareDecodingCodecs = options.HardwareDecodingCodecs.Where(val => val != whichCodec).ToArray();
options.HardwareDecodingCodecs = Array.FindAll(options.HardwareDecodingCodecs, val => !string.Equals(val, whichCodec, StringComparison.OrdinalIgnoreCase));

// leave blank so ffmpeg will decide
return null;
Expand Down Expand Up @@ -4412,20 +4388,18 @@ public string GetHwaccelType(EncodingJobInfo state, EncodingOptions options, str
}

// Vaapi
if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase))
if (string.Equals(options.HardwareAccelerationType, "vaapi", StringComparison.OrdinalIgnoreCase)
&& isVaapiSupported
&& isCodecAvailable)
{
if (isVaapiSupported && isCodecAvailable)
{
return " -hwaccel vaapi" + (outputHwSurface ? " -hwaccel_output_format vaapi" : string.Empty);
}
return " -hwaccel vaapi" + (outputHwSurface ? " -hwaccel_output_format vaapi" : string.Empty);
}

if (string.Equals(options.HardwareAccelerationType, "videotoolbox", StringComparison.OrdinalIgnoreCase))
if (string.Equals(options.HardwareAccelerationType, "videotoolbox", StringComparison.OrdinalIgnoreCase)
&& isVideotoolboxSupported
&& isCodecAvailable)
{
if (isVideotoolboxSupported && isCodecAvailable)
{
return " -hwaccel videotoolbox" + (outputHwSurface ? " -hwaccel_output_format videotoolbox_vld" : string.Empty);
}
return " -hwaccel videotoolbox" + (outputHwSurface ? " -hwaccel_output_format videotoolbox_vld" : string.Empty);
}

return null;
Expand Down

0 comments on commit 32d8dca

Please sign in to comment.