summaryrefslogtreecommitdiff
path: root/src/qcam/assets/shader/YUV_packed.frag
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-08-28 03:40:25 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2022-09-01 22:41:01 +0300
commit251f0534b74bcb46c777aa0df34b1b4142b664f5 (patch)
tree09da0bd567c7aa01ceb95f24d0a54446faf07a9a /src/qcam/assets/shader/YUV_packed.frag
parentee4681b7e8899c50b6d960d3b0b52ffd09c19a22 (diff)
qcam: viewfinder_gl: Take color space into account for YUV rendering
Update the YUV shaders and the viewfinder_gl to correctly take the Y'CbCr encoding and the quantization range into account when rendering YUV formats to RGB. Support for the primaries and transfer function will be added in a subsequent step. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Kunal Agarwal <kunalagarwal1072002@gmail.com>
Diffstat (limited to 'src/qcam/assets/shader/YUV_packed.frag')
-rw-r--r--src/qcam/assets/shader/YUV_packed.frag17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/qcam/assets/shader/YUV_packed.frag b/src/qcam/assets/shader/YUV_packed.frag
index d6efd4ce..b9ef9d41 100644
--- a/src/qcam/assets/shader/YUV_packed.frag
+++ b/src/qcam/assets/shader/YUV_packed.frag
@@ -14,15 +14,16 @@ varying vec2 textureOut;
uniform sampler2D tex_y;
uniform vec2 tex_step;
+const mat3 yuv2rgb_matrix = mat3(
+ YUV2RGB_MATRIX
+);
+
+const vec3 yuv2rgb_offset = vec3(
+ YUV2RGB_Y_OFFSET / 255.0, 128.0 / 255.0, 128.0 / 255.0
+);
+
void main(void)
{
- mat3 yuv2rgb_bt601_mat = mat3(
- vec3(1.164, 1.164, 1.164),
- vec3(0.000, -0.392, 2.017),
- vec3(1.596, -0.813, 0.000)
- );
- vec3 yuv2rgb_bt601_offset = vec3(0.063, 0.500, 0.500);
-
/*
* The sampler won't interpolate the texture correctly along the X axis,
* as each RGBA pixel effectively stores two pixels. We thus need to
@@ -76,7 +77,7 @@ void main(void)
float y = mix(y_left, y_right, step(0.5, f_x));
- vec3 rgb = yuv2rgb_bt601_mat * (vec3(y, uv) - yuv2rgb_bt601_offset);
+ vec3 rgb = yuv2rgb_matrix * (vec3(y, uv) - yuv2rgb_offset);
gl_FragColor = vec4(rgb, 1.0);
}