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

Christian König deathsimple at vodafone.de
Mon Oct 31 03:00:44 PDT 2011


On 31.10.2011 10:23, Maarten Lankhorst wrote:
> With the smpte240 profile, which was missing.
>
> Signed-off-by: Maarten Lankhorst<m.b.lankhorst at gmail.com>
> ---
>   src/gallium/auxiliary/vl/vl_csc.c        |   19 +++++++++++++++++++
>   src/gallium/auxiliary/vl/vl_csc.h        |    3 ++-
>   src/gallium/state_trackers/vdpau/mixer.c |   20 +++++++++++++++++++-
>   3 files changed, 40 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/vl/vl_csc.c b/src/gallium/auxiliary/vl/vl_csc.c
> index 21da95f..56e6621 100644
> --- a/src/gallium/auxiliary/vl/vl_csc.c
> +++ b/src/gallium/auxiliary/vl/vl_csc.c
> @@ -147,6 +147,22 @@ static const float bt_709_full[16] =
>      0.0f,    0.0f,    0.0f,   1.0f
>   };
>
> +static const float smpte240m[16] =
> +{
> +   1.0f,  0.0f,    1.582f, 0.0f,
> +   1.0f, -0.228f, -0.478f, 0.0f,
> +   1.0f,  1.833f,  0.0f,   0.0f,
> +   0.0f,  0.0f,    0.0f,   1.0f
> +};
> +
> +static const float smpte240m_full[16] =
> +{
> +   1.164f,  0.0f,    1.794f, 0.0f,
> +   1.164f, -0.258f, -0.543f, 0.0f,
> +   1.164f,  2.079f,  0.0f,   0.0f,
> +   0.0f,    0.0f,    0.0f,   1.0f
> +};
> +
>   static const float identity[16] =
>   {
>      1.0f, 0.0f, 0.0f, 0.0f,
> @@ -188,6 +204,9 @@ void vl_csc_get_matrix(enum VL_CSC_COLOR_STANDARD cs,
>         case VL_CSC_COLOR_STANDARD_BT_709:
>            cstd = full_range ?&bt_709_full[0] :&bt_709[0];
>            break;
> +      case VL_CSC_COLOR_STANDARD_SMPTE_240M:
> +         cstd = full_range ?&smpte240m_full[0] :&smpte240m[0];
> +         break;
>         case VL_CSC_COLOR_STANDARD_IDENTITY:
>         default:
>            assert(cs == VL_CSC_COLOR_STANDARD_IDENTITY);
> diff --git a/src/gallium/auxiliary/vl/vl_csc.h b/src/gallium/auxiliary/vl/vl_csc.h
> index a6fb1fd..7a31dd4 100644
> --- a/src/gallium/auxiliary/vl/vl_csc.h
> +++ b/src/gallium/auxiliary/vl/vl_csc.h
> @@ -42,7 +42,8 @@ enum VL_CSC_COLOR_STANDARD
>   {
>      VL_CSC_COLOR_STANDARD_IDENTITY,
>      VL_CSC_COLOR_STANDARD_BT_601,
> -   VL_CSC_COLOR_STANDARD_BT_709
> +   VL_CSC_COLOR_STANDARD_BT_709,
> +   VL_CSC_COLOR_STANDARD_SMPTE_240M
>   };
>
>   extern const struct vl_procamp vl_default_procamp;
> diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
> index 8728157..ed5a646 100644
> --- a/src/gallium/state_trackers/vdpau/mixer.c
> +++ b/src/gallium/state_trackers/vdpau/mixer.c
> @@ -257,9 +257,27 @@ vlVdpGenerateCSCMatrix(VdpProcamp *procamp,
>                          VdpColorStandard standard,
>                          VdpCSCMatrix *csc_matrix)
>   {
> -   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Generating CSCMatrix\n");
> +   float matrix[16];
> +   enum VL_CSC_COLOR_STANDARD vl_std;
> +   struct vl_procamp camp;
> +
>      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: vl_std = VL_CSC_COLOR_STANDARD_BT_601; break;
> +      case VDP_COLOR_STANDARD_ITUR_BT_709: vl_std = VL_CSC_COLOR_STANDARD_BT_709; break;
> +      case VDP_COLOR_STANDARD_SMPTE_240M:  vl_std = VL_CSC_COLOR_STANDARD_SMPTE_240M; break;
> +      default: return VDP_STATUS_INVALID_COLOR_STANDARD;
> +   }
> +   camp.brightness = procamp->brightness;
> +   camp.contrast = procamp->contrast;
> +   camp.saturation = procamp->saturation;
> +   camp.hue = procamp->hue;
> +   vl_csc_get_matrix(vl_std,&camp, 1, matrix);
> +   memcpy(csc_matrix, matrix, sizeof(float)*12);
>      return VDP_STATUS_OK;
>   }
I haven't checked if the matrix are correct and precise enough, but 
otherwise looks good to me.

Reviewed by: Christian König <deathsimple at vodafone.de>


More information about the mesa-dev mailing list