( bytes: Uint8Array, releaseCallback?: () => void, )
| 979 | type DecodeResult = FrameQueuedMessage | DecodedFrame | ErrorMessage; |
| 980 | |
| 981 | function processFrameBytesSync( |
| 982 | bytes: Uint8Array, |
| 983 | releaseCallback?: () => void, |
| 984 | ): DecodeResult { |
| 985 | if (bytes.byteLength < 24) { |
| 986 | releaseCallback?.(); |
| 987 | return { |
| 988 | type: "error", |
| 989 | message: "Received frame too small to contain metadata", |
| 990 | }; |
| 991 | } |
| 992 | |
| 993 | const meta = parseFrameMetadata(bytes); |
| 994 | if (!meta) { |
| 995 | releaseCallback?.(); |
| 996 | return { |
| 997 | type: "error", |
| 998 | message: "Failed to parse frame metadata", |
| 999 | }; |
| 1000 | } |
| 1001 | |
| 1002 | const { width, height, frameNumber, targetTimeNs } = meta; |
| 1003 | const timing: FrameTiming = { frameNumber, targetTimeNs }; |
| 1004 | |
| 1005 | if (renderMode === "webgpu" || renderMode === "pending") { |
| 1006 | while (frameQueue.length >= FRAME_QUEUE_SIZE) { |
| 1007 | const dropped = frameQueue.shift(); |
| 1008 | if (dropped?.mode === "webgpu" && dropped.releaseCallback) { |
| 1009 | dropped.releaseCallback(); |
| 1010 | } |
| 1011 | } |
| 1012 | |
| 1013 | if (meta.format === "nv12") { |
| 1014 | const frameData = new Uint8ClampedArray( |
| 1015 | bytes.buffer, |
| 1016 | bytes.byteOffset, |
| 1017 | meta.totalSize, |
| 1018 | ); |
| 1019 | frameQueue.push({ |
| 1020 | mode: "webgpu", |
| 1021 | pixelFormat: "nv12", |
| 1022 | data: frameData, |
| 1023 | width, |
| 1024 | height, |
| 1025 | yStride: meta.yStride, |
| 1026 | fullRange: meta.fullRange, |
| 1027 | timing, |
| 1028 | releaseCallback, |
| 1029 | }); |
| 1030 | } else { |
| 1031 | const frameData = new Uint8ClampedArray( |
| 1032 | bytes.buffer, |
| 1033 | bytes.byteOffset, |
| 1034 | bytes.byteLength - 24, |
| 1035 | ); |
| 1036 | frameQueue.push({ |
| 1037 | mode: "webgpu", |
| 1038 | pixelFormat: "rgba", |
no test coverage detected