From 181dba58641a8b1ede4bf29e22fb555f6c42b1cb Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 4 Nov 2025 23:51:39 -0600 Subject: [PATCH] Use correct chroma co-siting offsets in Metal --- app/shaders/vt_renderer.metal | 14 +++++------ .../video/ffmpeg-renderers/vt_metal.mm | 24 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/shaders/vt_renderer.metal b/app/shaders/vt_renderer.metal index 6db53679..dd5ee58d 100644 --- a/app/shaders/vt_renderer.metal +++ b/app/shaders/vt_renderer.metal @@ -26,8 +26,8 @@ fragment float4 ps_draw_biplanar(Vertex v [[ stage_in ]], texture2d luminancePlane [[ texture(0) ]], texture2d chrominancePlane [[ texture(1) ]]) { - float2 chromaOffset = float2(cscParams.chromaOffset.x / chrominancePlane.get_width(), - cscParams.chromaOffset.y / chrominancePlane.get_height()); + float2 chromaOffset = float2(cscParams.chromaOffset.x / luminancePlane.get_width(), + cscParams.chromaOffset.y / luminancePlane.get_height()); float3 yuv = float3(luminancePlane.sample(s, v.texCoords).r, chrominancePlane.sample(s, v.texCoords + chromaOffset).rg); yuv *= cscParams.bitnessScaleFactor; @@ -46,13 +46,11 @@ fragment float4 ps_draw_triplanar(Vertex v [[ stage_in ]], texture2d chrominancePlaneU [[ texture(1) ]], texture2d chrominancePlaneV [[ texture(2) ]]) { - float2 chromaOffsetU = float2(cscParams.chromaOffset.x / chrominancePlaneU.get_width(), - cscParams.chromaOffset.y / chrominancePlaneU.get_height()); - float2 chromaOffsetV = float2(cscParams.chromaOffset.x / chrominancePlaneV.get_width(), - cscParams.chromaOffset.y / chrominancePlaneV.get_height()); + float2 chromaOffset = float2(cscParams.chromaOffset.x / luminancePlane.get_width(), + cscParams.chromaOffset.y / luminancePlane.get_height()); float3 yuv = float3(luminancePlane.sample(s, v.texCoords).r, - chrominancePlaneU.sample(s, v.texCoords + chromaOffsetU).r, - chrominancePlaneV.sample(s, v.texCoords + chromaOffsetV).r); + chrominancePlaneU.sample(s, v.texCoords + chromaOffset).r, + chrominancePlaneV.sample(s, v.texCoords + chromaOffset).r); yuv *= cscParams.bitnessScaleFactor; yuv -= cscParams.offsets; diff --git a/app/streaming/video/ffmpeg-renderers/vt_metal.mm b/app/streaming/video/ffmpeg-renderers/vt_metal.mm index a2691166..a90a6126 100644 --- a/app/streaming/video/ffmpeg-renderers/vt_metal.mm +++ b/app/streaming/video/ffmpeg-renderers/vt_metal.mm @@ -317,28 +317,28 @@ public: switch (frame->chroma_location) { default: case AVCHROMA_LOC_LEFT: - paramBuffer.chromaOffset[0] = 0; - paramBuffer.chromaOffset[1] = 0.5; + paramBuffer.chromaOffset[0] = 0.5; + paramBuffer.chromaOffset[1] = 0; break; case AVCHROMA_LOC_CENTER: + paramBuffer.chromaOffset[0] = 0; + paramBuffer.chromaOffset[1] = 0; + break; + case AVCHROMA_LOC_TOPLEFT: paramBuffer.chromaOffset[0] = 0.5; paramBuffer.chromaOffset[1] = 0.5; break; - case AVCHROMA_LOC_TOPLEFT: - paramBuffer.chromaOffset[0] = 0; - paramBuffer.chromaOffset[1] = 0; - break; case AVCHROMA_LOC_TOP: - paramBuffer.chromaOffset[0] = 0.5; - paramBuffer.chromaOffset[1] = 0; + paramBuffer.chromaOffset[0] = 0; + paramBuffer.chromaOffset[1] = 0.5; break; case AVCHROMA_LOC_BOTTOMLEFT: - paramBuffer.chromaOffset[0] = 0; - paramBuffer.chromaOffset[1] = 1.0; + paramBuffer.chromaOffset[0] = 0.5; + paramBuffer.chromaOffset[1] = -0.5; break; case AVCHROMA_LOC_BOTTOM: - paramBuffer.chromaOffset[0] = 0.5; - paramBuffer.chromaOffset[1] = 1.0; + paramBuffer.chromaOffset[0] = 0; + paramBuffer.chromaOffset[1] = -0.5; break; }