aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgnattu <gnattuoc@me.com>2024-09-13 15:44:03 +0800
committergnattu <gnattuoc@me.com>2024-09-13 15:44:03 +0800
commit6395f4889d18bf4b12567ca7c28e9d5a22506e73 (patch)
treeb96f6a5cfc7c5b2dc9773b93972ebace87c3603b
parent3c64e1d33fecc4815a9f491d08833310e7a906a2 (diff)
Update unit test for StreamBuilder to reflect current server and clients
Signed-off-by: gnattu <gnattuoc@me.com>
-rw-r--r--tests/Jellyfin.Model.Tests/Dlna/StreamBuilderTests.cs192
-rw-r--r--tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Chrome.json389
-rw-r--r--tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Firefox.json445
-rw-r--r--tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-SafariNext.json322
-rw-r--r--tests/Jellyfin.Model.Tests/Test Data/MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json86
5 files changed, 678 insertions, 756 deletions
diff --git a/tests/Jellyfin.Model.Tests/Dlna/StreamBuilderTests.cs b/tests/Jellyfin.Model.Tests/Dlna/StreamBuilderTests.cs
index 3429d1a5b..9953431d9 100644
--- a/tests/Jellyfin.Model.Tests/Dlna/StreamBuilderTests.cs
+++ b/tests/Jellyfin.Model.Tests/Dlna/StreamBuilderTests.cs
@@ -22,37 +22,41 @@ namespace Jellyfin.Model.Tests
[Theory]
// Chrome
[InlineData("Chrome", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioIsExternal)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
- [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode")]
- [InlineData("Chrome", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode")]
- [InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported, "Remux")] // #6450
- [InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioIsExternal, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
+ [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")]
+ [InlineData("Chrome", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")]
+ [InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)] // #6450
+ [InlineData("Chrome", "mp4-h264-hi10p-aac-5000k", PlayMethod.DirectPlay)]
// Firefox
[InlineData("Firefox", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioIsExternal)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
- [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode")]
- [InlineData("Firefox", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode")]
- [InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported, "Remux")] // #6450
- [InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioIsExternal, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "HLS.mp4")]
+ [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode", "HLS.mp4")]
+ [InlineData("Firefox", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode", "HLS.mp4")]
+ [InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)] // #6450
+ [InlineData("Firefox", "mp4-h264-hi10p-aac-5000k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported | TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode", "HLS.mp4")] // TODO: investigate why firefox profile has everything unsupported
// Safari
[InlineData("SafariNext", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
- [InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
- [InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-h264-hi10p-aac-5000k", PlayMethod.Transcode, TranscodeReason.VideoProfileNotSupported, "Remux", "HLS.mp4")]
+
// AndroidPixel
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("AndroidPixel", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
@@ -62,21 +66,21 @@ namespace Jellyfin.Model.Tests
[InlineData("AndroidPixel", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.ContainerBitrateExceedsLimit, "Transcode")]
// Yatse
[InlineData("Yatse", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Yatse", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Yatse", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
+ [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
+ [InlineData("Yatse", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
// RokuSSPlus
[InlineData("RokuSSPlus", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("RokuSSPlus", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
[InlineData("RokuSSPlus", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450 should be DirectPlay
- [InlineData("RokuSSPlus", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
[InlineData("RokuSSPlus", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("RokuSSPlus", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
[InlineData("RokuSSPlus", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("RokuSSPlus", "mp4-hevc-ac3-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-hevc-ac3-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
// JellyfinMediaPlayer
[InlineData("JellyfinMediaPlayer", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
[InlineData("JellyfinMediaPlayer", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
@@ -86,18 +90,6 @@ namespace Jellyfin.Model.Tests
[InlineData("JellyfinMediaPlayer", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("JellyfinMediaPlayer", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("JellyfinMediaPlayer", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- // Chrome-NoHLS
- [InlineData("Chrome-NoHLS", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("Chrome-NoHLS", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome-NoHLS", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Chrome-NoHLS", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioIsExternal)] // #6450
- [InlineData("Chrome-NoHLS", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome-NoHLS", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "http")]
- [InlineData("Chrome-NoHLS", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode", "http")]
- [InlineData("Chrome-NoHLS", "mp4-hevc-ac3-aacDef-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode", "http")]
- [InlineData("Chrome-NoHLS", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported, "Remux")] // #6450
- [InlineData("Chrome-NoHLS", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome-NoHLS", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
// TranscodeMedia
[InlineData("TranscodeMedia", "mp4-h264-aac-vtt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
[InlineData("TranscodeMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "DirectStream", "HLS.mp4")]
@@ -147,7 +139,7 @@ namespace Jellyfin.Model.Tests
[InlineData("AndroidTVExoPlayer", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("AndroidTVExoPlayer", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("AndroidTVExoPlayer", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
- [InlineData("AndroidTVExoPlayer", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("AndroidTVExoPlayer", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow vp9
// Tizen 3 Stereo
[InlineData("Tizen3-stereo", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)]
@@ -155,7 +147,7 @@ namespace Jellyfin.Model.Tests
[InlineData("Tizen3-stereo", "mp4-h264-dts-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
- [InlineData("Tizen3-stereo", "mp4-hevc-truehd-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen3-stereo", "mp4-hevc-truehd-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen3-stereo", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
@@ -163,10 +155,10 @@ namespace Jellyfin.Model.Tests
[InlineData("Tizen4-4K-5.1", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)]
- [InlineData("Tizen4-4K-5.1", "mp4-h264-dts-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen4-4K-5.1", "mp4-h264-dts-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen4-4K-5.1", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
- [InlineData("Tizen4-4K-5.1", "mp4-hevc-truehd-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen4-4K-5.1", "mp4-hevc-truehd-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
@@ -179,24 +171,24 @@ namespace Jellyfin.Model.Tests
[Theory]
// Chrome
[InlineData("Chrome", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450 <BUG: this is direct played>
- [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
- [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode")]
- [InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported, "Remux")] // #6450
- [InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450 <BUG: this is direct played>
+ [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
+ [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")]
+ [InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux", "HLS.mp4")] // #6450
// Firefox
[InlineData("Firefox", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Firefox", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
- [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode")]
- [InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported, "Remux")] // #6450
- [InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "HLS.mp4")]
+ [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioCodecNotSupported, "Transcode", "HLS.mp4")]
+ [InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.ContainerNotSupported | TranscodeReason.AudioCodecNotSupported, "DirectStream", "HLS.mp4")] // #6450
[InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
// Safari
[InlineData("SafariNext", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)] // #6450
@@ -204,9 +196,10 @@ namespace Jellyfin.Model.Tests
[InlineData("SafariNext", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("SafariNext", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)] // #6450
- [InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Remux", "HLS.mp4")] // #6450
- [InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
- [InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("SafariNext", "mp4-hevc-ac3-aacExt-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecTagNotSupported | TranscodeReason.AudioChannelsNotSupported, "DirectStream", "HLS.mp4")] // #6450
+
// AndroidPixel
[InlineData("AndroidPixel", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay)] // #6450
[InlineData("AndroidPixel", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectPlay)] // #6450
@@ -215,19 +208,19 @@ namespace Jellyfin.Model.Tests
[InlineData("AndroidPixel", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.ContainerBitrateExceedsLimit, "Transcode")]
// Yatse
[InlineData("Yatse", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Yatse", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
// RokuSSPlus
[InlineData("RokuSSPlus", "mp4-h264-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("RokuSSPlus", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450 should be DirectPlay
- [InlineData("RokuSSPlus", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("RokuSSPlus", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450 should be DirectPlay
+ [InlineData("RokuSSPlus", "mp4-h264-ac3-aacDef-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-h264-ac3-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)] // #6450
[InlineData("RokuSSPlus", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
- [InlineData("RokuSSPlus", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
- [InlineData("RokuSSPlus", "mp4-hevc-ac3-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
+ [InlineData("RokuSSPlus", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
+ [InlineData("RokuSSPlus", "mp4-hevc-ac3-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
// JellyfinMediaPlayer
[InlineData("JellyfinMediaPlayer", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
[InlineData("JellyfinMediaPlayer", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
@@ -245,7 +238,7 @@ namespace Jellyfin.Model.Tests
[InlineData("AndroidTVExoPlayer", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("AndroidTVExoPlayer", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("AndroidTVExoPlayer", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
- [InlineData("AndroidTVExoPlayer", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("AndroidTVExoPlayer", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow vp9
// Tizen 3 Stereo
[InlineData("Tizen3-stereo", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)]
@@ -253,7 +246,7 @@ namespace Jellyfin.Model.Tests
[InlineData("Tizen3-stereo", "mp4-h264-dts-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
- [InlineData("Tizen3-stereo", "mp4-hevc-truehd-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen3-stereo", "mp4-hevc-truehd-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen3-stereo", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen3-stereo", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
@@ -261,10 +254,10 @@ namespace Jellyfin.Model.Tests
[InlineData("Tizen4-4K-5.1", "mp4-h264-aac-vtt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectPlay)]
- [InlineData("Tizen4-4K-5.1", "mp4-h264-dts-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen4-4K-5.1", "mp4-h264-dts-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen4-4K-5.1", "mp4-hevc-aac-srt-15200k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay)]
- [InlineData("Tizen4-4K-5.1", "mp4-hevc-truehd-srt-15200k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)]
+ [InlineData("Tizen4-4K-5.1", "mp4-hevc-truehd-srt-15200k", PlayMethod.Transcode, TranscodeReason.AudioCodecNotSupported)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectPlay)]
[InlineData("Tizen4-4K-5.1", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay)]
@@ -281,34 +274,34 @@ namespace Jellyfin.Model.Tests
[Theory]
// Chrome
- [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Chrome", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioIsExternal)] // #6450
- [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode")]
+ [InlineData("Chrome", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")]
+ [InlineData("Chrome", "mp4-h264-ac3-aacExt-srt-2600k", PlayMethod.Transcode, TranscodeReason.AudioIsExternal, "DirectStream", "HLS.mp4")] // #6450
+ [InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")]
// Firefox
- [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Firefox", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode")]
+ [InlineData("Firefox", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")] // #6450
+ [InlineData("Firefox", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux", "HLS.mp4")]
+ [InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported | TranscodeReason.SecondaryAudioNotSupported, "Transcode", "HLS.mp4")]
// Yatse
- [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
- [InlineData("Yatse", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")] // #6450
+ [InlineData("Yatse", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Yatse", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Transcode")] // Full transcode because profile only has ts which does not allow hevc
// RokuSSPlus
[InlineData("RokuSSPlus", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
[InlineData("RokuSSPlus", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
// no streams
- [InlineData("Chrome", "no-streams", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")] // #6450
+ [InlineData("Chrome", "no-streams", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "HLS.mp4")] // #6450
// AndroidTV
[InlineData("AndroidTVExoPlayer", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")]
[InlineData("AndroidTVExoPlayer", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")]
// Tizen 3 Stereo
- [InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Tizen3-stereo", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen3-stereo", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen3-stereo", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
// Tizen 4 4K 5.1
- [InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
- [InlineData("Tizen4-4K-5.1", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.DirectStream, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen4-4K-5.1", "mp4-h264-ac3-aac-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
+ [InlineData("Tizen4-4K-5.1", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.SecondaryAudioNotSupported, "Remux")]
// TranscodeMedia
[InlineData("TranscodeMedia", "mp4-h264-ac3-aac-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.mp4")]
[InlineData("TranscodeMedia", "mp4-h264-ac3-aac-mp3-srt-2600k", PlayMethod.Transcode, TranscodeReason.DirectPlayError, "Remux", "HLS.ts")]
@@ -331,7 +324,7 @@ namespace Jellyfin.Model.Tests
{
if (string.IsNullOrEmpty(transcodeProtocol))
{
- transcodeProtocol = playMethod == PlayMethod.DirectStream ? "http" : "HLS.ts";
+ transcodeProtocol = "HLS.ts";
}
var builder = GetStreamBuilder();
@@ -380,7 +373,7 @@ namespace Jellyfin.Model.Tests
Assert.Equal(streamInfo.Container, uri.Extension);
}
}
- else if (playMethod == PlayMethod.DirectStream || playMethod == PlayMethod.Transcode)
+ else if (playMethod == PlayMethod.Transcode)
{
Assert.NotNull(streamInfo.Container);
Assert.NotEmpty(streamInfo.VideoCodecs);
@@ -550,6 +543,7 @@ namespace Jellyfin.Model.Tests
Profile = dp,
AllowAudioStreamCopy = true,
AllowVideoStreamCopy = true,
+ EnableDirectStream = false // This is disabled in server
};
}
diff --git a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Chrome.json b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Chrome.json
index 81bb97ac8..e2f75b569 100644
--- a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Chrome.json
+++ b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Chrome.json
@@ -16,324 +16,200 @@
"DirectPlayProfiles": [
{
"Container": "webm",
- "AudioCodec": "vorbis,opus",
- "VideoCodec": "vp8,vp9,av1",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "vp8,vp9,av1",
+ "AudioCodec": "vorbis,opus"
},
{
"Container": "mp4,m4v",
- "AudioCodec": "aac,mp3,opus,flac,alac,vorbis",
- "VideoCodec": "h264,vp8,vp9,av1",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "h264,hevc,vp9,av1",
+ "AudioCodec": "aac,mp3,mp2,opus,flac,vorbis"
},
{
"Container": "mov",
- "AudioCodec": "aac,mp3,opus,flac,alac,vorbis",
- "VideoCodec": "h264",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "h264",
+ "AudioCodec": "aac,mp3,mp2,opus,flac,vorbis"
},
{
"Container": "opus",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webm",
"AudioCodec": "opus",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
+ },
+ {
+ "Container": "ts",
+ "AudioCodec": "mp3",
+ "Type": "Audio"
},
{
"Container": "mp3",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4a",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4b",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "flac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "m4a",
- "AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "m4b",
- "AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webm",
"AudioCodec": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "wav",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "ogg",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
+ },
+ {
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "av1,hevc,h264,vp9",
+ "AudioCodec": "aac,mp2,opus,flac"
+ },
+ {
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "h264",
+ "AudioCodec": "aac,mp3,mp2"
}
],
"TranscodingProfiles": [
{
- "Container": "ts",
+ "Container": "mp4",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "hls",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 2,
- "SegmentLength": 0,
+ "Protocol": "hls",
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
"BreakOnNonKeyFrames": true,
- "$type": "TranscodingProfile"
+ "EnableAudioVbrEncoding": true
},
{
"Container": "aac",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "mp3",
"Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "opus",
"Type": "Audio",
"AudioCodec": "opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "wav",
"Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "opus",
"Type": "Audio",
"AudioCodec": "opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "mp3",
"Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "aac",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
"Container": "wav",
"Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
- },
- {
- "Container": "ts",
- "Type": "Video",
- "VideoCodec": "h264",
- "AudioCodec": "aac,mp3",
- "Protocol": "hls",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
- "Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 2,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": true,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "2"
},
{
- "Container": "webm",
+ "Container": "mp4",
"Type": "Video",
- "VideoCodec": "vp8,vp9,av1,vpx",
- "AudioCodec": "vorbis,opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "AudioCodec": "aac,mp2,opus,flac",
+ "VideoCodec": "av1,hevc,h264,vp9",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "hls",
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
+ "BreakOnNonKeyFrames": true
},
{
- "Container": "mp4",
+ "Container": "ts",
"Type": "Video",
+ "AudioCodec": "aac,mp3,mp2",
"VideoCodec": "h264",
- "AudioCodec": "aac,mp3,opus,flac,alac,vorbis",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
- "Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Context": "Streaming",
+ "Protocol": "hls",
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
+ "BreakOnNonKeyFrames": true
}
],
+ "ContainerProfiles": [],
"CodecProfiles": [
{
"Type": "VideoAudio",
+ "Codec": "aac",
"Conditions": [
{
"Condition": "Equals",
"Property": "IsSecondaryAudio",
"Value": "false",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
}
- ],
- "Codec": "aac",
- "$type": "CodecProfile"
+ ]
},
{
"Type": "VideoAudio",
@@ -342,107 +218,144 @@
"Condition": "Equals",
"Property": "IsSecondaryAudio",
"Value": "false",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
}
- ],
- "$type": "CodecProfile"
+ ]
},
{
"Type": "Video",
+ "Codec": "h264",
"Conditions": [
{
"Condition": "NotEquals",
"Property": "IsAnamorphic",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "EqualsAny",
"Property": "VideoProfile",
"Value": "high|main|baseline|constrained baseline|high 10",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR",
+ "IsRequired": false
},
{
"Condition": "LessThanEqual",
"Property": "VideoLevel",
"Value": "52",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "NotEquals",
"Property": "IsInterlaced",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
}
- ],
- "Codec": "h264",
- "$type": "CodecProfile"
+ ]
},
{
"Type": "Video",
+ "Codec": "hevc",
"Conditions": [
{
"Condition": "NotEquals",
"Property": "IsAnamorphic",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "EqualsAny",
"Property": "VideoProfile",
- "Value": "main",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "Value": "main|main 10",
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG",
+ "IsRequired": false
},
{
"Condition": "LessThanEqual",
"Property": "VideoLevel",
- "Value": "120",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "Value": "183",
+ "IsRequired": false
},
{
"Condition": "NotEquals",
"Property": "IsInterlaced",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
}
- ],
- "Codec": "hevc",
- "$type": "CodecProfile"
- }
- ],
- "ResponseProfiles": [
+ ]
+ },
{
- "Container": "m4v",
"Type": "Video",
- "MimeType": "video/mp4",
- "$type": "ResponseProfile"
+ "Codec": "vp9",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG",
+ "IsRequired": false
+ }
+ ]
+ },
+ {
+ "Type": "Video",
+ "Codec": "av1",
+ "Conditions": [
+ {
+ "Condition": "NotEquals",
+ "Property": "IsAnamorphic",
+ "Value": "true",
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoProfile",
+ "Value": "main",
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG",
+ "IsRequired": false
+ },
+ {
+ "Condition": "LessThanEqual",
+ "Property": "VideoLevel",
+ "Value": "19",
+ "IsRequired": false
+ }
+ ]
}
],
"SubtitleProfiles": [
{
"Format": "vtt",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ass",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ssa",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
}
],
- "$type": "DeviceProfile"
+ "ResponseProfiles": [
+ {
+ "Type": "Video",
+ "Container": "m4v",
+ "MimeType": "video/mp4"
+ }
+ ]
}
diff --git a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Firefox.json b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Firefox.json
index 9874793d3..21ae7e5cb 100644
--- a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Firefox.json
+++ b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-Firefox.json
@@ -15,426 +15,357 @@
"IgnoreTranscodeByteRangeRequests": false,
"DirectPlayProfiles": [
{
- "Container": "webm",
"AudioCodec": "vorbis,opus",
- "VideoCodec": "vp8,vp9,av1",
+ "Container": "webm",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "vp8,vp9,av1"
},
{
+ "AudioCodec": "aac,mp3,mp2,opus,flac,vorbis",
"Container": "mp4,m4v",
- "AudioCodec": "aac,mp3,opus,flac,alac,vorbis",
- "VideoCodec": "h264,vp8,vp9,av1",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "h264,vp9,av1"
},
{
"Container": "opus",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
- "Container": "webm",
"AudioCodec": "opus",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Container": "webm",
+ "Type": "Audio"
+ },
+ {
+ "AudioCodec": "mp3",
+ "Container": "ts",
+ "Type": "Audio"
},
{
"Container": "mp3",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
- "Container": "m4a",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Container": "m4a",
+ "Type": "Audio"
},
{
- "Container": "m4b",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Container": "m4b",
+ "Type": "Audio"
},
{
"Container": "flac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "m4a",
- "AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
- },
- {
- "Container": "m4b",
- "AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
- "Container": "webm",
"AudioCodec": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Container": "webm",
+ "Type": "Audio"
},
{
"Container": "wav",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "ogg",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
+ },
+ {
+ "AudioCodec": "aac,mp2,opus,flac",
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "av1,h264,vp9"
+ },
+ {
+ "AudioCodec": "aac,mp3,mp2",
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "h264"
}
],
"TranscodingProfiles": [
{
- "Container": "ts",
- "Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "hls",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
- "Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 2,
- "SegmentLength": 0,
"BreakOnNonKeyFrames": true,
- "$type": "TranscodingProfile"
+ "Container": "mp4",
+ "Context": "Streaming",
+ "EnableAudioVbrEncoding": true,
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
+ "Protocol": "hls",
+ "Type": "Audio"
},
{
- "Container": "aac",
- "Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "aac",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "mp3",
- "Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "mp3",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "opus",
- "Type": "Audio",
"AudioCodec": "opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "opus",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "wav",
- "Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "wav",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "opus",
- "Type": "Audio",
"AudioCodec": "opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "opus",
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "mp3",
- "Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "mp3",
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "aac",
- "Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "aac",
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "wav",
- "Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "wav",
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "Protocol": "http",
+ "Type": "Audio"
},
{
- "Container": "ts",
- "Type": "Video",
- "VideoCodec": "h264",
- "AudioCodec": "aac,mp3",
- "Protocol": "hls",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
- "Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 2,
- "SegmentLength": 0,
+ "AudioCodec": "aac,mp2,opus,flac",
"BreakOnNonKeyFrames": true,
- "$type": "TranscodingProfile"
- },
- {
- "Container": "webm",
- "Type": "Video",
- "VideoCodec": "vp8,vp9,av1,vpx",
- "AudioCodec": "vorbis,opus",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
+ "Container": "mp4",
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
+ "Protocol": "hls",
+ "Type": "Video",
+ "VideoCodec": "av1,h264,vp9"
},
{
- "Container": "mp4",
+ "AudioCodec": "aac,mp3,mp2",
+ "BreakOnNonKeyFrames": true,
+ "Container": "ts",
+ "Context": "Streaming",
+ "MaxAudioChannels": "2",
+ "MinSegments": "2",
+ "Protocol": "hls",
"Type": "Video",
- "VideoCodec": "h264",
- "AudioCodec": "aac,mp3,opus,flac,alac,vorbis",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
- "Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "VideoCodec": "h264"
}
],
"CodecProfiles": [
{
- "Type": "VideoAudio",
+ "Codec": "aac",
"Conditions": [
{
"Condition": "Equals",
+ "IsRequired": false,
"Property": "IsSecondaryAudio",
- "Value": "false",
+ "Value": "false"
+ }
+ ],
+ "Type": "VideoAudio"
+ },
+ {
+ "Conditions": [
+ {
+ "Condition": "LessThanEqual",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "AudioChannels",
+ "Value": "2"
}
],
- "Codec": "aac",
- "$type": "CodecProfile"
+ "Type": "Audio"
},
{
- "Type": "VideoAudio",
"Conditions": [
{
+ "Condition": "LessThanEqual",
+ "IsRequired": false,
+ "Property": "AudioChannels",
+ "Value": "2"
+ },
+ {
"Condition": "Equals",
- "Property": "IsSecondaryAudio",
- "Value": "false",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "IsSecondaryAudio",
+ "Value": "false"
}
],
- "$type": "CodecProfile"
+ "Type": "VideoAudio"
},
{
- "Type": "Video",
+ "Codec": "h264",
"Conditions": [
{
"Condition": "NotEquals",
- "Property": "IsAnamorphic",
- "Value": "true",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "IsAnamorphic",
+ "Value": "true"
},
{
"Condition": "EqualsAny",
+ "IsRequired": false,
"Property": "VideoProfile",
- "Value": "high|main|baseline|constrained baseline",
+ "Value": "high|main|baseline|constrained baseline"
+ },
+ {
+ "Condition": "EqualsAny",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "VideoRangeType",
+ "Value": "SDR"
},
{
"Condition": "LessThanEqual",
- "Property": "VideoLevel",
- "Value": "52",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "VideoLevel",
+ "Value": "52"
},
{
"Condition": "NotEquals",
- "Property": "IsInterlaced",
- "Value": "true",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "IsInterlaced",
+ "Value": "true"
}
],
- "Codec": "h264",
- "$type": "CodecProfile"
+ "Type": "Video"
},
{
- "Type": "Video",
+ "Codec": "hevc",
"Conditions": [
{
"Condition": "NotEquals",
- "Property": "IsAnamorphic",
- "Value": "true",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "IsAnamorphic",
+ "Value": "true"
},
{
"Condition": "EqualsAny",
+ "IsRequired": false,
"Property": "VideoProfile",
- "Value": "main",
+ "Value": "main"
+ },
+ {
+ "Condition": "EqualsAny",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "VideoRangeType",
+ "Value": "SDR"
},
{
"Condition": "LessThanEqual",
- "Property": "VideoLevel",
- "Value": "120",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "VideoLevel",
+ "Value": "120"
},
{
"Condition": "NotEquals",
+ "IsRequired": false,
"Property": "IsInterlaced",
- "Value": "true",
+ "Value": "true"
+ }
+ ],
+ "Type": "Video"
+ },
+ {
+ "Codec": "vp9",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
"IsRequired": false,
- "$type": "ProfileCondition"
+ "Property": "VideoRangeType",
+ "Value": "SDR"
}
],
- "Codec": "hevc",
- "$type": "CodecProfile"
+ "Type": "Video"
+ },
+ {
+ "Codec": "av1",
+ "Conditions": [
+ {
+ "Condition": "NotEquals",
+ "IsRequired": false,
+ "Property": "IsAnamorphic",
+ "Value": "true"
+ },
+ {
+ "Condition": "EqualsAny",
+ "IsRequired": false,
+ "Property": "VideoProfile",
+ "Value": "main"
+ },
+ {
+ "Condition": "EqualsAny",
+ "IsRequired": false,
+ "Property": "VideoRangeType",
+ "Value": "SDR"
+ },
+ {
+ "Condition": "LessThanEqual",
+ "IsRequired": false,
+ "Property": "VideoLevel",
+ "Value": "19"
+ }
+ ],
+ "Type": "Video"
}
],
"ResponseProfiles": [
{
"Container": "m4v",
- "Type": "Video",
"MimeType": "video/mp4",
- "$type": "ResponseProfile"
+ "Type": "Video"
}
],
"SubtitleProfiles": [
{
"Format": "vtt",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ass",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ssa",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
}
],
"$type": "DeviceProfile"
diff --git a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-SafariNext.json b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-SafariNext.json
index 3b5a0c254..f61d0e36b 100644
--- a/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-SafariNext.json
+++ b/tests/Jellyfin.Model.Tests/Test Data/DeviceProfile-SafariNext.json
@@ -16,211 +16,160 @@
"DirectPlayProfiles": [
{
"Container": "webm",
- "AudioCodec": "vorbis",
- "VideoCodec": "vp8,vp9",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "vp8",
+ "AudioCodec": "vorbis,opus"
},
{
"Container": "mp4,m4v",
- "AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
- "VideoCodec": "h264,vp8,vp9",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "h264,hevc,vp9",
+ "AudioCodec": "aac,ac3,eac3,opus,flac,alac"
},
{
"Container": "mov",
- "AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
- "VideoCodec": "h264",
"Type": "Video",
- "$type": "DirectPlayProfile"
+ "VideoCodec": "h264",
+ "AudioCodec": "aac,ac3,eac3,opus,flac,alac"
+ },
+ {
+ "Container": "ts",
+ "AudioCodec": "mp3",
+ "Type": "Audio"
},
{
"Container": "mp3",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4a",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4b",
"AudioCodec": "aac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
- "Container": "flac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Container": "mp4",
+ "AudioCodec": "flac",
+ "Type": "Audio"
},
{
"Container": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4a",
"AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "m4b",
"AudioCodec": "alac",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "webm",
"AudioCodec": "webma",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
},
{
"Container": "wav",
- "Type": "Audio",
- "$type": "DirectPlayProfile"
+ "Type": "Audio"
+ },
+ {
+ "Container": "mp4",
+ "AudioCodec": "opus",
+ "Type": "Audio"
+ },
+ {
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "hevc,h264,vp9",
+ "AudioCodec": "aac,ac3,eac3,opus,flac,alac"
+ },
+ {
+ "Container": "hls",
+ "Type": "Video",
+ "VideoCodec": "h264",
+ "AudioCodec": "aac,mp3,ac3,eac3"
}
],
"TranscodingProfiles": [
{
- "Container": "aac",
+ "Container": "mp4",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "hls",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
+ "Protocol": "hls",
"MaxAudioChannels": "6",
- "MinSegments": 2,
- "SegmentLength": 0,
+ "MinSegments": "2",
"BreakOnNonKeyFrames": true,
- "$type": "TranscodingProfile"
+ "EnableAudioVbrEncoding": true
},
{
"Container": "aac",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "mp3",
"Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "wav",
"Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Streaming",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "mp3",
"Type": "Audio",
"AudioCodec": "mp3",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "aac",
"Type": "Audio",
"AudioCodec": "aac",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "wav",
"Type": "Audio",
"AudioCodec": "wav",
- "Protocol": "http",
- "EstimateContentLength": false,
- "EnableMpegtsM2TsMode": false,
- "TranscodeSeekInfo": "Auto",
- "CopyTimestamps": false,
"Context": "Static",
- "EnableSubtitlesInManifest": false,
- "MaxAudioChannels": "6",
- "MinSegments": 0,
- "SegmentLength": 0,
- "BreakOnNonKeyFrames": false,
- "$type": "TranscodingProfile"
+ "Protocol": "http",
+ "MaxAudioChannels": "6"
},
{
"Container": "mp4",
"Type": "Video",
- "AudioCodec": "aac,ac3,eac3,flac,alac",
- "VideoCodec": "hevc,h264",
+ "AudioCodec": "aac,ac3,eac3,opus,flac,alac",
+ "VideoCodec": "hevc,h264,vp9",
"Context": "Streaming",
"Protocol": "hls",
"MaxAudioChannels": "2",
@@ -237,121 +186,170 @@
"MaxAudioChannels": "2",
"MinSegments": "2",
"BreakOnNonKeyFrames": true
- },
- {
- "Container": "webm",
- "Type": "Video",
- "AudioCodec": "vorbis",
- "VideoCodec": "vp8,vpx",
- "Context": "Streaming",
- "Protocol": "http",
- "MaxAudioChannels": "2"
- },
- {
- "Container": "mp4",
- "Type": "Video",
- "AudioCodec": "aac,mp3,ac3,eac3,flac,alac,vorbis",
- "VideoCodec": "h264",
- "Context": "Static",
- "Protocol": "http"
}
],
+ "ContainerProfiles": [],
"CodecProfiles": [
{
"Type": "Video",
+ "Container": "hls",
+ "SubContainer": "mp4",
+ "Codec": "h264",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoProfile",
+ "Value": "high|main|baseline|constrained baseline|high 10",
+ "IsRequired": false
+ }
+ ]
+ },
+ {
+ "Type": "Video",
+ "Codec": "h264",
"Conditions": [
{
"Condition": "NotEquals",
"Property": "IsAnamorphic",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "EqualsAny",
"Property": "VideoProfile",
"Value": "high|main|baseline|constrained baseline",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR",
+ "IsRequired": false
},
{
"Condition": "LessThanEqual",
"Property": "VideoLevel",
"Value": "52",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "NotEquals",
"Property": "IsInterlaced",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
}
- ],
- "Codec": "h264",
- "$type": "CodecProfile"
+ ]
},
{
"Type": "Video",
+ "Codec": "hevc",
"Conditions": [
{
"Condition": "NotEquals",
"Property": "IsAnamorphic",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "EqualsAny",
"Property": "VideoProfile",
"Value": "main|main 10",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG|DOVI|DOVIWithHDR10|DOVIWithHLG|DOVIWithSDR",
+ "IsRequired": false
},
{
"Condition": "LessThanEqual",
"Property": "VideoLevel",
"Value": "183",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
},
{
"Condition": "NotEquals",
"Property": "IsInterlaced",
"Value": "true",
- "IsRequired": false,
- "$type": "ProfileCondition"
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoCodecTag",
+ "Value": "hvc1|dvh1",
+ "IsRequired": true
+ },
+ {
+ "Condition": "LessThanEqual",
+ "Property": "VideoFramerate",
+ "Value": "60",
+ "IsRequired": true
}
- ],
- "Codec": "hevc",
- "$type": "CodecProfile"
- }
- ],
- "ResponseProfiles": [
+ ]
+ },
+ {
+ "Type": "Video",
+ "Codec": "vp9",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG",
+ "IsRequired": false
+ }
+ ]
+ },
{
- "Container": "m4v",
"Type": "Video",
- "MimeType": "video/mp4",
- "$type": "ResponseProfile"
+ "Codec": "av1",
+ "Conditions": [
+ {
+ "Condition": "NotEquals",
+ "Property": "IsAnamorphic",
+ "Value": "true",
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoProfile",
+ "Value": "main",
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": "SDR|HDR10|HLG",
+ "IsRequired": false
+ },
+ {
+ "Condition": "LessThanEqual",
+ "Property": "VideoLevel",
+ "Value": "15",
+ "IsRequired": false
+ }
+ ]
}
],
"SubtitleProfiles": [
{
"Format": "vtt",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ass",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
},
{
"Format": "ssa",
- "Method": "External",
- "$type": "SubtitleProfile"
+ "Method": "External"
}
],
- "$type": "DeviceProfile"
+ "ResponseProfiles": [
+ {
+ "Type": "Video",
+ "Container": "m4v",
+ "MimeType": "video/mp4"
+ }
+ ]
}
diff --git a/tests/Jellyfin.Model.Tests/Test Data/MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json b/tests/Jellyfin.Model.Tests/Test Data/MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json
new file mode 100644
index 000000000..1296bece5
--- /dev/null
+++ b/tests/Jellyfin.Model.Tests/Test Data/MediaSourceInfo-mp4-h264-hi10p-aac-5000k.json
@@ -0,0 +1,86 @@
+{
+ "Protocol": "File",
+ "Id": "a6e78000340509437325708e41b9e3bb",
+ "Path": "/Media/hi10p.mp4",
+ "Type": "Default",
+ "Container": "mov",
+ "Size": 58211635,
+ "Name": "MyVideo-hi10p",
+ "IsRemote": false,
+ "ETag": "8ad487e37ce9578122bbd8c42be2a392",
+ "RunTimeTicks": 920115000,
+ "SupportsTranscoding": true,
+ "SupportsDirectStream": true,
+ "SupportsDirectPlay": true,
+ "VideoType": "VideoFile",
+ "MediaStreams": [
+ {
+ "Codec": "h264",
+ "CodecTag": "avc1",
+ "Language": "und",
+ "TimeBase": "1/16000",
+ "VideoRange": "SDR",
+ "VideoRangeType": "SDR",
+ "AudioSpatialFormat": "None",
+ "DisplayTitle": "720p H264 SDR",
+ "NalLengthSize": "4",
+ "IsInterlaced": false,
+ "IsAVC": true,
+ "BitRate": 4820299,
+ "BitDepth": 10,
+ "RefFrames": 1,
+ "IsDefault": true,
+ "IsForced": false,
+ "IsHearingImpaired": false,
+ "Height": 720,
+ "Width": 1280,
+ "AverageFrameRate": 24.007952,
+ "RealFrameRate": 23.976025,
+ "ReferenceFrameRate": 24.007952,
+ "Profile": "High 10",
+ "Type": "Video",
+ "AspectRatio": "16:9",
+ "Index": 0,
+ "IsExternal": false,
+ "IsTextSubtitleStream": false,
+ "SupportsExternalStream": false,
+ "PixelFormat": "yuv420p10le",
+ "Level": 51,
+ "IsAnamorphic": false
+ },
+ {
+ "Codec": "aac",
+ "CodecTag": "mp4a",
+ "Language": "und",
+ "TimeBase": "1/48000",
+ "VideoRange": "Unknown",
+ "VideoRangeType": "Unknown",
+ "AudioSpatialFormat": "None",
+ "LocalizedDefault": "Default",
+ "LocalizedExternal": "External",
+ "DisplayTitle": "AAC - Stereo - Default",
+ "IsInterlaced": false,
+ "IsAVC": false,
+ "ChannelLayout": "stereo",
+ "BitRate": 257358,
+ "Channels": 2,
+ "SampleRate": 48000,
+ "IsDefault": true,
+ "IsForced": false,
+ "IsHearingImpaired": false,
+ "Profile": "LC",
+ "Type": "Audio",
+ "Index": 1,
+ "IsExternal": false,
+ "IsTextSubtitleStream": false,
+ "SupportsExternalStream": false,
+ "Level": 0
+ }
+ ],
+ "MediaAttachments": [],
+ "Formats": [],
+ "Bitrate": 5061248,
+ "DefaultAudioStreamIndex": 1,
+ "DefaultSubtitleStreamIndex": -1,
+ "HasSegments": false
+}