qcam: viewfinder_gl: Merge the semi-planar UV and VU shaders
Use macros to select the U and V pattern, to avoid code duplication between the two semi-planar shaders. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Copyright (C) 2020, Linaro
|
||||
*
|
||||
* YUV_2_planes_UV.frag - Fragment shader code for NV12, NV16 and NV24 formats
|
||||
* YUV_2_planes.frag - Fragment shader code for NV12, NV16 and NV24 formats
|
||||
*/
|
||||
|
||||
#ifdef GL_ES
|
||||
@@ -24,8 +24,15 @@ void main(void)
|
||||
);
|
||||
|
||||
yuv.x = texture2D(tex_y, textureOut).r - 0.063;
|
||||
#if defined(YUV_PATTERN_UV)
|
||||
yuv.y = texture2D(tex_u, textureOut).r - 0.500;
|
||||
yuv.z = texture2D(tex_u, textureOut).g - 0.500;
|
||||
#elif defined(YUV_PATTERN_VU)
|
||||
yuv.y = texture2D(tex_u, textureOut).g - 0.500;
|
||||
yuv.z = texture2D(tex_u, textureOut).r - 0.500;
|
||||
#else
|
||||
#error Invalid pattern
|
||||
#endif
|
||||
|
||||
rgb = yuv2rgb_bt601_mat * yuv;
|
||||
gl_FragColor = vec4(rgb, 1.0);
|
||||
@@ -1,32 +0,0 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
/*
|
||||
* Copyright (C) 2020, Linaro
|
||||
*
|
||||
* YUV_2_planes_VU.frag - Fragment shader code for NV21, NV61 and NV42 formats
|
||||
*/
|
||||
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
varying vec2 textureOut;
|
||||
uniform sampler2D tex_y;
|
||||
uniform sampler2D tex_u;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
vec3 yuv;
|
||||
vec3 rgb;
|
||||
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)
|
||||
);
|
||||
|
||||
yuv.x = texture2D(tex_y, textureOut).r - 0.063;
|
||||
yuv.y = texture2D(tex_u, textureOut).g - 0.500;
|
||||
yuv.z = texture2D(tex_u, textureOut).r - 0.500;
|
||||
|
||||
rgb = yuv2rgb_bt601_mat * yuv;
|
||||
gl_FragColor = vec4(rgb, 1.0);
|
||||
}
|
||||
@@ -2,8 +2,7 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource>
|
||||
<file>YUV.vert</file>
|
||||
<file>YUV_2_planes_UV.frag</file>
|
||||
<file>YUV_2_planes_VU.frag</file>
|
||||
<file>YUV_2_planes.frag</file>
|
||||
<file>YUV_3_planes.frag</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -106,32 +106,38 @@ bool ViewFinderGL::selectFormat(const libcamera::PixelFormat &format)
|
||||
case libcamera::formats::NV12:
|
||||
horzSubSample_ = 2;
|
||||
vertSubSample_ = 2;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::NV21:
|
||||
horzSubSample_ = 2;
|
||||
vertSubSample_ = 2;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::NV16:
|
||||
horzSubSample_ = 2;
|
||||
vertSubSample_ = 1;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::NV61:
|
||||
horzSubSample_ = 2;
|
||||
vertSubSample_ = 1;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::NV24:
|
||||
horzSubSample_ = 1;
|
||||
vertSubSample_ = 1;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_UV.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_UV");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::NV42:
|
||||
horzSubSample_ = 1;
|
||||
vertSubSample_ = 1;
|
||||
fragmentShaderFile_ = ":YUV_2_planes_VU.frag";
|
||||
fragmentShaderDefines_.append("#define YUV_PATTERN_VU");
|
||||
fragmentShaderFile_ = ":YUV_2_planes.frag";
|
||||
break;
|
||||
case libcamera::formats::YUV420:
|
||||
horzSubSample_ = 2;
|
||||
|
||||
Reference in New Issue
Block a user