]> git.sesse.net Git - movit/blob - ycbcr_input.frag
Add support for 10- and 12-bit planar Y'CbCr inputs.
[movit] / ycbcr_input.frag
1 // Implicit uniforms:
2 // uniform sampler2D PREFIX(tex_y);
3 // uniform sampler2D PREFIX(tex_cbcr);  // If CB_CR_SAME_TEXTURE.
4 // uniform sampler2D PREFIX(tex_cb);    // If not CB_CR_SAME_TEXTURE.
5 // uniform sampler2D PREFIX(tex_cr);    // If not CB_CR_SAME_TEXTURE.
6
7 vec4 FUNCNAME(vec2 tc) {
8         // OpenGL's origin is bottom-left, but most graphics software assumes
9         // a top-left origin. Thus, for inputs that come from the user,
10         // we flip the y coordinate.
11         tc.y = 1.0 - tc.y;
12
13         vec3 ycbcr;
14 #if Y_CB_CR_SAME_TEXTURE
15         ycbcr = tex2D(PREFIX(tex_y), tc).xyz;
16 #else
17         ycbcr.x = tex2D(PREFIX(tex_y), tc).x;
18   #if CB_CR_SAME_TEXTURE
19     #if CB_CR_OFFSETS_EQUAL
20         ycbcr.yz = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cb_offset)).xy;
21     #else
22         ycbcr.y = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cb_offset)).x;
23         ycbcr.z = tex2D(PREFIX(tex_cbcr), tc + PREFIX(cr_offset)).x;
24     #endif
25   #else
26         ycbcr.y = tex2D(PREFIX(tex_cb), tc + PREFIX(cb_offset)).x;
27         ycbcr.z = tex2D(PREFIX(tex_cr), tc + PREFIX(cr_offset)).x;
28   #endif
29 #endif
30
31         ycbcr -= PREFIX(offset);
32
33         vec4 rgba;
34         rgba.rgb = PREFIX(inv_ycbcr_matrix) * ycbcr;
35         rgba.a = 1.0;
36         return rgba;
37 }