[Mesa-dev] [PATCH] state_trackers/vdpau: Implement VdpGenerateCSCMatrix partially

Younes Manton younes.m at gmail.com
Tue Oct 25 11:00:38 PDT 2011


On Tue, Oct 25, 2011 at 1:35 PM, Maarten Lankhorst
<m.b.lankhorst at gmail.com> wrote:
> Signed-off-by: Maarten Lankhorst <m.b.lankhorst at gmail.com
>
> ---
>
> diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
> index 8728157..83daddf 100644
> --- a/src/gallium/state_trackers/vdpau/mixer.c
> +++ b/src/gallium/state_trackers/vdpau/mixer.c
> @@ -257,9 +257,37 @@ vlVdpGenerateCSCMatrix(VdpProcamp *procamp,
>                        VdpColorStandard standard,
>                        VdpCSCMatrix *csc_matrix)
>  {
> -   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Generating CSCMatrix\n");
> +   double Kry, Kby, Ry = 219., Rc = 112., ofsy = 16., Scb, Scr;
> +   VdpProcamp mat;
>    if (!(csc_matrix && procamp))
>       return VDP_STATUS_INVALID_POINTER;
>
> +   if (procamp->struct_version > VDP_PROCAMP_VERSION)
> +      return VDP_STATUS_INVALID_STRUCT_VERSION;
> +
> +   switch (standard) {
> +      case VDP_COLOR_STANDARD_ITUR_BT_601: Kry = 0.299; Kby = .114; break;
> +      case VDP_COLOR_STANDARD_ITUR_BT_709: Kry = 0.2126; Kby = .0722; break;
> +      case VDP_COLOR_STANDARD_SMPTE_240M:  Kry = 0.212; Kby = .087; break;
> +      default: return VDP_STATUS_INVALID_COLOR_STANDARD;
> +   }
> +   if (procamp->hue != 0.f || procamp->saturation != 1.f || procamp->contrast != 1.f || procamp->brightness != 0.f)
> +      VDPAU_MSG(VDPAU_WARN, "No support yet for color options\n");
> +
> +   mat[0][0] = mat[1][0] = mat[2][0] = 255. / Ry;
> +   mat[0][3] = mat[1][3] = mat[2][3] = -ofsy / Ry;
> +   Scr = (1. - Kry) / Rc;
> +   mat[0][1] = 0.;
> +   mat[0][2] = 255. * Scr;
> +   mat[0][3] -= 128. * Scr;
> +   Scb = -(1. - Kby) * Kby / ((1. - Kby) + (1. - Kry) - 1.) / Rc;
> +   Scr = -(1. - Kry) * Kry / ((1. - Kby) + (1. - Kry) - 1.) / Rc;
> +   mat[1][1] = 255. * Scb;
> +   mat[1][2] = 255. * Scr;
> +   mat[1][3] -= 128. * (Scb + Scr);
> +   Scb = (1. - Kby) / Rc;
> +   mat[2][1] = 255. * Scb;
> +   mat[2][2] = 0.;
> +   mat[2][3] -= 128. * Scb;
>    return VDP_STATUS_OK;
>  }
>

Is there a reason not to use/add to the code in vl_csc.c in this case?
It supports 601 and 709, wider gamut, and and it takes procamp into
account. It calculates a 4x4 matrix, but you can just drop the 4th row
for VDPAU.


More information about the mesa-dev mailing list