Enable mjpeg_videotoolbox for trickplay

Signed-off-by: gnattu <gnattuoc@me.com>
gnattu 4 weeks ago
parent d318010c67
commit 9368b866dd

@ -118,7 +118,8 @@ namespace MediaBrowser.Controller.MediaEncoding
private static readonly Dictionary<string, string> _mjpegCodecMap = new(StringComparer.OrdinalIgnoreCase)
{
{ "vaapi", _defaultMjpegEncoder + "_vaapi" },
{ "qsv", _defaultMjpegEncoder + "_qsv" }
{ "qsv", _defaultMjpegEncoder + "_qsv" },
{ "videotoolbox", _defaultMjpegEncoder + "_videotoolbox" }
};
public static readonly string[] LosslessAudioCodecs = new string[]

@ -94,6 +94,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
"h264_v4l2m2m",
"h264_videotoolbox",
"hevc_videotoolbox",
"mjpeg_videotoolbox",
"h264_rkmpp",
"hevc_rkmpp"
};

@ -871,6 +871,16 @@ namespace MediaBrowser.MediaEncoding.Encoder
throw new InvalidOperationException("Empty or invalid input argument.");
}
var encoderQuality = qualityScale;
if (vidEncoder.Contains("videotoolbox", StringComparison.InvariantCultureIgnoreCase))
{
// videotoolbox's mjpeg encoder uses jpeg quality instead of ffmpeg defined qscale
// ffmpeg qscale is a value from 1-31, with 1 being best quality and 31 being worst
// jpeg quality is a value from 0-100, with 0 being worst quality and 100 being best
// This mapping is just an estimation, with bias towards higher quality
encoderQuality = 100 - ((qualityScale - 1) * 3);
}
// Output arguments
var targetDirectory = Path.Combine(_configurationManager.ApplicationPaths.TempDirectory, Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(targetDirectory);
@ -879,12 +889,13 @@ namespace MediaBrowser.MediaEncoding.Encoder
// Final command arguments
var args = string.Format(
CultureInfo.InvariantCulture,
"-loglevel error {0} -an -sn {1} -threads {2} -c:v {3} {4}-f {5} \"{6}\"",
"-loglevel error {0} -an -sn {1} -threads {2} -c:v {3} {4}{5}-f {6} \"{7}\"",
inputArg,
filterParam,
outputThreads.GetValueOrDefault(_threads),
vidEncoder,
qualityScale.HasValue ? "-qscale:v " + qualityScale.Value.ToString(CultureInfo.InvariantCulture) + " " : string.Empty,
qualityScale.HasValue ? "-qscale:v " + encoderQuality.Value.ToString(CultureInfo.InvariantCulture) + " " : string.Empty,
vidEncoder.Contains("videotoolbox", StringComparison.InvariantCultureIgnoreCase) ? "-allow_sw 1 " : string.Empty, // allow_sw fallback for some intel macs
"image2",
outputPath);

Loading…
Cancel
Save