Backport pull request #18243 from jellyfin/release-12.z

Fix crash probing streams without frame size

Original-merge: 8e50df32e7

Merged-by: crobibero <cody@robibe.ro>

Backported-by: Bond_009 <bond.009@outlook.com>
This commit is contained in:
myristate authored and Bond_009 committed 2026-10-13 13:36:10 -04:00
1 parent 619eb231b4
commit 054706333d
5 files changed
+192

No files matched your search

+1
View File
@@ -99,6 +99,7 @@
- [mitchfizz05](https://github.com/mitchfizz05)
- [mohd-akram](https://github.com/mohd-akram)
- [MrTimscampi](https://github.com/MrTimscampi)
- [myristate](https://github.com/myristate)
- [n8225](https://github.com/n8225)
- [Nalsai](https://github.com/Nalsai)
- [Narfinger](https://github.com/Narfinger)
@@ -1110,6 +1110,12 @@ namespace MediaBrowser.MediaEncoding.Probing
&& width > 0
&& height > 0))
{
// Live TV and other early probes can report neither a usable display aspect ratio nor the frame size
if (info.Width is not > 0 || info.Height is not > 0)
{
return original;
}
width = info.Width.Value;
height = info.Height.Value;
}
@@ -242,6 +242,27 @@ namespace Jellyfin.MediaEncoding.Tests.Probing
Assert.False(res.MediaStreams[0].IsAVC);
}
[Theory]
[InlineData("Test Data/Probing/video_ts_no_dimensions.json", null)]
[InlineData("Test Data/Probing/video_ts_no_dimensions_zero_dar.json", "0:1")]
public void GetMediaInfo_TSWithoutDimensions_Success(string path, string? expectedAspectRatio)
{
var bytes = File.ReadAllBytes(path);
var internalMediaInfoResult = JsonSerializer.Deserialize<InternalMediaInfoResult>(bytes, _jsonOptions);
MediaInfo res = _probeResultNormalizer.GetMediaInfo(internalMediaInfoResult, VideoType.VideoFile, false, "http://192.168.1.19:5004/auto/v4", MediaProtocol.Http);
Assert.Equal(2, res.MediaStreams.Count);
var video = res.MediaStreams[0];
Assert.Equal(MediaStreamType.Video, video.Type);
Assert.Equal("mpeg2video", video.Codec);
Assert.Null(video.Width);
Assert.Null(video.Height);
Assert.Equal(expectedAspectRatio, video.AspectRatio);
Assert.False(video.IsAnamorphic);
}
[Fact]
public void GetMediaInfo_WebM_Success()
{
@@ -0,0 +1,81 @@
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"profile": "Main",
"codec_type": "video",
"codec_tag_string": "[2][0][0][0]",
"codec_tag": "0x0002",
"pix_fmt": "yuv420p",
"level": 8,
"id": "0x259",
"r_frame_rate": "25/1",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 6181452600,
"start_time": "68682.806667",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
}
},
{
"index": 1,
"codec_name": "mp2",
"codec_long_name": "MP2 (MPEG audio layer 2)",
"codec_type": "audio",
"codec_tag_string": "[3][0][0][0]",
"codec_tag": "0x0003",
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"id": "0x25a",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 6181460000,
"start_time": "68682.888889",
"bit_rate": "256000",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
},
"tags": {
"language": "eng"
}
}
],
"format": {
"filename": "http://192.168.1.19:5004/auto/v4",
"nb_streams": 2,
"nb_programs": 1,
"format_name": "mpegts",
"format_long_name": "MPEG-TS (MPEG-2 Transport Stream)",
"start_time": "68682.806667",
"probe_score": 50
}
}
@@ -0,0 +1,83 @@
{
"streams": [
{
"index": 0,
"codec_name": "mpeg2video",
"codec_long_name": "MPEG-2 video",
"profile": "Main",
"codec_type": "video",
"codec_tag_string": "[2][0][0][0]",
"codec_tag": "0x0002",
"sample_aspect_ratio": "0:1",
"display_aspect_ratio": "0:1",
"pix_fmt": "yuv420p",
"level": 8,
"id": "0x259",
"r_frame_rate": "25/1",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 6181452600,
"start_time": "68682.806667",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
}
},
{
"index": 1,
"codec_name": "mp2",
"codec_long_name": "MP2 (MPEG audio layer 2)",
"codec_type": "audio",
"codec_tag_string": "[3][0][0][0]",
"codec_tag": "0x0003",
"sample_fmt": "fltp",
"sample_rate": "48000",
"channels": 2,
"channel_layout": "stereo",
"bits_per_sample": 0,
"id": "0x25a",
"r_frame_rate": "0/0",
"avg_frame_rate": "0/0",
"time_base": "1/90000",
"start_pts": 6181460000,
"start_time": "68682.888889",
"bit_rate": "256000",
"disposition": {
"default": 0,
"dub": 0,
"original": 0,
"comment": 0,
"lyrics": 0,
"karaoke": 0,
"forced": 0,
"hearing_impaired": 0,
"visual_impaired": 0,
"clean_effects": 0,
"attached_pic": 0,
"timed_thumbnails": 0
},
"tags": {
"language": "eng"
}
}
],
"format": {
"filename": "http://192.168.1.19:5004/auto/v4",
"nb_streams": 2,
"nb_programs": 1,
"format_name": "mpegts",
"format_long_name": "MPEG-TS (MPEG-2 Transport Stream)",
"start_time": "68682.806667",
"probe_score": 50
}
}