public void Should_Return_Software_Video_Filter( bool deinterlace, bool scale, bool pad, string expectedVideoFilter, string expectedVideoLabel) { FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithDeinterlace(deinterlace); if (scale) { builder = builder.WithScaling(new Resolution { Width = 1920, Height = 1000 }); } if (pad) { builder = builder.WithBlackBars(new Resolution { Width = 1920, Height = 1080 }); } Option <FFmpegComplexFilter> result = builder.Build(false, 0, 0, 0, 1, false); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be(expectedVideoFilter); filter.AudioLabel.Should().Be("0:1"); filter.VideoLabel.Should().Be(expectedVideoLabel); }); }
public void Should_Return_Watermark( bool alignAudio, bool deinterlace, bool intermittent, WatermarkLocation location, bool scaled, int opacity, string expectedVideoFilter, string expectedAudioLabel, string expectedVideoLabel) { var watermark = new ChannelWatermark { Mode = intermittent ? ChannelWatermarkMode.Intermittent : ChannelWatermarkMode.Permanent, DurationSeconds = intermittent ? 15 : 0, FrequencyMinutes = intermittent ? 10 : 0, Location = location, Size = scaled ? WatermarkSize.Scaled : WatermarkSize.ActualSize, WidthPercent = scaled ? 20 : 0, Opacity = opacity, HorizontalMarginPercent = 7, VerticalMarginPercent = 5 }; Option <List <FadePoint> > maybeFadePoints = watermark.Mode == ChannelWatermarkMode.Intermittent ? Some( WatermarkCalculator.CalculateFadePoints( new DateTimeOffset(2022, 01, 31, 12, 25, 0, TimeSpan.FromHours(-5)), TimeSpan.Zero, TimeSpan.FromMinutes(55), TimeSpan.Zero, watermark.FrequencyMinutes, watermark.DurationSeconds)) : None; FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithWatermark( Some(watermark), maybeFadePoints, new Resolution { Width = 1920, Height = 1080 }, None) .WithDeinterlace(deinterlace) .WithAlignedAudio(alignAudio ? Some(TimeSpan.FromMinutes(55)) : None); Option <FFmpegComplexFilter> result = builder.Build(false, 0, 0, 0, 1, false); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be(expectedVideoFilter); filter.AudioLabel.Should().Be(expectedAudioLabel); filter.VideoLabel.Should().Be(expectedVideoLabel); }); }
public void Should_Return_None_With_No_Filters() { var builder = new FFmpegComplexFilterBuilder(); Option <FFmpegComplexFilter> result = builder.Build(false, 0, 0, 0, 1, false); result.IsNone.Should().BeTrue(); }
public void Should_Return_Audio_Filter_With_AudioDuration_Decimal() { var duration = TimeSpan.FromMilliseconds(1000.1); FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithAlignedAudio(duration); Option <FFmpegComplexFilter> result = builder.Build(false, 0, 0, 0, 1, false); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be("[0:1]apad=whole_dur=1000.1ms[a]"); filter.AudioLabel.Should().Be("[a]"); filter.VideoLabel.Should().Be("0:0"); }); }
public void Should_Return_Audio_Filter_With_AudioDuration() { var duration = TimeSpan.FromMinutes(54); FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithAlignedAudio(duration); Option <FFmpegComplexFilter> result = builder.Build(); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be($"[0:a]apad=whole_dur={duration.TotalMilliseconds}ms[a]"); filter.AudioLabel.Should().Be("[a]"); filter.VideoLabel.Should().Be("0:V"); }); }
public void Should_Return_Audio_And_Video_Filter() { var duration = TimeSpan.FromMinutes(54); FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithAlignedAudio(duration) .WithDeinterlace(true); Option <FFmpegComplexFilter> result = builder.Build(false, 0, 0, 0, 1, false); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be( $"[0:1]apad=whole_dur={duration.TotalMilliseconds}ms[a];[0:0]yadif=1[v]"); filter.AudioLabel.Should().Be("[a]"); filter.VideoLabel.Should().Be("[v]"); }); }
public void Should_Return_VAAPI_Video_Filter( string codec, bool deinterlace, bool scale, bool pad, string expectedVideoFilter, string expectedVideoLabel) { FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithHardwareAcceleration(HardwareAccelerationKind.Vaapi) .WithInputCodec(codec) .WithDeinterlace(deinterlace); if (scale) { builder = builder.WithScaling(new Resolution { Width = 1920, Height = 1000 }); } if (pad) { builder = builder.WithBlackBars(new Resolution { Width = 1920, Height = 1080 }); } Option <FFmpegComplexFilter> result = builder.Build(); result.IsSome.Should().BeTrue(); result.IfSome( filter => { filter.ComplexFilter.Should().Be(expectedVideoFilter); filter.AudioLabel.Should().Be("0:a"); filter.VideoLabel.Should().Be(expectedVideoLabel); }); }