diff options
| author | Bond-009 <bond.009@outlook.com> | 2026-03-30 18:34:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-30 18:34:55 +0200 |
| commit | 5f30a4538bb0dd06cabd9659eb8269a8038644fc (patch) | |
| tree | 7a7640cf50d02f55ab0423cff313c17dc35e4b38 | |
| parent | a536ef88c4633fd1a1b252bf9e02b91d3fff005d (diff) | |
| parent | a6da575785e678e64ed03978d1f4f60a80423121 (diff) | |
Merge pull request #16507 from Bond-009/isavc
Only set IsAvc for video streams
5 files changed, 50 insertions, 64 deletions
diff --git a/MediaBrowser.MediaEncoding/Probing/FFProbeHelpers.cs b/MediaBrowser.MediaEncoding/Probing/FFProbeHelpers.cs index 6f51e1a6a..975c2b816 100644 --- a/MediaBrowser.MediaEncoding/Probing/FFProbeHelpers.cs +++ b/MediaBrowser.MediaEncoding/Probing/FFProbeHelpers.cs @@ -74,9 +74,9 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <param name="dict">The dict.</param> /// <returns>Dictionary{System.StringSystem.String}.</returns> - private static Dictionary<string, string> ConvertDictionaryToCaseInsensitive(IReadOnlyDictionary<string, string> dict) + private static Dictionary<string, string?> ConvertDictionaryToCaseInsensitive(IReadOnlyDictionary<string, string?> dict) { - return new Dictionary<string, string>(dict, StringComparer.OrdinalIgnoreCase); + return new Dictionary<string, string?>(dict, StringComparer.OrdinalIgnoreCase); } } } diff --git a/MediaBrowser.MediaEncoding/Probing/MediaStreamInfo.cs b/MediaBrowser.MediaEncoding/Probing/MediaStreamInfo.cs index 294442324..f631c471f 100644 --- a/MediaBrowser.MediaEncoding/Probing/MediaStreamInfo.cs +++ b/MediaBrowser.MediaEncoding/Probing/MediaStreamInfo.cs @@ -1,5 +1,3 @@ -#nullable disable - using System.Collections.Generic; using System.Text.Json.Serialization; @@ -22,21 +20,21 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The profile.</value> [JsonPropertyName("profile")] - public string Profile { get; set; } + public string? Profile { get; set; } /// <summary> /// Gets or sets the codec_name. /// </summary> /// <value>The codec_name.</value> [JsonPropertyName("codec_name")] - public string CodecName { get; set; } + public string? CodecName { get; set; } /// <summary> /// Gets or sets the codec_long_name. /// </summary> /// <value>The codec_long_name.</value> [JsonPropertyName("codec_long_name")] - public string CodecLongName { get; set; } + public string? CodecLongName { get; set; } /// <summary> /// Gets or sets the codec_type. @@ -50,49 +48,49 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The sample_rate.</value> [JsonPropertyName("sample_rate")] - public string SampleRate { get; set; } + public string? SampleRate { get; set; } /// <summary> /// Gets or sets the channels. /// </summary> /// <value>The channels.</value> [JsonPropertyName("channels")] - public int Channels { get; set; } + public int? Channels { get; set; } /// <summary> /// Gets or sets the channel_layout. /// </summary> /// <value>The channel_layout.</value> [JsonPropertyName("channel_layout")] - public string ChannelLayout { get; set; } + public string? ChannelLayout { get; set; } /// <summary> /// Gets or sets the avg_frame_rate. /// </summary> /// <value>The avg_frame_rate.</value> [JsonPropertyName("avg_frame_rate")] - public string AverageFrameRate { get; set; } + public string? AverageFrameRate { get; set; } /// <summary> /// Gets or sets the duration. /// </summary> /// <value>The duration.</value> [JsonPropertyName("duration")] - public string Duration { get; set; } + public string? Duration { get; set; } /// <summary> /// Gets or sets the bit_rate. /// </summary> /// <value>The bit_rate.</value> [JsonPropertyName("bit_rate")] - public string BitRate { get; set; } + public string? BitRate { get; set; } /// <summary> /// Gets or sets the width. /// </summary> /// <value>The width.</value> [JsonPropertyName("width")] - public int Width { get; set; } + public int? Width { get; set; } /// <summary> /// Gets or sets the refs. @@ -106,21 +104,21 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The height.</value> [JsonPropertyName("height")] - public int Height { get; set; } + public int? Height { get; set; } /// <summary> /// Gets or sets the display_aspect_ratio. /// </summary> /// <value>The display_aspect_ratio.</value> [JsonPropertyName("display_aspect_ratio")] - public string DisplayAspectRatio { get; set; } + public string? DisplayAspectRatio { get; set; } /// <summary> /// Gets or sets the tags. /// </summary> /// <value>The tags.</value> [JsonPropertyName("tags")] - public IReadOnlyDictionary<string, string> Tags { get; set; } + public IReadOnlyDictionary<string, string?>? Tags { get; set; } /// <summary> /// Gets or sets the bits_per_sample. @@ -141,7 +139,7 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The r_frame_rate.</value> [JsonPropertyName("r_frame_rate")] - public string RFrameRate { get; set; } + public string? RFrameRate { get; set; } /// <summary> /// Gets or sets the has_b_frames. @@ -155,70 +153,70 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The sample_aspect_ratio.</value> [JsonPropertyName("sample_aspect_ratio")] - public string SampleAspectRatio { get; set; } + public string? SampleAspectRatio { get; set; } /// <summary> /// Gets or sets the pix_fmt. /// </summary> /// <value>The pix_fmt.</value> [JsonPropertyName("pix_fmt")] - public string PixelFormat { get; set; } + public string? PixelFormat { get; set; } /// <summary> /// Gets or sets the level. /// </summary> /// <value>The level.</value> [JsonPropertyName("level")] - public int Level { get; set; } + public int? Level { get; set; } /// <summary> /// Gets or sets the time_base. /// </summary> /// <value>The time_base.</value> [JsonPropertyName("time_base")] - public string TimeBase { get; set; } + public string? TimeBase { get; set; } /// <summary> /// Gets or sets the start_time. /// </summary> /// <value>The start_time.</value> [JsonPropertyName("start_time")] - public string StartTime { get; set; } + public string? StartTime { get; set; } /// <summary> /// Gets or sets the codec_time_base. /// </summary> /// <value>The codec_time_base.</value> [JsonPropertyName("codec_time_base")] - public string CodecTimeBase { get; set; } + public string? CodecTimeBase { get; set; } /// <summary> /// Gets or sets the codec_tag. /// </summary> /// <value>The codec_tag.</value> [JsonPropertyName("codec_tag")] - public string CodecTag { get; set; } + public string? CodecTag { get; set; } /// <summary> - /// Gets or sets the codec_tag_string. + /// Gets or sets the codec_tag_string?. /// </summary> - /// <value>The codec_tag_string.</value> - [JsonPropertyName("codec_tag_string")] - public string CodecTagString { get; set; } + /// <value>The codec_tag_string?.</value> + [JsonPropertyName("codec_tag_string?")] + public string? CodecTagString { get; set; } /// <summary> /// Gets or sets the sample_fmt. /// </summary> /// <value>The sample_fmt.</value> [JsonPropertyName("sample_fmt")] - public string SampleFmt { get; set; } + public string? SampleFmt { get; set; } /// <summary> /// Gets or sets the dmix_mode. /// </summary> /// <value>The dmix_mode.</value> [JsonPropertyName("dmix_mode")] - public string DmixMode { get; set; } + public string? DmixMode { get; set; } /// <summary> /// Gets or sets the start_pts. @@ -232,90 +230,90 @@ namespace MediaBrowser.MediaEncoding.Probing /// </summary> /// <value>The is_avc.</value> [JsonPropertyName("is_avc")] - public bool IsAvc { get; set; } + public bool? IsAvc { get; set; } /// <summary> /// Gets or sets the nal_length_size. /// </summary> /// <value>The nal_length_size.</value> [JsonPropertyName("nal_length_size")] - public string NalLengthSize { get; set; } + public string? NalLengthSize { get; set; } /// <summary> /// Gets or sets the ltrt_cmixlev. /// </summary> /// <value>The ltrt_cmixlev.</value> [JsonPropertyName("ltrt_cmixlev")] - public string LtrtCmixlev { get; set; } + public string? LtrtCmixlev { get; set; } /// <summary> /// Gets or sets the ltrt_surmixlev. /// </summary> /// <value>The ltrt_surmixlev.</value> [JsonPropertyName("ltrt_surmixlev")] - public string LtrtSurmixlev { get; set; } + public string? LtrtSurmixlev { get; set; } /// <summary> /// Gets or sets the loro_cmixlev. /// </summary> /// <value>The loro_cmixlev.</value> [JsonPropertyName("loro_cmixlev")] - public string LoroCmixlev { get; set; } + public string? LoroCmixlev { get; set; } /// <summary> /// Gets or sets the loro_surmixlev. /// </summary> /// <value>The loro_surmixlev.</value> [JsonPropertyName("loro_surmixlev")] - public string LoroSurmixlev { get; set; } + public string? LoroSurmixlev { get; set; } /// <summary> /// Gets or sets the field_order. /// </summary> /// <value>The field_order.</value> [JsonPropertyName("field_order")] - public string FieldOrder { get; set; } + public string? FieldOrder { get; set; } /// <summary> /// Gets or sets the disposition. /// </summary> /// <value>The disposition.</value> [JsonPropertyName("disposition")] - public IReadOnlyDictionary<string, int> Disposition { get; set; } + public IReadOnlyDictionary<string, int>? Disposition { get; set; } /// <summary> /// Gets or sets the color range. /// </summary> /// <value>The color range.</value> [JsonPropertyName("color_range")] - public string ColorRange { get; set; } + public string? ColorRange { get; set; } /// <summary> /// Gets or sets the color space. /// </summary> /// <value>The color space.</value> [JsonPropertyName("color_space")] - public string ColorSpace { get; set; } + public string? ColorSpace { get; set; } /// <summary> /// Gets or sets the color transfer. /// </summary> /// <value>The color transfer.</value> [JsonPropertyName("color_transfer")] - public string ColorTransfer { get; set; } + public string? ColorTransfer { get; set; } /// <summary> /// Gets or sets the color primaries. /// </summary> /// <value>The color primaries.</value> [JsonPropertyName("color_primaries")] - public string ColorPrimaries { get; set; } + public string? ColorPrimaries { get; set; } /// <summary> /// Gets or sets the side_data_list. /// </summary> /// <value>The side_data_list.</value> [JsonPropertyName("side_data_list")] - public IReadOnlyList<MediaStreamInfoSideData> SideDataList { get; set; } + public IReadOnlyList<MediaStreamInfoSideData>? SideDataList { get; set; } } } diff --git a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs index 127bdd380..d3e7b5231 100644 --- a/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs +++ b/MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs @@ -697,24 +697,18 @@ namespace MediaBrowser.MediaEncoding.Probing /// <returns>MediaStream.</returns> private MediaStream GetMediaStream(bool isAudio, MediaStreamInfo streamInfo, MediaFormatInfo formatInfo, IReadOnlyList<MediaFrameInfo> frameInfoList) { - // These are mp4 chapters - if (string.Equals(streamInfo.CodecName, "mov_text", StringComparison.OrdinalIgnoreCase)) - { - // Edit: but these are also sometimes subtitles? - // return null; - } - var stream = new MediaStream { Codec = streamInfo.CodecName, Profile = streamInfo.Profile, + Width = streamInfo.Width, + Height = streamInfo.Height, Level = streamInfo.Level, Index = streamInfo.Index, PixelFormat = streamInfo.PixelFormat, NalLengthSize = streamInfo.NalLengthSize, TimeBase = streamInfo.TimeBase, - CodecTimeBase = streamInfo.CodecTimeBase, - IsAVC = streamInfo.IsAvc + CodecTimeBase = streamInfo.CodecTimeBase }; // Filter out junk @@ -774,10 +768,6 @@ namespace MediaBrowser.MediaEncoding.Probing stream.LocalizedExternal = _localization.GetLocalizedString("External"); stream.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired"); - // Graphical subtitle may have width and height info - stream.Width = streamInfo.Width; - stream.Height = streamInfo.Height; - if (string.IsNullOrEmpty(stream.Title)) { // mp4 missing track title workaround: fall back to handler_name if populated and not the default "SubtitleHandler" @@ -790,6 +780,7 @@ namespace MediaBrowser.MediaEncoding.Probing } else if (streamInfo.CodecType == CodecType.Video) { + stream.IsAVC = streamInfo.IsAvc; stream.AverageFrameRate = GetFrameRate(streamInfo.AverageFrameRate); stream.RealFrameRate = GetFrameRate(streamInfo.RFrameRate); @@ -822,8 +813,6 @@ namespace MediaBrowser.MediaEncoding.Probing stream.Type = MediaStreamType.Video; } - stream.Width = streamInfo.Width; - stream.Height = streamInfo.Height; stream.AspectRatio = GetAspectRatio(streamInfo); if (streamInfo.BitsPerSample > 0) @@ -1091,8 +1080,8 @@ namespace MediaBrowser.MediaEncoding.Probing && width > 0 && height > 0)) { - width = info.Width; - height = info.Height; + width = info.Width.Value; + height = info.Height.Value; } if (width > 0 && height > 0) diff --git a/MediaBrowser.Model/Entities/MediaStream.cs b/MediaBrowser.Model/Entities/MediaStream.cs index c443af32c..11f81ff7d 100644 --- a/MediaBrowser.Model/Entities/MediaStream.cs +++ b/MediaBrowser.Model/Entities/MediaStream.cs @@ -2,7 +2,6 @@ #pragma warning disable CS1591 using System; -using System.Collections.Frozen; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; diff --git a/tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs b/tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs index 8ebbd029a..3369af0e8 100644 --- a/tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs +++ b/tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs @@ -209,8 +209,8 @@ namespace Jellyfin.MediaEncoding.Tests.Probing Assert.Equal("mkv,webm", res.Container); Assert.Equal(2, res.MediaStreams.Count); - - Assert.False(res.MediaStreams[0].IsAVC); + Assert.Equal(540, res.MediaStreams[0].Width); + Assert.Equal(360, res.MediaStreams[0].Height); } [Fact] |
