public StreamInfo() { AudioCodecs = new string[] { }; VideoCodecs = new string[] { }; SubtitleCodecs = new string[] { }; TranscodeReasons = new TranscodeReason[] { }; StreamOptions = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); }
private StreamInfo?BuildVideoItemSimpleTest(VideoOptions options, PlayMethod?playMethod, TranscodeReason why, string transcodeMode, string transcodeProtocol) { if (string.IsNullOrEmpty(transcodeProtocol)) { transcodeProtocol = playMethod == PlayMethod.DirectStream ? "http" : "HLS.ts"; } var builder = GetStreamBuilder(); var val = builder.BuildVideoItem(options); Assert.NotNull(val); if (playMethod != null) { Assert.Equal(playMethod, val.PlayMethod); } Assert.Equal(why, val.TranscodeReasons); var audioStreamIndexInput = options.AudioStreamIndex; var targetVideoStream = val.TargetVideoStream; var targetAudioStream = val.TargetAudioStream; var mediaSource = options.MediaSources.First(source => source.Id == val.MediaSourceId); Assert.NotNull(mediaSource); var videoStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Video); var audioStreams = mediaSource.MediaStreams.Where(stream => stream.Type == MediaStreamType.Audio); // TODO: Check AudioStreamIndex vs options.AudioStreamIndex var inputAudioStream = mediaSource.GetDefaultAudioStream(audioStreamIndexInput ?? mediaSource.DefaultAudioStreamIndex); var uri = ParseUri(val); if (playMethod == PlayMethod.DirectPlay) { // Check expected container var containers = ContainerProfile.SplitValue(mediaSource.Container); // TODO: Test transcode too // Assert.Contains(uri.Extension, containers); // Check expected video codec (1) Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec); Assert.Single(val.TargetVideoCodec); // Check expected audio codecs (1) Assert.Contains(targetAudioStream.Codec, val.TargetAudioCodec); Assert.Single(val.TargetAudioCodec); // Assert.Single(val.AudioCodecs); if (transcodeMode == "DirectStream") { Assert.Equal(val.Container, uri.Extension); } } else if (playMethod == PlayMethod.DirectStream || playMethod == PlayMethod.Transcode) { Assert.NotNull(val.Container); Assert.NotEmpty(val.VideoCodecs); Assert.NotEmpty(val.AudioCodecs); // Check expected container (todo: this could be a test param) if (transcodeProtocol == "http") { // Assert.Equal("webm", val.Container); Assert.Equal(val.Container, uri.Extension); Assert.Equal("stream", uri.Filename); Assert.Equal("http", val.SubProtocol); } else if (transcodeProtocol == "HLS.mp4") { Assert.Equal("mp4", val.Container); Assert.Equal("m3u8", uri.Extension); Assert.Equal("master", uri.Filename); Assert.Equal("hls", val.SubProtocol); } else { Assert.Equal("ts", val.Container); Assert.Equal("m3u8", uri.Extension); Assert.Equal("master", uri.Filename); Assert.Equal("hls", val.SubProtocol); } // Full transcode if (transcodeMode == "Transcode") { if ((val.TranscodeReasons & (StreamBuilder.ContainerReasons | TranscodeReason.DirectPlayError)) == 0) { Assert.All( videoStreams, stream => Assert.DoesNotContain(stream.Codec, val.VideoCodecs)); } // TODO: Fill out tests here } // DirectStream and Remux else { // Check expected video codec (1) Assert.Contains(targetVideoStream.Codec, val.TargetVideoCodec); Assert.Single(val.TargetVideoCodec); if (transcodeMode == "DirectStream") { // Check expected audio codecs (1) if (!targetAudioStream.IsExternal) { if (val.TranscodeReasons.HasFlag(TranscodeReason.ContainerNotSupported)) { Assert.Contains(targetAudioStream.Codec, val.AudioCodecs); } else { Assert.DoesNotContain(targetAudioStream.Codec, val.AudioCodecs); } } } else if (transcodeMode == "Remux") { // Check expected audio codecs (1) Assert.Contains(targetAudioStream.Codec, val.AudioCodecs); Assert.Single(val.AudioCodecs); } // Video details var videoStream = targetVideoStream; Assert.False(val.EstimateContentLength); Assert.Equal(TranscodeSeekInfo.Auto, val.TranscodeSeekInfo); Assert.Contains(videoStream.Profile?.ToLowerInvariant() ?? string.Empty, val.TargetVideoProfile?.Split(",").Select(s => s.ToLowerInvariant()) ?? Array.Empty <string>()); Assert.Equal(videoStream.Level, val.TargetVideoLevel); Assert.Equal(videoStream.BitDepth, val.TargetVideoBitDepth); Assert.InRange(val.VideoBitrate.GetValueOrDefault(), videoStream.BitRate.GetValueOrDefault(), int.MaxValue); // Audio codec not supported if ((why & TranscodeReason.AudioCodecNotSupported) != 0) { // Audio stream specified if (options.AudioStreamIndex >= 0) { // TODO:fixme if (!targetAudioStream.IsExternal) { Assert.DoesNotContain(targetAudioStream.Codec, val.AudioCodecs); } } // Audio stream not specified else { // TODO: Fixme Assert.All(audioStreams, stream => { if (!stream.IsExternal) { Assert.DoesNotContain(stream.Codec, val.AudioCodecs); } }); } } } } else if (playMethod == null) { Assert.Null(val.SubProtocol); Assert.Equal("stream", uri.Filename); Assert.False(val.EstimateContentLength); Assert.Equal(TranscodeSeekInfo.Auto, val.TranscodeSeekInfo); } return(val); }
public async Task BuildVideoItemWithDirectPlayExplicitStreams(string deviceName, string mediaSource, PlayMethod?playMethod, TranscodeReason why = (TranscodeReason)0, string transcodeMode = "DirectStream", string transcodeProtocol = "") { var options = await GetVideoOptions(deviceName, mediaSource); var streamCount = options.MediaSources[0].MediaStreams.Count; if (streamCount > 0) { options.AudioStreamIndex = streamCount - 2; options.SubtitleStreamIndex = streamCount - 1; } var streamInfo = BuildVideoItemSimpleTest(options, playMethod, why, transcodeMode, transcodeProtocol); Assert.Equal(streamInfo?.AudioStreamIndex, options.AudioStreamIndex); Assert.Equal(streamInfo?.SubtitleStreamIndex, options.SubtitleStreamIndex); }
public async Task BuildVideoItemSimple(string deviceName, string mediaSource, PlayMethod?playMethod, TranscodeReason why = (TranscodeReason)0, string transcodeMode = "DirectStream", string transcodeProtocol = "") { var options = await GetVideoOptions(deviceName, mediaSource); BuildVideoItemSimpleTest(options, playMethod, why, transcodeMode, transcodeProtocol); }