|
|
@ -27,7 +27,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
[InlineData("Chrome", "mp4-h264-ac3-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-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
// Firefox
|
|
|
|
// Firefox
|
|
|
@ -38,7 +38,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
[InlineData("Firefox", "mp4-h264-ac3-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-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
// Safari
|
|
|
|
// Safari
|
|
|
@ -89,7 +89,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
[InlineData("Chrome-NoHLS", "mp4-h264-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #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-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "http")]
|
|
|
|
[InlineData("Chrome-NoHLS", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "http")]
|
|
|
|
[InlineData("Chrome-NoHLS", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode", "http")]
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
[InlineData("Chrome-NoHLS", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
// TranscodeMedia
|
|
|
|
// TranscodeMedia
|
|
|
@ -177,7 +177,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
[InlineData("Chrome", "mp4-h264-ac3-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-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
[InlineData("Chrome", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
// Firefox
|
|
|
|
// Firefox
|
|
|
@ -187,7 +187,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
[InlineData("Firefox", "mp4-h264-ac3-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-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mp4-hevc-ac3-aac-srt-15200k", PlayMethod.Transcode, TranscodeReason.VideoCodecNotSupported, "Transcode")]
|
|
|
|
[InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-aac-srt-2600k", PlayMethod.DirectStream, TranscodeReason.ContainerNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-ac3-srt-2600k", PlayMethod.DirectStream, TranscodeReason.AudioCodecNotSupported)] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
[InlineData("Firefox", "mkv-vp9-vorbis-vtt-2600k", PlayMethod.DirectPlay, (TranscodeReason)0, "Remux")] // #6450
|
|
|
|
// Safari
|
|
|
|
// Safari
|
|
|
@ -338,23 +338,23 @@ namespace Jellyfin.Model.Tests
|
|
|
|
Assert.NotNull(mediaSource);
|
|
|
|
Assert.NotNull(mediaSource);
|
|
|
|
var videoStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Video);
|
|
|
|
var videoStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Video);
|
|
|
|
var audioStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Audio);
|
|
|
|
var audioStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Audio);
|
|
|
|
// TODO: check AudioStreamIndex vs options.AudioStreamIndex
|
|
|
|
// TODO: Check AudioStreamIndex vs options.AudioStreamIndex
|
|
|
|
var inputAudioStream = mediaSource.GetDefaultAudioStream(audioStreamIndexInput ?? mediaSource.DefaultAudioStreamIndex);
|
|
|
|
var inputAudioStream = mediaSource.GetDefaultAudioStream(audioStreamIndexInput ?? mediaSource.DefaultAudioStreamIndex);
|
|
|
|
|
|
|
|
|
|
|
|
var uri = ParseUri(val);
|
|
|
|
var uri = ParseUri(val);
|
|
|
|
|
|
|
|
|
|
|
|
if (playMethod == PlayMethod.DirectPlay)
|
|
|
|
if (playMethod == PlayMethod.DirectPlay)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check expected container
|
|
|
|
// Check expected container
|
|
|
|
var containers = ContainerProfile.SplitValue(mediaSource.Container);
|
|
|
|
var containers = ContainerProfile.SplitValue(mediaSource.Container);
|
|
|
|
// TODO: test transcode too
|
|
|
|
// TODO: Test transcode too
|
|
|
|
// Assert.Contains(uri.Extension, containers);
|
|
|
|
// Assert.Contains(uri.Extension, containers);
|
|
|
|
|
|
|
|
|
|
|
|
// check expected video codec (1)
|
|
|
|
// Check expected video codec (1)
|
|
|
|
Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec);
|
|
|
|
Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec);
|
|
|
|
Assert.Single(val.TargetVideoCodec);
|
|
|
|
Assert.Single(val.TargetVideoCodec);
|
|
|
|
|
|
|
|
|
|
|
|
// check expected audio codecs (1)
|
|
|
|
// Check expected audio codecs (1)
|
|
|
|
Assert.Contains(targetAudioStream.Codec, val.TargetAudioCodec);
|
|
|
|
Assert.Contains(targetAudioStream.Codec, val.TargetAudioCodec);
|
|
|
|
Assert.Single(val.TargetAudioCodec);
|
|
|
|
Assert.Single(val.TargetAudioCodec);
|
|
|
|
// Assert.Single(val.AudioCodecs);
|
|
|
|
// Assert.Single(val.AudioCodecs);
|
|
|
@ -370,7 +370,7 @@ namespace Jellyfin.Model.Tests
|
|
|
|
Assert.NotEmpty(val.VideoCodecs);
|
|
|
|
Assert.NotEmpty(val.VideoCodecs);
|
|
|
|
Assert.NotEmpty(val.AudioCodecs);
|
|
|
|
Assert.NotEmpty(val.AudioCodecs);
|
|
|
|
|
|
|
|
|
|
|
|
// check expected container (todo: this could be a test param)
|
|
|
|
// Check expected container (todo: this could be a test param)
|
|
|
|
if (transcodeProtocol == "http")
|
|
|
|
if (transcodeProtocol == "http")
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Assert.Equal("webm", val.Container);
|
|
|
|
// Assert.Equal("webm", val.Container);
|
|
|
@ -403,32 +403,39 @@ namespace Jellyfin.Model.Tests
|
|
|
|
stream => Assert.DoesNotContain(stream.Codec, val.VideoCodecs));
|
|
|
|
stream => Assert.DoesNotContain(stream.Codec, val.VideoCodecs));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// todo: fill out tests here
|
|
|
|
// TODO: Fill out tests here
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DirectStream and Remux
|
|
|
|
// DirectStream and Remux
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check expected video codec (1)
|
|
|
|
// Check expected video codec (1)
|
|
|
|
Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec);
|
|
|
|
Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec);
|
|
|
|
Assert.Single(val.TargetVideoCodec);
|
|
|
|
Assert.Single(val.TargetVideoCodec);
|
|
|
|
|
|
|
|
|
|
|
|
if (transcodeMode == "DirectStream")
|
|
|
|
if (transcodeMode == "DirectStream")
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
// Check expected audio codecs (1)
|
|
|
|
if (!targetAudioStream.IsExternal)
|
|
|
|
if (!targetAudioStream.IsExternal)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check expected audio codecs (1)
|
|
|
|
if (val.TranscodeReasons.HasFlag(TranscodeReason.ContainerNotSupported))
|
|
|
|
Assert.DoesNotContain(targetAudioStream.Codec, val.AudioCodecs);
|
|
|
|
{
|
|
|
|
|
|
|
|
Assert.Contains(targetAudioStream.Codec, val.AudioCodecs);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Assert.DoesNotContain(targetAudioStream.Codec, val.AudioCodecs);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (transcodeMode == "Remux")
|
|
|
|
else if (transcodeMode == "Remux")
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// check expected audio codecs (1)
|
|
|
|
// Check expected audio codecs (1)
|
|
|
|
Assert.Contains(targetAudioStream.Codec, val.AudioCodecs);
|
|
|
|
Assert.Contains(targetAudioStream.Codec, val.AudioCodecs);
|
|
|
|
Assert.Single(val.AudioCodecs);
|
|
|
|
Assert.Single(val.AudioCodecs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// video details
|
|
|
|
// Video details
|
|
|
|
var videoStream = targetVideoStream;
|
|
|
|
var videoStream = targetVideoStream;
|
|
|
|
Assert.False(val.EstimateContentLength);
|
|
|
|
Assert.False(val.EstimateContentLength);
|
|
|
|
Assert.Equal(TranscodeSeekInfo.Auto, val.TranscodeSeekInfo);
|
|
|
|
Assert.Equal(TranscodeSeekInfo.Auto, val.TranscodeSeekInfo);
|
|
|
@ -437,10 +444,10 @@ namespace Jellyfin.Model.Tests
|
|
|
|
Assert.Equal(videoStream.BitDepth, val.TargetVideoBitDepth);
|
|
|
|
Assert.Equal(videoStream.BitDepth, val.TargetVideoBitDepth);
|
|
|
|
Assert.InRange(val.VideoBitrate.GetValueOrDefault(), videoStream.BitRate.GetValueOrDefault(), int.MaxValue);
|
|
|
|
Assert.InRange(val.VideoBitrate.GetValueOrDefault(), videoStream.BitRate.GetValueOrDefault(), int.MaxValue);
|
|
|
|
|
|
|
|
|
|
|
|
// audio codec not supported
|
|
|
|
// Audio codec not supported
|
|
|
|
if ((why & TranscodeReason.AudioCodecNotSupported) != 0)
|
|
|
|
if ((why & TranscodeReason.AudioCodecNotSupported) != 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// audio stream specified
|
|
|
|
// Audio stream specified
|
|
|
|
if (options.AudioStreamIndex >= 0)
|
|
|
|
if (options.AudioStreamIndex >= 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// TODO:fixme
|
|
|
|
// TODO:fixme
|
|
|
@ -450,10 +457,10 @@ namespace Jellyfin.Model.Tests
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// audio stream not specified
|
|
|
|
// Audio stream not specified
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// TODO:fixme
|
|
|
|
// TODO: Fixme
|
|
|
|
Assert.All(audioStreams, stream =>
|
|
|
|
Assert.All(audioStreams, stream =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!stream.IsExternal)
|
|
|
|
if (!stream.IsExternal)
|
|
|
|