42 lines
3.2 KiB
C#
42 lines
3.2 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using Jellyfin.Data.Enums;
|
|
using MediaBrowser.Model.Dlna;
|
|
using MediaBrowser.Model.Dto;
|
|
using MediaBrowser.Model.Entities;
|
|
using MediaBrowser.Model.MediaInfo;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
public static class NativeResolutionPolicyTests
|
|
{
|
|
public static void Run(Action<bool, string> check)
|
|
{
|
|
// Exercise the installed Jellyfin 12.2 negotiation code, including
|
|
// devices whose width/height conditions are optional rather than required.
|
|
foreach (var (width, height) in new[] { (720, 576), (1280, 720), (1920, 1080), (2560, 1440), (3840, 2160) })
|
|
foreach (var required in new[] { true, false })
|
|
{
|
|
var source = new MediaSourceInfo { Id = "test", Path = "http://127.0.0.1/test.m3u8", Protocol = MediaProtocol.Http,
|
|
Container = "hls", SupportsDirectPlay = false, SupportsDirectStream = true, SupportsProbing = false,
|
|
MediaStreams = new[] { new MediaStream { Type = MediaStreamType.Video, Index = -1, Codec = "h264", AverageFrameRate = 50, Profile = "Constrained Baseline" },
|
|
new MediaStream { Type = MediaStreamType.Audio, Index = -1, Codec = "aac", Channels = 2, SampleRate = 48000, IsDefault = true } } };
|
|
var profile = new DeviceProfile { Name = "Resolution contract", MaxStreamingBitrate = 100000000,
|
|
DirectPlayProfiles = new[] { new DirectPlayProfile { Container = "hls,ts", Type = DlnaProfileType.Video, VideoCodec = "h264", AudioCodec = "aac" } },
|
|
TranscodingProfiles = new[] { new TranscodingProfile { Container = "ts", Type = DlnaProfileType.Video, VideoCodec = "h264", AudioCodec = "aac", Protocol = MediaStreamProtocol.hls, Context = EncodingContext.Streaming } },
|
|
CodecProfiles = new[] { new CodecProfile { Codec = "h264", Type = CodecType.Video, Conditions = new[] {
|
|
new ProfileCondition { Property = ProfileConditionValue.Width, Condition = ProfileConditionType.LessThanEqual, Value = width.ToString(), IsRequired = required },
|
|
new ProfileCondition { Property = ProfileConditionValue.Height, Condition = ProfileConditionType.LessThanEqual, Value = height.ToString(), IsRequired = required } } } } };
|
|
var support = DispatchProxy.Create<ITranscoderSupport, ResolutionTranscoder>();
|
|
var stream = new StreamBuilder(support, NullLogger.Instance).GetOptimalVideoStream(new MediaOptions {
|
|
ItemId = Guid.NewGuid(), DeviceId = "test", Profile = profile, MediaSources = new[] { source }, EnableDirectPlay = true,
|
|
EnableDirectStream = true, AllowVideoStreamCopy = true, AllowAudioStreamCopy = true, MaxBitrate = 100000000, Context = EncodingContext.Streaming });
|
|
check(stream.MaxWidth == width && stream.MaxHeight == height && source.MediaStreams[0].Width == null,
|
|
$"native Jellyfin negotiates {width}x{height} without a plugin Full HD cap; required={required}");
|
|
}
|
|
}
|
|
}
|
|
public class ResolutionTranscoder : DispatchProxy
|
|
{
|
|
protected override object Invoke(MethodInfo method, object[] args) => method.ReturnType == typeof(bool) ? true : method.ReturnType == typeof(int) ? 2 : null;
|
|
}
|