Add support for Y'CbCr output.
[movit] / ycbcr_conversion_effect.frag
1 uniform sampler2D PREFIX(tex_y);
2 uniform sampler2D PREFIX(tex_cb);
3 uniform sampler2D PREFIX(tex_cr);
4
5 vec4 FUNCNAME(vec2 tc) {
6         vec4 rgba = INPUT(tc);
7         vec4 ycbcr_a;
8
9         ycbcr_a.rgb = PREFIX(ycbcr_matrix) * rgba.rgb + PREFIX(offset);
10
11 #if YCBCR_CLAMP_RANGE
12         // If we use limited-range Y'CbCr, the card's usual 0–255 clamping
13         // won't be enough, so we need to clamp ourselves here.
14         //
15         // We clamp before dither, which is a bit unfortunate, since
16         // it means dither can take us out of the clamped range again.
17         // However, since DitherEffect never adds enough dither to change
18         // the quantized levels, we will be fine in practice.
19         ycbcr_a.rgb = clamp(ycbcr_a.rgb, PREFIX(ycbcr_min), PREFIX(ycbcr_max));
20 #endif
21
22         ycbcr_a.a = rgba.a;
23         return ycbcr_a;
24 }