// Encoder-Fähigkeiten eines Workers in Klartext übersetzen. // // Befund 25.07.2026: Die Rippy-VM lief auf dem generischen QEMU-CPU-Modell // („QEMU Virtual CPU version 2.5+") und hatte deshalb kein AVX2, nur sse4_2. // x265 lebt von diesen Vektorbefehlen — ein 4K-Encode brauchte dort gemessene // 28-55 Stunden, und nirgends im UI war das zu sehen. Der Worker meldet die // Angaben seit dieser Runde selbst (worker/caps.py), hier werden sie gedeutet. // Stufen, mit denen Software-Encoding brauchbar schnell ist. export const SIMD_SCHNELL = ['avx512f', 'avx2'] /** * Warnt, wenn die CPU dieses Workers zu schwach für Software-Encoding ist. * Gibt null zurück, wenn alles in Ordnung ist ODER die Stufe unbekannt ist — * lieber nichts sagen als etwas Falsches behaupten. */ export function simdWarnung(simd?: string): string | null { if (!simd || simd === 'unbekannt') return null if (SIMD_SCHNELL.includes(simd)) return null return `Diese CPU kann nur ${simd} (kein AVX2) — Software-Encoding ist hier ` + 'sehr langsam. Bei einer virtuellen Maschine hilft es meist, den ' + 'CPU-Typ auf "host" zu stellen; sonst besser einen Worker mit ' + 'Hardware-Encoder wählen.' } // Reservierter Wert im Preset-Feld: „diesen Disc-Typ NICHT komprimieren". // Muss mit ripping.PRESET_KEINE im Worker übereinstimmen — es gibt kein // geteiltes Paket zwischen UI und Worker, deshalb steht der Wert hier nochmal. export const PRESET_KEINE = 'keine' interface WorkerFuerBewertung { encoders?: string[] info?: { cpu_simd?: string } } /** * Kann von den gemeldeten Workern KEINER 4K in Software brauchbar schnell * encodieren? Wahr nur, wenn das auch belegt ist: mindestens ein Worker hat * eine bekannte SIMD-Stufe, und keiner erreicht AVX2 — und keiner hat einen * Hardware-Encoder, der die Frage sowieso erledigt. * * Bei unbekannter Stufe (z. B. Windows-Worker, dort gibt es kein * /proc/cpuinfo) wird NICHT gewarnt. Lieber schweigen als falsch warnen. */ export function schwacheEncoderCpu(workers?: WorkerFuerBewertung[]): boolean { const liste = workers || [] if (liste.length === 0) return false const hardware = liste.some(w => (w.encoders || []).some(e => !e.startsWith('cpu'))) if (hardware) return false const bekannte = liste .map(w => w.info?.cpu_simd) .filter((s): s is string => !!s && s !== 'unbekannt') if (bekannte.length === 0) return false return !bekannte.some(s => SIMD_SCHNELL.includes(s)) }