aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian König <[email protected]>2012-02-01 23:50:34 +0100
committerChristian König <[email protected]>2012-02-06 10:35:58 +0100
commit8f54929c5d9a07a999cb0a55c406062fd8cdfb74 (patch)
tree183ca22945b26edcefde6f0f0e247e340c53f811 /src
parent8bfadc802f6c3c85de4c429b2a87d0bdb1705028 (diff)
st/vdpau: use interlacing capabilities
Recreate video buffer if need arises. Signed-off-by: Christian König <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/vdpau/decode.c10
-rw-r--r--src/gallium/state_trackers/vdpau/surface.c6
2 files changed, 15 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c
index 00232ad9826..de9835f5847 100644
--- a/src/gallium/state_trackers/vdpau/decode.c
+++ b/src/gallium/state_trackers/vdpau/decode.c
@@ -393,6 +393,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
VdpStatus ret;
struct pipe_screen *screen;
struct pipe_video_decoder *dec;
+ bool buffer_support[2];
unsigned i;
union {
struct pipe_picture_desc base;
@@ -424,8 +425,12 @@ vlVdpDecoderRender(VdpDecoder decoder,
// TODO: Recreate decoder with correct chroma
return VDP_STATUS_INVALID_CHROMA_TYPE;
+ buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
+ buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
+
if (vlsurf->video_buffer == NULL ||
- !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile)) {
+ !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile) ||
+ buffer_support[vlsurf->video_buffer->interlaced]) {
/* destroy the old one */
if (vlsurf->video_buffer)
@@ -434,6 +439,9 @@ vlVdpDecoderRender(VdpDecoder decoder,
/* set the buffer format to the prefered one */
vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT);
+ /* also set interlacing to decoders preferences */
+ vlsurf->templat.interlaced = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERS_INTERLACED);
+
/* and recreate the video buffer */
vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat);
diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c
index 00c64ee21fc..5774a8378ae 100644
--- a/src/gallium/state_trackers/vdpau/surface.c
+++ b/src/gallium/state_trackers/vdpau/surface.c
@@ -85,6 +85,12 @@ vlVdpVideoSurfaceCreate(VdpDevice device, VdpChromaType chroma_type,
p_surf->templat.chroma_format = ChromaToPipe(chroma_type);
p_surf->templat.width = width;
p_surf->templat.height = height;
+ p_surf->templat.interlaced = pipe->screen->get_video_param
+ (
+ pipe->screen,
+ PIPE_VIDEO_PROFILE_UNKNOWN,
+ PIPE_VIDEO_CAP_PREFERS_INTERLACED
+ );
p_surf->video_buffer = pipe->create_video_buffer(pipe, &p_surf->templat);
*surface = vlAddDataHTAB(p_surf);