using ADOFAIRenderer.Util.FFmpeg; namespace ADOFAIRenderer.Data { public class RenderConfig { public double RenderFPS { get; set; } public double VideoFPS { get; set; } public int RenderWidth { get; set; } public int RenderHeight { get; set; } public VideoEncodingConfig? VideoConfig { get; set; } public AudioEncodingConfig? AudioConfig { get; set; } public double DelayAfterLevelEnd { get; set; } public bool ShowJudgementText { get; set; } public int? RandomSeed { get; set; } = null; public bool ProcessAudio { get; set; } // 하위 호환 및 편의를 위한 접근자 public bool RenderAudio { get => AudioConfig?.RenderAudio ?? true; set => (AudioConfig ??= new AudioEncodingConfig()).RenderAudio = value; } public int AudioSampleRate { get => AudioConfig?.AudioSampleRate ?? 44100; set { (AudioConfig ??= new AudioEncodingConfig()).AudioSampleRate = value; } } public int AudioChannels { get => AudioConfig?.AudioChannels ?? 2; set { (AudioConfig ??= new AudioEncodingConfig()).AudioChannels = value; } } public int AudioBitrate { get => AudioConfig?.AudioBitrate ?? 256000; set { (AudioConfig ??= new AudioEncodingConfig()).AudioBitrate = value; } } } public class VideoEncodingConfig { public Codec Codec { get; set; } = Codec.H264; public RateControlMode RateControlMode { get; set; } public int Bitrate { get; set; } public int MaxBitrate { get; set; } // ReSharper disable once InconsistentNaming public int QP { get; set; } public double KeyframeInterval { get; set; } public bool ForceSoftwareEncoder { get; set; } } public class AudioEncodingConfig { public bool RenderAudio { get; set; } = true; public int AudioSampleRate { get; set; } = 44100; public int AudioChannels { get; set; } = 2; public int AudioBitrate { get; set; } = 256000; } }