fix: 04_Encode_HEVC - use RcLookahead from Flow model, add size safety net, update JSDoc

This commit is contained in:
sascha 2026-07-17 19:38:32 +02:00
parent 02c1db0cbc
commit b04221cce4

View file

@ -1,11 +1,10 @@
/** /**
* @author Sascha (Port von Tdarr_Plugin_Custom_MKV_H265_DE_v400) * @author Sascha (Port von Tdarr_Plugin_Custom_MKV_H265_DE_v400)
* @description HEVC NVENC VBR CQ fuer 1080p Material mit deutschen Audiospuren. * @description HEVC NVENC VBR CQ fuer 1080p Material mit deutschen Audiospuren.
* Slot 0 = AAC 2.0 192k DE (DEFAULT), Slot 1+ = beste DE copy, dann * Slot 0 = EAC3-Kompat bei DTS, sonst copy. Alle Untertitel bleiben erhalten.
* weitere DE, dann alle EN. Alle Untertitel bleiben erhalten.
* CUDA HW-Decode. HDR/DV-aware. Idempotent (kein Re-Re-Encode). * CUDA HW-Decode. HDR/DV-aware. Idempotent (kein Re-Re-Encode).
* @revision 2 * GROESSEN-SICHERHEITSNETZ: Output <= Original + 5% Toleranz.
* @uid 4f1c2a90-1111-4b00-8a01-0000000000a4 * @revision 3
* @output Encode erfolgreich * @output Encode erfolgreich
* @output Skip / Fehler * @output Skip / Fehler
* @param {int} TargetBitrateMbit Ziel-Bitrate in Mbit/s (b:v) * @param {int} TargetBitrateMbit Ziel-Bitrate in Mbit/s (b:v)
@ -13,14 +12,16 @@
* @param {int} SkipThresholdMbit Wenn Quelle <= dieser Wert (Mbit/s): HEVC copy, sonst encode * @param {int} SkipThresholdMbit Wenn Quelle <= dieser Wert (Mbit/s): HEVC copy, sonst encode
* @param {string} Preset NVENC Preset p1..p7 * @param {string} Preset NVENC Preset p1..p7
* @param {int} CQ Constant Quality * @param {int} CQ Constant Quality
* @param {int} RcLookahead NVENC rc-lookahead Frames (Default 32)
*/ */
function Script(TargetBitrateMbit, MaxrateMbit, SkipThresholdMbit, Preset, CQ) function Script(TargetBitrateMbit, MaxrateMbit, SkipThresholdMbit, Preset, CQ, RcLookahead)
{ {
TargetBitrateMbit = TargetBitrateMbit || 5; TargetBitrateMbit = TargetBitrateMbit || 5;
MaxrateMbit = MaxrateMbit || 8; MaxrateMbit = MaxrateMbit || 8;
SkipThresholdMbit = SkipThresholdMbit || 5; SkipThresholdMbit = SkipThresholdMbit || 5;
Preset = Preset || 'p7'; Preset = Preset || 'p7';
CQ = CQ || 24; CQ = CQ || 24;
RcLookahead = RcLookahead || 32;
let TARGET = TargetBitrateMbit * 1000000; let TARGET = TargetBitrateMbit * 1000000;
let MAXRATE = MaxrateMbit * 1000000; let MAXRATE = MaxrateMbit * 1000000;
@ -138,7 +139,7 @@ function Script(TargetBitrateMbit, MaxrateMbit, SkipThresholdMbit, Preset, CQ)
'-preset', Preset, '-preset', Preset,
'-spatial_aq', '1', '-spatial_aq', '1',
'-temporal_aq', '1', '-temporal_aq', '1',
'-rc-lookahead', '32', '-rc-lookahead', '' + RcLookahead,
'-tag:v', 'hvc1'); '-tag:v', 'hvc1');
if (!forceSDR && (isHDR || is10bit)) { if (!forceSDR && (isHDR || is10bit)) {
@ -219,6 +220,28 @@ function Script(TargetBitrateMbit, MaxrateMbit, SkipThresholdMbit, Preset, CQ)
return 2; return 2;
} }
// ── GROESSEN-SICHERHEITSNETZ ──────────────────────────────────
// Output darf nicht wesentlich groesser sein als die Quelle.
// Toleranz: 5% (fuer Audio-Stream-Unterschiede / Metadaten).
// Bei Ueberschreitung: Encode verwerfen, Original behalten, Warnung.
// Ausnahme: copyVideo (nur Audio-Remux) kann durch EAC3 etwas wachsen.
if (!copyVideo) {
let origSizeStat = Flow.Execute({ command: '/usr/bin/stat', argumentList: ['-c', '%s', inputFile] });
let origSize = parseInt((origSizeStat && origSizeStat.standardOutput) ? origSizeStat.standardOutput.trim() : '0', 10) || 0;
let newSizeStat = Flow.Execute({ command: '/usr/bin/stat', argumentList: ['-c', '%s', outFile] });
let newSize = parseInt((newSizeStat && newSizeStat.standardOutput) ? newSizeStat.standardOutput.trim() : '0', 10) || 0;
if (origSize > 0 && newSize > 0) {
let growthPct = ((newSize - origSize) / origSize) * 100;
Logger.ILog('Groesse: orig=' + origSize + ' bytes, output=' + newSize + ' bytes, growth=' + growthPct.toFixed(1) + '%');
if (growthPct > 5) {
Logger.WLog('GROESSEN-WARNUNG: Output ' + growthPct.toFixed(1) + '% groesser als Quelle -> Encode verworfen, Original bleibt.');
Flow.Execute({ command: '/bin/rm', argumentList: ['-f', outFile] });
return 2;
}
}
}
Flow.SetWorkingFile(outFile); Flow.SetWorkingFile(outFile);
Logger.ILog('HEVC Encode erfolgreich -> ' + outFile); Logger.ILog('HEVC Encode erfolgreich -> ' + outFile);
return 1; return 1;