From 0c2adff4b190dacb9bff8f79f1719dda9cc76129 Mon Sep 17 00:00:00 2001 From: Samuele Lorefice Date: Wed, 24 Dec 2025 15:47:54 +0100 Subject: [PATCH] Added resume from computation --- EncodingSampleTest/Program.cs | 68 +++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/EncodingSampleTest/Program.cs b/EncodingSampleTest/Program.cs index 58c94f6..df471c3 100644 --- a/EncodingSampleTest/Program.cs +++ b/EncodingSampleTest/Program.cs @@ -19,6 +19,23 @@ StringBuilder AV1CPUStats = new(tableHeader); StringBuilder HEVCCPUStats = new(tableHeader); StringBuilder H264CPUStats = new(tableHeader); +const string Av1NvencStatsFile = "AV1_NVENC_Stats.tsv"; +const string HevcNvencStatsFile = "HEVC_NVENC_Stats.tsv"; +const string H264NvencStatsFile = "H264_NVENC_Stats.tsv"; +const string Av1CpuStatsFile = "AV1_CPU_Stats.tsv"; +const string HevcCpuStatsFile = "HEVC_CPU_Stats.tsv"; +const string H264CpuStatsFile = "H264_CPU_Stats.tsv"; + +string GetStatsFilePath(Encoder encoder) => encoder switch { + Encoder.AV1_NVENC => Path.Combine(outputDir, Av1NvencStatsFile), + Encoder.HEVC_NVENC => Path.Combine(outputDir, HevcNvencStatsFile), + Encoder.H264_NVENC => Path.Combine(outputDir, H264NvencStatsFile), + Encoder.AV1_CPU => Path.Combine(outputDir, Av1CpuStatsFile), + Encoder.HEVC_CPU => Path.Combine(outputDir, HevcCpuStatsFile), + Encoder.H264_CPU => Path.Combine(outputDir, H264CpuStatsFile), + _ => throw new ArgumentOutOfRangeException(nameof(encoder), encoder, null) +}; + GlobalFFOptions.Configure(options => { options.BinaryFolder = ffmpegPath; options.TemporaryFilesFolder = tempPath; @@ -27,6 +44,19 @@ GlobalFFOptions.Configure(options => { if(!File.Exists(inputFile)) return; +if (File.Exists(GetStatsFilePath(Encoder.AV1_NVENC))) + AV1GPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.AV1_NVENC))); +if (File.Exists(GetStatsFilePath(Encoder.HEVC_NVENC))) + HEVCGPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.HEVC_NVENC))); +if (File.Exists(GetStatsFilePath(Encoder.H264_NVENC))) + H264GPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.H264_NVENC))); +if (File.Exists(GetStatsFilePath(Encoder.AV1_CPU))) + AV1CPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.AV1_CPU))); +if (File.Exists(GetStatsFilePath(Encoder.HEVC_CPU))) + HEVCCPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.HEVC_CPU))); +if (File.Exists(GetStatsFilePath(Encoder.H264_CPU))) + H264CPUStats.Clear().Append(File.ReadAllText(GetStatsFilePath(Encoder.H264_CPU))); + var originalFile = new FileInfo(inputFile); var mediaInfo = FFProbe.Analyse(inputFile); if (mediaInfo.PrimaryVideoStream == null) { @@ -42,15 +72,31 @@ CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; Console.WriteLine("Generating Tasks:"); +bool dataExists(int width, int height, Encoder encoder, int cq, int preset) { + StringBuilder stats = encoder switch { + Encoder.AV1_NVENC => AV1GPUStats, + Encoder.HEVC_NVENC => HEVCGPUStats, + Encoder.H264_NVENC => H264GPUStats, + Encoder.AV1_CPU => AV1CPUStats, + Encoder.HEVC_CPU => HEVCCPUStats, + Encoder.H264_CPU => H264CPUStats, + _ => throw new ArgumentOutOfRangeException(nameof(encoder), encoder, null) + }; + string searchLineStart = $"{width}\t{height}\t{preset}\t{cq}\t"; + return stats.ToString().Contains(searchLineStart); +} + for (int cq = 24; cq <= 34; cq++) { for (int preset = 12; preset <= 18; preset++) { //GpuTasks.Add(Encode(Encoder.AV1_NVENC, 1280, 720, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.AV1_NVENC, 1920, 1080, cq, preset, cancellationToken)); - GpuTasks.Add(Encode(Encoder.AV1_NVENC, W, H, cq, preset, cancellationToken)); + if(!dataExists(W, H, Encoder.AV1_NVENC, cq, preset)) + GpuTasks.Add(Encode(Encoder.AV1_NVENC, W, H, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.HEVC_NVENC, 1280, 720, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.HEVC_NVENC, 1920, 1080, cq, preset, cancellationToken)); - GpuTasks.Add(Encode(Encoder.HEVC_NVENC, W, H, cq, preset, cancellationToken)); + if(!dataExists(W, H, Encoder.HEVC_NVENC, cq, preset)) + GpuTasks.Add(Encode(Encoder.HEVC_NVENC, W, H, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.H264_NVENC, 1280, 720, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.H264_NVENC, 1920, 1080, cq, preset, cancellationToken)); @@ -59,12 +105,14 @@ for (int cq = 24; cq <= 34; cq++) { for (int preset = 3; preset <= 10; preset++) { //CpuTasks.Add(Encode(Encoder.AV1_CPU, 1280, 720, cq, preset, cancellationToken)); //CpuTasks.Add(Encode(Encoder.AV1_CPU, 1920, 1080, cq, preset, cancellationToken)); - CpuTasks.Add(Encode(Encoder.AV1_CPU, W, H, cq, preset, cancellationToken)); + if(!dataExists(W, H, Encoder.AV1_CPU, cq, preset)) + CpuTasks.Add(Encode(Encoder.AV1_CPU, W, H, cq, preset, cancellationToken)); } for (int preset = 2; preset <= 5; preset++) { //CpuTasks.Add(Encode(Encoder.HEVC_CPU, 1280, 720, cq, preset, cancellationToken)); //CpuTasks.Add(Encode(Encoder.HEVC_CPU, 1920, 1080, cq, preset, cancellationToken)); - CpuTasks.Add(Encode(Encoder.HEVC_CPU, W, H, cq, preset, cancellationToken)); + if (!dataExists(W, H, Encoder.HEVC_CPU, cq, preset)) + CpuTasks.Add(Encode(Encoder.HEVC_CPU, W, H, cq, preset, cancellationToken)); //CpuTasks.Add(Encode(Encoder.H264_CPU, 1280, 720, cq, preset, cancellationToken)); //CpuTasks.Add(Encode(Encoder.H264_CPU, 1920, 1080, cq, preset, cancellationToken)); @@ -321,9 +369,15 @@ async Task> ComputePSNRScore(string referenceFile, string dis foreach (var line in PsnrLog) { if (!line.Contains("mse_avg:")) continue; // Skip header and irrelevant lines string[] parts = line.Split(' '); - foreach (var part in parts) { - if (part.StartsWith("psnr_avg:")) psnrVals.Add(float.Parse(part.Split(':')[1])); - if (part.StartsWith("mse_avg:")) mseVals.Add(float.Parse(part.Split(':')[1])); + foreach (var part in parts) { + if (part.StartsWith("psnr_avg:")) { + var val = part.Split(':')[1]; + psnrVals.Add(val == "inf" ? float.PositiveInfinity : float.Parse(val)); + } + if (part.StartsWith("mse_avg:")) { + var val = part.Split(':')[1]; + mseVals.Add(val == "inf" ? float.PositiveInfinity : float.Parse(val)); + } } } PSNR = psnrVals.Count > 0 ? psnrVals.Average() : -1;