Signatur
Beschreibung
Die schreibgeschützte Eigenschaft codedRect gehört zur VideoFrame-Schnittstelle der WebCodecs-API. Sie liefert ein DOMRectReadOnly, dessen x und y immer 0 sind und dessen width und height den Werten von VideoFrame.codedWidth und VideoFrame.codedHeight entsprechen. Damit beschreibt es den kompletten Pixelpuffer des Frames, so wie er im Speicher liegt, und nicht nur den sichtbaren Ausschnitt.
Diesen Unterschied muss man kennen: Videocodecs arbeiten oft mit Blockgrößen von 16 × 16 Pixeln. Ein Full-HD-Video wird deshalb häufig mit 1920 × 1088 Pixeln kodiert, sichtbar sind aber nur 1920 × 1080. Den sichtbaren Bereich gibt visibleRect an, den gesamten Speicherbereich codedRect. Mit displayWidth/displayHeight kommt noch die Darstellungsgröße dazu, die bei nicht quadratischen Pixeln abweichen kann.
In der Praxis braucht man codedRect vor allem, wenn man mit VideoFrame.copyTo() oder allocationSize() die vollständigen Rohdaten eines Frames kopieren will (einschließlich Padding), wenn man eigene Puffer-Layouts berechnet oder wenn man beim Debuggen von Decodern prüfen will, ob kodierte und sichtbare Größe übereinstimmen.
Rückgabewert
DOMRectReadOnly mit x = 0, y = 0, width = codedWidth und height = codedHeight. Wurde der Frame mit close() geschlossen, ist der Wert null.Beispiele
codedRect eines Frames aus einem Canvas auslesen
const canvas = new OffscreenCanvas(640, 480);
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'teal';
ctx.fillRect(0, 0, 640, 480);
const frame = new VideoFrame(canvas, { timestamp: 0 });
const { x, y, width, height } = frame.codedRect;
console.log(`codedRect: ${x},${y} ${width}x${height}`);
frame.close();
Kodierte und sichtbare Größe vergleichen (Padding erkennen)
// Rohes I420-Bild mit 1920x1088 Pixeln, sichtbar sind nur 1920x1080
const codedWidth = 1920;
const codedHeight = 1088;
const data = new Uint8Array(codedWidth * codedHeight * 1.5);
const frame = new VideoFrame(data, {
format: 'I420',
codedWidth,
codedHeight,
timestamp: 0,
visibleRect: { x: 0, y: 0, width: 1920, height: 1080 }
});
const coded = frame.codedRect;
const visible = frame.visibleRect;
console.log('coded:', coded.width, 'x', coded.height);
console.log('visible:', visible.width, 'x', visible.height);
console.log('Padding-Zeilen:', coded.height - visible.height);
frame.close();
Vollständigen Pixelpuffer mit copyTo() kopieren
const copyFullFrame = async (frame) => {
// rect: codedRect = gesamter Speicherbereich statt nur visibleRect
const options = { rect: frame.codedRect };
const size = frame.allocationSize(options);
const buffer = new Uint8Array(size);
const layout = await frame.copyTo(buffer, options);
return { buffer, layout };
};
const canvas = new OffscreenCanvas(320, 240);
canvas.getContext('2d').fillRect(0, 0, 320, 240);
const frame = new VideoFrame(canvas, { timestamp: 0 });
const { buffer, layout } = await copyFullFrame(frame);
console.log(frame.format, buffer.byteLength, layout.length);
frame.close();
Nach close() ist codedRect null
const canvas = new OffscreenCanvas(100, 100);
canvas.getContext('2d').fillRect(0, 0, 100, 100);
const frame = new VideoFrame(canvas, { timestamp: 0 });
console.log(frame.codedRect?.width);
frame.close();
console.log(frame.codedRect);
// Wichtig · Fallstricke
- Nicht mit
visibleRectverwechseln: Wer ein Bild anzeigen oder weiterverarbeiten will, braucht meistvisibleRectbzw.displayWidth/displayHeight.codedRectkann Padding-Pixel mit undefiniertem Inhalt enthalten, die z. B. als grüne oder schwarze Ränder auftauchen. - Geschlossene Frames: Nach
frame.close()gibtcodedRectnullzurück. Beim Zugriff auf.widthfliegt dann einTypeError, also Optional Chaining (?.) verwenden oder vorher prüfen. - Immer neu: Jeder Zugriff liefert ein neues
DOMRectReadOnly. Deshalb giltframe.codedRect === frame.codedRectalsfalse. Zum Vergleichen die einzelnen Werte heranziehen. - Unterabtastung (Subsampling): Bei Formaten wie
I420oderNV12sind die Farbebenen (Chroma) nur halb so groß.codedRectbeschreibt die Helligkeitsebene (Luma). Die tatsächlichen Ebenen-Layouts liefert der Rückgabewert voncopyTo(). - Kompatibilität: Teil der WebCodecs-API und nur in sicheren Kontexten (HTTPS) verfügbar, im Fenster und in Dedicated Workers. Chromium ab Version 94, Safari ab 16.4, Firefox ab 130. Vorher mit
'VideoFrame' in globalThisprüfen, ob die API vorhanden ist.