Skip to content

Commit 38b171c

Browse files
committed
Add YUV420P to RGBA shader and canvas render metrics
1 parent 5a4a18b commit 38b171c

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed

apps/desktop/src/routes/editor/Player.tsx

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ export function PlayerContent() {
184184
await commands.stopPlayback();
185185
setEditorState("playing", false);
186186
} else {
187-
// Ensure we seek to the current playback time before starting playback
188187
await commands.seekTo(Math.floor(editorState.playbackTime * FPS));
189188
await commands.startPlayback(FPS, previewResolutionBase());
190189
setEditorState("playing", true);
@@ -463,12 +462,60 @@ function PreviewCanvas() {
463462
createSignal<HTMLDivElement>();
464463
const containerBounds = createElementBounds(canvasContainerRef);
465464

465+
// #region agent log
466+
let canvasRenderCount = 0;
467+
let totalCanvasRenderTime = 0;
468+
let maxCanvasRenderTime = 0;
469+
let lastCanvasMetricsLog = performance.now();
470+
// #endregion
471+
466472
createEffect(() => {
467473
const frame = latestFrame();
468474
if (!frame) return;
469475
if (!canvasRef) return;
470-
const ctx = canvasRef.getContext("2d");
471-
ctx?.putImageData(frame.data, 0, 0);
476+
const ctx = canvasRef.getContext("2d", { alpha: false });
477+
if (!ctx) return;
478+
// #region agent log
479+
const renderStart = performance.now();
480+
// #endregion
481+
createImageBitmap(frame.data).then((bitmap) => {
482+
ctx.drawImage(bitmap, 0, 0);
483+
bitmap.close();
484+
// #region agent log
485+
const renderTime = performance.now() - renderStart;
486+
canvasRenderCount++;
487+
totalCanvasRenderTime += renderTime;
488+
maxCanvasRenderTime = Math.max(maxCanvasRenderTime, renderTime);
489+
if (
490+
performance.now() - lastCanvasMetricsLog >= 2000 &&
491+
canvasRenderCount > 0
492+
) {
493+
const avgTime = totalCanvasRenderTime / canvasRenderCount;
494+
fetch(
495+
"http://127.0.0.1:7242/ingest/966647b7-72f6-4ab7-b76e-6b773ac020d7",
496+
{
497+
method: "POST",
498+
headers: { "Content-Type": "application/json" },
499+
body: JSON.stringify({
500+
location: "Player.tsx:canvas_render",
501+
message: "canvas render metrics",
502+
data: {
503+
canvasRenderCount,
504+
avgRenderTimeMs: avgTime.toFixed(2),
505+
maxRenderTimeMs: maxCanvasRenderTime.toFixed(2),
506+
frameWidth: frame.width,
507+
frameHeight: frame.data.height,
508+
},
509+
timestamp: Date.now(),
510+
sessionId: "debug-session",
511+
hypothesisId: "E",
512+
}),
513+
},
514+
).catch(() => {});
515+
lastCanvasMetricsLog = performance.now();
516+
}
517+
// #endregion
518+
});
472519
});
473520

474521
return (
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
@group(0) @binding(0) var y_plane: texture_2d<f32>;
2+
@group(0) @binding(1) var u_plane: texture_2d<f32>;
3+
@group(0) @binding(2) var v_plane: texture_2d<f32>;
4+
@group(0) @binding(3) var output: texture_storage_2d<rgba8unorm, write>;
5+
6+
@compute @workgroup_size(8, 8)
7+
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
8+
let coords = global_id.xy;
9+
let dims = textureDimensions(output);
10+
11+
if (coords.x >= dims.x || coords.y >= dims.y) {
12+
return;
13+
}
14+
15+
let y_raw = textureLoad(y_plane, coords, 0).r;
16+
let uv_coords = coords / 2;
17+
let u_raw = textureLoad(u_plane, uv_coords, 0).r;
18+
let v_raw = textureLoad(v_plane, uv_coords, 0).r;
19+
20+
let y = (y_raw - 0.0625) * 1.164;
21+
let u = u_raw - 0.5;
22+
let v = v_raw - 0.5;
23+
24+
let r = y + 1.596 * v;
25+
let g = y - 0.391 * u - 0.813 * v;
26+
let b = y + 2.018 * u;
27+
28+
let color = vec4<f32>(
29+
clamp(r, 0.0, 1.0),
30+
clamp(g, 0.0, 1.0),
31+
clamp(b, 0.0, 1.0),
32+
1.0
33+
);
34+
35+
textureStore(output, coords, color);
36+
}

0 commit comments

Comments
 (0)