Added resume from computation

This commit is contained in:
Samuele Lorefice
2025-12-24 15:47:54 +01:00
parent 2882bac37c
commit 0c2adff4b1

View File

@@ -19,6 +19,23 @@ StringBuilder AV1CPUStats = new(tableHeader);
StringBuilder HEVCCPUStats = new(tableHeader); StringBuilder HEVCCPUStats = new(tableHeader);
StringBuilder H264CPUStats = 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 => { GlobalFFOptions.Configure(options => {
options.BinaryFolder = ffmpegPath; options.BinaryFolder = ffmpegPath;
options.TemporaryFilesFolder = tempPath; options.TemporaryFilesFolder = tempPath;
@@ -27,6 +44,19 @@ GlobalFFOptions.Configure(options => {
if(!File.Exists(inputFile)) return; 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 originalFile = new FileInfo(inputFile);
var mediaInfo = FFProbe.Analyse(inputFile); var mediaInfo = FFProbe.Analyse(inputFile);
if (mediaInfo.PrimaryVideoStream == null) { if (mediaInfo.PrimaryVideoStream == null) {
@@ -42,14 +72,30 @@ CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationTokenSource.Token; CancellationToken cancellationToken = cancellationTokenSource.Token;
Console.WriteLine("Generating Tasks:"); 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 cq = 24; cq <= 34; cq++) {
for (int preset = 12; preset <= 18; preset++) { for (int preset = 12; preset <= 18; preset++) {
//GpuTasks.Add(Encode(Encoder.AV1_NVENC, 1280, 720, cq, preset, cancellationToken)); //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, 1920, 1080, 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.AV1_NVENC, W, H, cq, preset, cancellationToken));
//GpuTasks.Add(Encode(Encoder.HEVC_NVENC, 1280, 720, 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, 1920, 1080, 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.HEVC_NVENC, W, H, cq, preset, cancellationToken));
//GpuTasks.Add(Encode(Encoder.H264_NVENC, 1280, 720, cq, preset, cancellationToken)); //GpuTasks.Add(Encode(Encoder.H264_NVENC, 1280, 720, cq, preset, cancellationToken));
@@ -59,11 +105,13 @@ for (int cq = 24; cq <= 34; cq++) {
for (int preset = 3; preset <= 10; preset++) { for (int preset = 3; preset <= 10; preset++) {
//CpuTasks.Add(Encode(Encoder.AV1_CPU, 1280, 720, cq, preset, cancellationToken)); //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, 1920, 1080, cq, preset, cancellationToken));
if(!dataExists(W, H, Encoder.AV1_CPU, cq, preset))
CpuTasks.Add(Encode(Encoder.AV1_CPU, W, H, cq, preset, cancellationToken)); CpuTasks.Add(Encode(Encoder.AV1_CPU, W, H, cq, preset, cancellationToken));
} }
for (int preset = 2; preset <= 5; preset++) { for (int preset = 2; preset <= 5; preset++) {
//CpuTasks.Add(Encode(Encoder.HEVC_CPU, 1280, 720, cq, preset, cancellationToken)); //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, 1920, 1080, 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.HEVC_CPU, W, H, cq, preset, cancellationToken));
//CpuTasks.Add(Encode(Encoder.H264_CPU, 1280, 720, cq, preset, cancellationToken)); //CpuTasks.Add(Encode(Encoder.H264_CPU, 1280, 720, cq, preset, cancellationToken));
@@ -322,8 +370,14 @@ async Task<Tuple<float,float>> ComputePSNRScore(string referenceFile, string dis
if (!line.Contains("mse_avg:")) continue; // Skip header and irrelevant lines if (!line.Contains("mse_avg:")) continue; // Skip header and irrelevant lines
string[] parts = line.Split(' '); string[] parts = line.Split(' ');
foreach (var part in parts) { foreach (var part in parts) {
if (part.StartsWith("psnr_avg:")) psnrVals.Add(float.Parse(part.Split(':')[1])); if (part.StartsWith("psnr_avg:")) {
if (part.StartsWith("mse_avg:")) mseVals.Add(float.Parse(part.Split(':')[1])); 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; PSNR = psnrVals.Count > 0 ? psnrVals.Average() : -1;