summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/vl/vl_csc.c19
-rw-r--r--src/gallium/auxiliary/vl/vl_csc.h3
-rw-r--r--src/gallium/state_trackers/vdpau/mixer.c20
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 21da95f3ceb..56e662157ef 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 a6fb1fdba51..7a31dd4eb26 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 8728157e8a5..ed5a6464088 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;
}