using ErsatzTV.FFmpeg.Format; using ErsatzTV.FFmpeg.InputOption; using ErsatzTV.FFmpeg.State; namespace ErsatzTV.FFmpeg; public abstract record InputFile(string Path, IList Streams) { public List InputOptions { get; } = new(); public List FilterSteps { get; } = new(); } public record ConcatInputFile(string Url, FrameSize Resolution) : InputFile( Url, new List { new VideoStream( 0, string.Empty, Option.None, ColorParams.Default, Resolution, string.Empty, string.Empty, Option.None, false, ScanKind.Unknown) }) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record AudioInputFile(string Path, IList AudioStreams, AudioState DesiredState) : InputFile( Path, AudioStreams.Cast().ToList()) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record NullAudioInputFile : AudioInputFile { public NullAudioInputFile(AudioState DesiredState) : base( "anullsrc", new List { new(0, "unknown", -1) }, DesiredState) => InputOptions.Add(new LavfiInputOption()); public void Deconstruct(out AudioState DesiredState) => DesiredState = this.DesiredState; } public record VideoInputFile(string Path, IList VideoStreams) : InputFile( Path, VideoStreams.Cast().ToList()) { public void AddOption(IInputOption option) { if (option.AppliesTo(this)) { InputOptions.Add(option); } } } public record WatermarkInputFile (string Path, IList VideoStreams, WatermarkState DesiredState) : VideoInputFile(Path, VideoStreams); public record SubtitleInputFile(string Path, IList SubtitleStreams, SubtitleMethod Method) : InputFile( Path, SubtitleStreams) { public bool IsImageBased => SubtitleStreams.All( s => s.Codec is "hdmv_pgs_subtitle" or "dvd_subtitle" or "dvdsub" or "vobsub" or "pgssub" or "pgs"); }