mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-24 01:34:45 +03:00
Improve dynamic HDR metadata handling (#13277)
* Add support for bitstream filter to remove dynamic hdr metadata * Add support for ffprobe's only_first_vframe for HDR10+ detection * Add BitStreamFilterOptionType for metadata removal check * Map HDR10+ metadata to VideoRangeType.cs Current implementation uses a hack that abuses the EL flag to avoid database schema changes. Should add proper field once EFCore migration is merged. * Add more Dolby Vision Range types Out of spec ones are problematic and should be marked as a dedicated invalid type and handled by the server to not crash the player. Profile 7 videos should not be treated as normal HDR10 videos at all and should remove the metadata before serving. * Remove dynamic hdr metadata when necessary * Allow direct playback of HDR10+ videos on HDR10 clients * Only use dovi codec tag when dovi metadata is not removed * Handle DV Profile 7 Videos better * Fix HDR10+ with new bitmask * Indicate the presence of HDR10+ in HLS SUPPLEMENTAL-CODECS * Fix Dovi 8.4 not labeled as HLG in HLS * Fallback to dovi_rpu bsf for av1 when possible * Fix dovi_rpu cli for av1 * Use correct EFCore db column for HDR10+ * Undo outdated migration * Add proper hdr10+ migration * Remove outdated migration * Rebase to new db code * Add migrations for Hdr10PlusPresentFlag * Directly use bsf enum * Add xmldocs for SupportsBitStreamFilterWithOption * Make `VideoRangeType.Unknown` explicitly default on api models. * Unset default for non-api model class * Use tuples for bsf dictionary for now
This commit is contained in:
@@ -73,9 +73,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
private List<string> _hwaccels = new List<string>();
|
||||
private List<string> _filters = new List<string>();
|
||||
private IDictionary<int, bool> _filtersWithOption = new Dictionary<int, bool>();
|
||||
private IDictionary<BitStreamFilterOptionType, bool> _bitStreamFiltersWithOption = new Dictionary<BitStreamFilterOptionType, bool>();
|
||||
|
||||
private bool _isPkeyPauseSupported = false;
|
||||
private bool _isLowPriorityHwDecodeSupported = false;
|
||||
private bool _proberSupportsFirstVideoFrame = false;
|
||||
|
||||
private bool _isVaapiDeviceAmd = false;
|
||||
private bool _isVaapiDeviceInteliHD = false;
|
||||
@@ -222,6 +224,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
SetAvailableEncoders(validator.GetEncoders());
|
||||
SetAvailableFilters(validator.GetFilters());
|
||||
SetAvailableFiltersWithOption(validator.GetFiltersWithOption());
|
||||
SetAvailableBitStreamFiltersWithOption(validator.GetBitStreamFiltersWithOption());
|
||||
SetAvailableHwaccels(validator.GetHwaccels());
|
||||
SetMediaEncoderVersion(validator);
|
||||
|
||||
@@ -229,6 +232,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
|
||||
_isPkeyPauseSupported = validator.CheckSupportedRuntimeKey("p pause transcoding", _ffmpegVersion);
|
||||
_isLowPriorityHwDecodeSupported = validator.CheckSupportedHwaccelFlag("low_priority");
|
||||
_proberSupportsFirstVideoFrame = validator.CheckSupportedProberOption("only_first_vframe", _ffprobePath);
|
||||
|
||||
// Check the Vaapi device vendor
|
||||
if (OperatingSystem.IsLinux()
|
||||
@@ -342,6 +346,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
_filtersWithOption = dict;
|
||||
}
|
||||
|
||||
public void SetAvailableBitStreamFiltersWithOption(IDictionary<BitStreamFilterOptionType, bool> dict)
|
||||
{
|
||||
_bitStreamFiltersWithOption = dict;
|
||||
}
|
||||
|
||||
public void SetMediaEncoderVersion(EncoderValidator validator)
|
||||
{
|
||||
_ffmpegVersion = validator.GetFFmpegVersion();
|
||||
@@ -382,6 +391,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool SupportsBitStreamFilterWithOption(BitStreamFilterOptionType option)
|
||||
{
|
||||
return _bitStreamFiltersWithOption.TryGetValue(option, out var val) && val;
|
||||
}
|
||||
|
||||
public bool CanEncodeToAudioCodec(string codec)
|
||||
{
|
||||
if (string.Equals(codec, "opus", StringComparison.OrdinalIgnoreCase))
|
||||
@@ -501,6 +515,12 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
var args = extractChapters
|
||||
? "{0} -i {1} -threads {2} -v warning -print_format json -show_streams -show_chapters -show_format"
|
||||
: "{0} -i {1} -threads {2} -v warning -print_format json -show_streams -show_format";
|
||||
|
||||
if (_proberSupportsFirstVideoFrame)
|
||||
{
|
||||
args += " -show_frames -only_first_vframe";
|
||||
}
|
||||
|
||||
args = string.Format(CultureInfo.InvariantCulture, args, probeSizeArgument, inputPath, _threads).Trim();
|
||||
|
||||
var process = new Process
|
||||
|
||||
Reference in New Issue
Block a user