diff options
author | Grigori Goronzy <[email protected]> | 2013-10-09 02:23:51 +0200 |
---|---|---|
committer | Christian König <[email protected]> | 2013-10-09 13:02:40 +0200 |
commit | 48563bd45c546a7759d6f739607b9f0906b4c8ad (patch) | |
tree | 0b68f34dfe3d694421e50412bf63df62cdcdcfbf /src/gallium/state_trackers/vdpau | |
parent | 1a5bac2149fa2c6224b40c0b40839c2025414e79 (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]>
Diffstat (limited to 'src/gallium/state_trackers/vdpau')
-rw-r--r-- | src/gallium/state_trackers/vdpau/output.c | 2 | ||||
-rw-r--r-- | src/gallium/state_trackers/vdpau/vdpau_private.h | 23 |
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) { |