diff options
author | Christian König <deathsimple@vodafone.de> | 2012-01-10 15:06:44 +0100 |
---|---|---|
committer | Christian König <deathsimple@vodafone.de> | 2012-01-15 12:40:44 +0100 |
commit | 020a6f6cd8c3c8632f68e1f47ba3c63f2315e47e (patch) | |
tree | 7b1a743e63f5686b386b26049bc2292272cda528 /src | |
parent | 4a4811ea178fb158339c1fbfacc58a9ab97058f8 (diff) |
st/vdpau: recreate video buffer if decode doesn't like it
Recreate the video buffer if the decoder can't handle it.
Signed-off-by: Christian König <deathsimple@vodafone.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/state_trackers/vdpau/decode.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/vdpau/decode.c b/src/gallium/state_trackers/vdpau/decode.c index d618fff178..00232ad982 100644 --- a/src/gallium/state_trackers/vdpau/decode.c +++ b/src/gallium/state_trackers/vdpau/decode.c @@ -391,6 +391,7 @@ vlVdpDecoderRender(VdpDecoder decoder, vlVdpDecoder *vldecoder; vlVdpSurface *vlsurf; VdpStatus ret; + struct pipe_screen *screen; struct pipe_video_decoder *dec; unsigned i; union { @@ -410,6 +411,7 @@ vlVdpDecoderRender(VdpDecoder decoder, if (!vldecoder) return VDP_STATUS_INVALID_HANDLE; dec = vldecoder->decoder; + screen = dec->context->screen; vlsurf = (vlVdpSurface *)vlGetDataHTAB(target); if (!vlsurf) @@ -418,10 +420,28 @@ vlVdpDecoderRender(VdpDecoder decoder, if (vlsurf->device != vldecoder->device) return VDP_STATUS_HANDLE_DEVICE_MISMATCH; - if (vlsurf->video_buffer->chroma_format != dec->chroma_format) + if (vlsurf->video_buffer != NULL && vlsurf->video_buffer->chroma_format != dec->chroma_format) // TODO: Recreate decoder with correct chroma return VDP_STATUS_INVALID_CHROMA_TYPE; + if (vlsurf->video_buffer == NULL || + !screen->is_video_format_supported(screen, vlsurf->video_buffer->buffer_format, dec->profile)) { + + /* destroy the old one */ + if (vlsurf->video_buffer) + vlsurf->video_buffer->destroy(vlsurf->video_buffer); + + /* set the buffer format to the prefered one */ + vlsurf->templat.buffer_format = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_CAP_PREFERED_FORMAT); + + /* and recreate the video buffer */ + vlsurf->video_buffer = dec->context->create_video_buffer(dec->context, &vlsurf->templat); + + /* still no luck? get me out of here... */ + if (!vlsurf->video_buffer) + return VDP_STATUS_NO_IMPLEMENTATION; + } + memset(&desc, 0, sizeof(desc)); desc.base.profile = dec->profile; switch (u_reduce_video_profile(dec->profile)) { |