diff --git a/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioTrackReorder.cs b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioTrackReorder.cs index 9bd836c9..80e10dd6 100644 --- a/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioTrackReorder.cs +++ b/VideoNodes/FfmpegBuilderNodes/Audio/FfmpegBuilderAudioTrackReorder.cs @@ -124,22 +124,25 @@ public class FfmpegBuilderAudioTrackReorder : FfmpegBuilderNode /// the type to reorder /// the reordered tracks public List Reorder(List input) where T : FfmpegStream + => Reorder(Languages, OrderedTracks, Channels, input); + + public static List Reorder(List languages, List orderedTracks, List channels, List input) where T : FfmpegStream { - Languages ??= new List(); - OrderedTracks ??= new List(); - Channels ??= new List(); - List actualChannels = Channels.Select(x => + languages ??= new List(); + orderedTracks ??= new List(); + channels ??= new List(); + List actualChannels = channels.Select(x => { if (float.TryParse(x, out float value)) return value; return -1f; }).Where(x => x > 0f).ToList(); - if (Languages.Any() == false && OrderedTracks.Any() == false && actualChannels.Any() == false) + if (languages.Any() == false && orderedTracks.Any() == false && actualChannels.Any() == false) return input; // nothing to do - Languages.Reverse(); - OrderedTracks.Reverse(); + languages.Reverse(); + orderedTracks.Reverse(); actualChannels.Reverse(); const int base_number = 1_000_000_000; @@ -153,15 +156,15 @@ public class FfmpegBuilderAudioTrackReorder : FfmpegBuilderNode if (x is FfmpegAudioStream audioStream) { - langIndex = Languages.IndexOf(audioStream.Stream.Language?.ToLower() ?? String.Empty); - codecIndex = OrderedTracks.IndexOf(audioStream.Stream.Codec?.ToLower() ?? String.Empty); - float channels = audioStream.Channels > 0 ? audioStream.Channels : audioStream.Stream.Channels; - channelIndex = actualChannels.IndexOf(channels); + langIndex = languages.IndexOf(audioStream.Stream.Language?.ToLower() ?? String.Empty); + codecIndex = orderedTracks.IndexOf(audioStream.Stream.Codec?.ToLower() ?? String.Empty); + float asChannels = audioStream.Channels > 0 ? audioStream.Channels : audioStream.Stream.Channels; + channelIndex = actualChannels.IndexOf(asChannels); } else if (x is FfmpegSubtitleStream subStream) { - langIndex = Languages.IndexOf(subStream.Stream.Language?.ToLower() ?? String.Empty); - codecIndex = OrderedTracks.IndexOf(subStream.Stream.Codec?.ToLower() ?? String.Empty); + langIndex = languages.IndexOf(subStream.Stream.Language?.ToLower() ?? String.Empty); + codecIndex = orderedTracks.IndexOf(subStream.Stream.Codec?.ToLower() ?? String.Empty); } int result = base_number; diff --git a/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderNode.cs b/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderNode.cs index fdb254c7..5b375e67 100644 --- a/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderNode.cs +++ b/VideoNodes/FfmpegBuilderNodes/FfmpegBuilderNode.cs @@ -39,8 +39,8 @@ namespace FileFlows.VideoNodes.FfmpegBuilderNodes { get { - if (Args.Variables.ContainsKey(MODEL_KEY)) - return Args.Variables[MODEL_KEY] as FfmpegModel; + if (Args.Variables.TryGetValue(MODEL_KEY, out var variable)) + return variable as FfmpegModel; return null; } set diff --git a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_AddAudioTests.cs b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_AddAudioTests.cs index 677687c8..4f26007d 100644 --- a/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_AddAudioTests.cs +++ b/VideoNodes/Tests/FfmpegBuilderTests/FfmpegBuilder_AddAudioTests.cs @@ -1,6 +1,7 @@ #if(DEBUG) using FileFlows.VideoNodes.FfmpegBuilderNodes; +using FileFlows.VideoNodes.FfmpegBuilderNodes.Models; using Microsoft.VisualStudio.TestTools.UnitTesting; using VideoNodes.Tests; @@ -166,6 +167,42 @@ public class FfmpegBuilder_AddAudioTests Assert.AreEqual("AAC", best.Codec); Assert.AreEqual(2f, best.Channels); } + + [TestMethod] + public void FfmpegBuilder_AddAudio_Basic() + { + Prepare(); + + FfmpegBuilderAudioAddTrack ffAddAudio = new(); + ffAddAudio.Codec = "dts"; + ffAddAudio.Channels = 1; + ffAddAudio.Index = 1000; + ffAddAudio.PreExecute(args); + var output = ffAddAudio.Execute(args); + Assert.AreEqual(1, output); + + FfmpegModel model = (FfmpegModel)args.Variables["FfmpegBuilderModel"]; + var last = model.AudioStreams.Last(); + Assert.AreEqual(1, last.Channels); + } + + [TestMethod] + public void FfmpegBuilder_AddAudio_Basic_2() + { + Prepare(); + + FfmpegBuilderAudioAddTrack ffAddAudio = new(); + ffAddAudio.Codec = "dts"; + ffAddAudio.Channels = 2; + ffAddAudio.Index = 1000; + ffAddAudio.PreExecute(args); + var output = ffAddAudio.Execute(args); + Assert.AreEqual(1, output); + + FfmpegModel model = (FfmpegModel)args.Variables["FfmpegBuilderModel"]; + var last = model.AudioStreams.Last(); + Assert.AreEqual(2, last.Channels); + } } #endif \ No newline at end of file