Mesa (master): state_trackers/vdpau: Implement VdpGenerateCSCMatrix

Christian König deathsimple at kemper.freedesktop.org
Thu Nov 3 13:40:52 UTC 2011


Module: Mesa
Branch: master
Commit: c9c6eec1c6650623f1be412dc2acd935de6b728b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c9c6eec1c6650623f1be412dc2acd935de6b728b

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Mon Oct 31 10:23:03 2011 +0100

state_trackers/vdpau: Implement VdpGenerateCSCMatrix

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;
 }




More information about the mesa-commit mailing list