csputils: apply contrast equalizer in RGB

It's weird that this basically adjusts the contrast between luma and
chroma, and not blackness.

This is more in line with the behavior of libswscale, the vdpau
"procamp" (which mpv doesn't use), and Xv.
This commit is contained in:
wm4 2015-04-29 21:32:19 +02:00
parent d51dee093f
commit 0600d378f9
1 changed files with 3 additions and 8 deletions

View File

@ -671,6 +671,9 @@ void mp_get_yuv2rgb_coeffs(struct mp_csp_params *params, struct mp_cmat *m)
abort();
}
rgblev.min = (rgblev.min + params->brightness) * params->contrast;
rgblev.max = (rgblev.max + params->brightness) * params->contrast;
double ymul = (rgblev.max - rgblev.min) / (yuvlev.ymax - yuvlev.ymin);
double cmul = (rgblev.max - rgblev.min) / (yuvlev.cmid - yuvlev.cmin) / 2;
for (int i = 0; i < 3; i++) {
@ -682,14 +685,6 @@ void mp_get_yuv2rgb_coeffs(struct mp_csp_params *params, struct mp_cmat *m)
-(m->m[i][1] + m->m[i][2]) * yuvlev.cmid;
}
// Brightness adds a constant to output R,G,B.
// Contrast scales Y around 1/2 (not 0 in this implementation).
for (int i = 0; i < 3; i++) {
m->c[i] += params->brightness;
m->m[i][0] *= params->contrast;
m->c[i] += (rgblev.max-rgblev.min) * (1 - params->contrast)/2;
}
int in_bits = FFMAX(params->int_bits_in, 1);
int out_bits = FFMAX(params->int_bits_out, 1);
double in_scale = (1 << in_bits) - 1.0;