summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <[email protected]>2013-10-09 02:23:51 +0200
committerChristian König <[email protected]>2013-10-09 13:02:40 +0200
commit48563bd45c546a7759d6f739607b9f0906b4c8ad (patch)
tree0b68f34dfe3d694421e50412bf63df62cdcdcfbf
parent1a5bac2149fa2c6224b40c0b40839c2025414e79 (diff)
st/vdpau: add new formats to OutputSurface rendering
OutputSurfaces have simple YCbCr rendering functionality built in, but so far only 4:2:0 subsampling worked correctly. This fixes 4:2:2 and 4:4:4 formats. Reviewed-by: Christian König <[email protected]>
-rw-r--r--src/gallium/state_trackers/vdpau/output.c2
-rw-r--r--src/gallium/state_trackers/vdpau/vdpau_private.h23
2 files changed, 24 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c
index dd72f6f63da..cf77b532485 100644
--- a/src/gallium/state_trackers/vdpau/output.c
+++ b/src/gallium/state_trackers/vdpau/output.c
@@ -442,7 +442,7 @@ vlVdpOutputSurfacePutBitsYCbCr(VdpOutputSurface surface,
vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
memset(&vtmpl, 0, sizeof(vtmpl));
vtmpl.buffer_format = format;
- vtmpl.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
+ vtmpl.chroma_format = FormatYCBCRToPipeChroma(source_ycbcr_format);
if (destination_rect) {
vtmpl.width = abs(destination_rect->x0-destination_rect->x1);
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
index 0812767cb99..bb91de13103 100644
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
@@ -89,6 +89,29 @@ PipeToChroma(enum pipe_video_chroma_format pipe_type)
return -1;
}
+static inline enum pipe_video_chroma_format
+FormatYCBCRToPipeChroma(VdpYCbCrFormat vdpau_format)
+{
+ switch (vdpau_format) {
+ case VDP_YCBCR_FORMAT_NV12:
+ return PIPE_VIDEO_CHROMA_FORMAT_420;
+ case VDP_YCBCR_FORMAT_YV12:
+ return PIPE_VIDEO_CHROMA_FORMAT_420;
+ case VDP_YCBCR_FORMAT_UYVY:
+ return PIPE_VIDEO_CHROMA_FORMAT_422;
+ case VDP_YCBCR_FORMAT_YUYV:
+ return PIPE_VIDEO_CHROMA_FORMAT_422;
+ case VDP_YCBCR_FORMAT_Y8U8V8A8:
+ return PIPE_VIDEO_CHROMA_FORMAT_444;
+ case VDP_YCBCR_FORMAT_V8U8Y8A8:
+ return PIPE_VIDEO_CHROMA_FORMAT_444;
+ default:
+ assert(0);
+ }
+
+ return PIPE_FORMAT_NONE;
+}
+
static inline enum pipe_format
FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
{