From 053db71d448b2720b1bf96590bd2a2a5a4111071 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Mon, 1 Nov 2021 22:18:06 -0500 Subject: [PATCH] fix decimal separator in ffmpeg apad filter syntax (#464) --- CHANGELOG.md | 2 ++ .../FFmpeg/FFmpegComplexFilterBuilderTests.cs | 25 +++++++++++++++++-- .../FFmpeg/FFmpegComplexFilterBuilder.cs | 7 +++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82007df8e..714aaae3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Fixed +- Fix bug with audio filter in cultures where `.` is a group/thousands separator ## [0.2.2-alpha] - 2021-10-30 ### Fixed diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs index eb8c7c9db..b9aaac7c2 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegComplexFilterBuilderTests.cs @@ -27,7 +27,28 @@ namespace ErsatzTV.Core.Tests.FFmpeg [Test] public void Should_Return_Audio_Filter_With_AudioDuration() { - var duration = TimeSpan.FromMinutes(54); + var duration = TimeSpan.FromMilliseconds(1000.1); + FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() + .WithAlignedAudio(duration); + + Option result = builder.Build(0, 1); + + 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"); + }); + } + + [Test] + // this needs to be a culture where '.' is a group separator + [SetCulture("it-IT")] + public void Should_Return_Audio_Filter_With_AudioDuration_Decimal() + { + var duration = TimeSpan.FromMilliseconds(1000.1); FFmpegComplexFilterBuilder builder = new FFmpegComplexFilterBuilder() .WithAlignedAudio(duration); @@ -37,7 +58,7 @@ namespace ErsatzTV.Core.Tests.FFmpeg result.IfSome( filter => { - filter.ComplexFilter.Should().Be($"[0:1]apad=whole_dur={duration.TotalMilliseconds}ms[a]"); + filter.ComplexFilter.Should().Be("[0:1]apad=whole_dur=1000.1ms[a]"); filter.AudioLabel.Should().Be("[a]"); filter.VideoLabel.Should().Be("0:0"); }); diff --git a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs index ffd927535..1bc135ade 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Text; using ErsatzTV.Core.Domain; @@ -111,7 +112,11 @@ namespace ErsatzTV.Core.FFmpeg } _audioDuration.IfSome( - audioDuration => audioFilterQueue.Add($"apad=whole_dur={audioDuration.TotalMilliseconds}ms")); + audioDuration => + { + var durationString = audioDuration.TotalMilliseconds.ToString(NumberFormatInfo.InvariantInfo); + audioFilterQueue.Add($"apad=whole_dur={durationString}ms"); + }); bool usesHardwareFilters = acceleration != HardwareAccelerationKind.None && !isHardwareDecode && (_deinterlace || _scaleToSize.IsSome);