aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.MediaEncoding/Encoder
diff options
context:
space:
mode:
authorNyanmisaka <nst799610810@gmail.com>2024-09-09 23:24:45 +0800
committerGitHub <noreply@github.com>2024-09-09 09:24:45 -0600
commit36d934f4c0df7abf5e0ab5a8d141c68f1a61b7b0 (patch)
treea83231648c23ae8680031d5ac1ac777d8482784e /MediaBrowser.MediaEncoding/Encoder
parent0d85af019c6ebc855ab2d8e689abe72b995225b4 (diff)
Enable Rockchip MJPEG encoder for Trickplay (#12610)
Diffstat (limited to 'MediaBrowser.MediaEncoding/Encoder')
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs3
-rw-r--r--MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs29
2 files changed, 21 insertions, 11 deletions
diff --git a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
index 2b6ed8fa0..73585caeb 100644
--- a/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs
@@ -93,7 +93,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
"hevc_videotoolbox",
"mjpeg_videotoolbox",
"h264_rkmpp",
- "hevc_rkmpp"
+ "hevc_rkmpp",
+ "mjpeg_rkmpp"
};
private static readonly string[] _requiredFilters = new[]
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index caa9cb499..6f8769252 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -896,21 +896,30 @@ namespace MediaBrowser.MediaEncoding.Encoder
throw new InvalidOperationException("Empty or invalid input argument.");
}
- float? encoderQuality = qualityScale;
- if (vidEncoder.Contains("vaapi", StringComparison.OrdinalIgnoreCase))
+ // 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
+ var encoderQuality = Math.Clamp(qualityScale ?? 4, 1, 31);
+ var encoderQualityOption = "-qscale:v ";
+
+ if (vidEncoder.Contains("vaapi", StringComparison.OrdinalIgnoreCase)
+ || vidEncoder.Contains("qsv", StringComparison.OrdinalIgnoreCase))
{
- // vaapi's mjpeg encoder uses jpeg quality divided by QP2LAMBDA (118) as input, 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
- encoderQuality = (100 - ((qualityScale - 1) * (100 / 30))) / 118;
+ // vaapi and qsv's mjpeg encoder use jpeg quality as input, instead of ffmpeg defined qscale
+ encoderQuality = 100 - ((encoderQuality - 1) * (100 / 30));
+ encoderQualityOption = "-global_quality:v ";
}
if (vidEncoder.Contains("videotoolbox", StringComparison.OrdinalIgnoreCase))
{
// videotoolbox's mjpeg encoder uses jpeg quality scaled to QP2LAMBDA (118) 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
- encoderQuality = 118 - ((qualityScale - 1) * (118 / 30));
+ encoderQuality = 118 - ((encoderQuality - 1) * (118 / 30));
+ }
+
+ if (vidEncoder.Contains("rkmpp", StringComparison.OrdinalIgnoreCase))
+ {
+ // rkmpp's mjpeg encoder uses jpeg quality as input (max is 99, not 100), instead of ffmpeg defined qscale
+ encoderQuality = 99 - ((encoderQuality - 1) * (99 / 30));
+ encoderQualityOption = "-qp_init:v ";
}
// Output arguments
@@ -926,7 +935,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
filterParam,
outputThreads.GetValueOrDefault(_threads),
vidEncoder,
- qualityScale.HasValue ? "-qscale:v " + encoderQuality.Value.ToString(CultureInfo.InvariantCulture) + " " : string.Empty,
+ encoderQualityOption + encoderQuality + " ",
vidEncoder.Contains("videotoolbox", StringComparison.InvariantCultureIgnoreCase) ? "-allow_sw 1 " : string.Empty, // allow_sw fallback for some intel macs
"image2",
outputPath);