summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_out/color_matrix.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/src/video_out/color_matrix.c b/src/video_out/color_matrix.c
index 32fe3f61c..22dad1dc5 100644
--- a/src/video_out/color_matrix.c
+++ b/src/video_out/color_matrix.c
@@ -26,6 +26,7 @@
This file must be included after declaration of xxxx_driver_t,
and #define'ing CM_DRIVER_T to it.
That struct must contain the integer value cm_state.
+ Also #define CM_HAVE_YCGCO_SUPPORT if you already handle that.
cm_from_frame () returns current (color_matrix << 1) | color_range control value.
Having only 1 var simplifies change event handling and avoids unecessary vo
@@ -52,9 +53,8 @@
So I decided to provide functionality, and let the user decide if and how
to actually use it.
- BTW. VDPAU already has its own matrix switch based on stream info.
- Rumour has it that proprietory ATI drivers auto switch their xv ports
- based on video size. Both not user configurable, and both not tested...
+ BTW. Rumour has it that proprietory ATI drivers auto switch their xv ports
+ based on video size. not user configurable, and not tested...
*/
/* eveybody gets these */
@@ -88,6 +88,25 @@ static const char * const cm_names[] = {
"full range SMPTE 170M",
"SMPTE 240M",
"full range SMPTE 240M"
+#ifdef CM_HAVE_YCGCO_SUPPORT
+ ,
+ "YCgCo",
+ "YCgCo", /* this is always fullrange */
+ "#9",
+ "fullrange #9",
+ "#10",
+ "fullrange #10",
+ "#11",
+ "fullrange #11",
+ "#12",
+ "fullrange #12",
+ "#13",
+ "fullrange #13",
+ "#14",
+ "fullrange #14",
+ "#15",
+ "fullrange #15"
+#endif
};
#ifdef CM_DRIVER_T
@@ -153,10 +172,10 @@ static void cm_init (CM_DRIVER_T *this) {
}
static uint8_t cm_m[] = {
- 5, 1, 5, 3, 4, 5, 6, 7, /* SIGNAL */
- 5, 1, 5, 3, 4, 5, 6, 7, /* SIZE */
- 5, 5, 5, 5, 5, 5, 5, 5, /* SD */
- 5, 1, 1, 1, 1, 1, 1, 1 /* HD */
+ 5, 1, 5, 3, 4, 5, 6, 7, 8, 5, 5, 5, 5, 5, 5, 5, /* SIGNAL */
+ 5, 1, 5, 3, 4, 5, 6, 7, 8, 5, 5, 5, 5, 5, 5, 5, /* SIZE */
+ 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 5, 5, 5, 5, 5, 5, /* SD */
+ 5, 1, 1, 1, 1, 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1 /* HD */
};
static uint8_t cm_r[] = {0, 0, 1, 0}; /* AUTO, MPEG, FULL, safety */
@@ -166,10 +185,14 @@ static int cm_from_frame (vo_frame_t *frame) {
int cm = VO_GET_FLAGS_CM (frame->flags);
int cf = this->cm_state;
- cm_m[10] = (frame->height - frame->crop_top - frame->crop_bottom >= 720) ||
+ cm_m[18] = (frame->height - frame->crop_top - frame->crop_bottom >= 720) ||
(frame->width - frame->crop_left - frame->crop_right >= 1280) ? 1 : 5;
cm_r[0] = cm & 1;
- return ((cm_m[((cf >> 2) << 3) | (cm >> 1)] << 1) | cm_r[cf & 2]);
+#ifdef CM_HAVE_YCGCO_SUPPORT
+ return ((cm_m[((cf >> 2) << 4) | (cm >> 1)] << 1) | cm_r[cf & 2]);
+#else
+ return ((cm_m[((cf >> 2) << 4) | (cm >> 1)] << 1) | cm_r[cf & 2]) & 15;
+#endif
}
static void cm_close (CM_DRIVER_T *this) {