Beispiel #1
0
 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);
        }