X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=ycbcr_conversion_effect.frag;fp=ycbcr_conversion_effect.frag;h=6bc29b1be63782bcd950f3dd451256a2caedb8f0;hb=80fc4a6e806e5638ae050c3020962137ca5fd76b;hp=0000000000000000000000000000000000000000;hpb=5f81c29e307735bbadb3c0cb06500af627b2e57a;p=movit diff --git a/ycbcr_conversion_effect.frag b/ycbcr_conversion_effect.frag new file mode 100644 index 0000000..6bc29b1 --- /dev/null +++ b/ycbcr_conversion_effect.frag @@ -0,0 +1,24 @@ +uniform sampler2D PREFIX(tex_y); +uniform sampler2D PREFIX(tex_cb); +uniform sampler2D PREFIX(tex_cr); + +vec4 FUNCNAME(vec2 tc) { + vec4 rgba = INPUT(tc); + vec4 ycbcr_a; + + ycbcr_a.rgb = PREFIX(ycbcr_matrix) * rgba.rgb + PREFIX(offset); + +#if YCBCR_CLAMP_RANGE + // If we use limited-range Y'CbCr, the card's usual 0–255 clamping + // won't be enough, so we need to clamp ourselves here. + // + // We clamp before dither, which is a bit unfortunate, since + // it means dither can take us out of the clamped range again. + // However, since DitherEffect never adds enough dither to change + // the quantized levels, we will be fine in practice. + ycbcr_a.rgb = clamp(ycbcr_a.rgb, PREFIX(ycbcr_min), PREFIX(ycbcr_max)); +#endif + + ycbcr_a.a = rgba.a; + return ycbcr_a; +}