From af6e232ccf8db2341361f02852017aac48772950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Sat, 28 Sep 2013 11:13:35 +0200 Subject: [PATCH] VC1 VDPAU: Mark missing reference frames as such. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the code passes some nonsense values as references instead, causing corruption with NVidia's and assertion failures with Mesa's implementation. For non-corrupted input this mostly happens in interlaced bitstreams, e.g. http://samples.mplayerhq.hu/V-codecs/WMV9/interlaced/480i30__codec_WVC1__mode_2__framerate_29.970__type_2__preproc_17.wmv. The != VDP_INVALID handle assert does not trigger (and probably is quite nonsense) because the frames are initialized to 0. Signed-off-by: Reimar Döffinger --- libavcodec/vdpau_vc1.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavcodec/vdpau_vc1.c b/libavcodec/vdpau_vc1.c index 272b2d9d94..c6e3343460 100644 --- a/libavcodec/vdpau_vc1.c +++ b/libavcodec/vdpau_vc1.c @@ -44,14 +44,18 @@ static int vdpau_vc1_start_frame(AVCodecContext *avctx, switch (s->pict_type) { case AV_PICTURE_TYPE_B: + if (s->next_picture_ptr) { ref = ff_vdpau_get_surface_id(&s->next_picture); assert(ref != VDP_INVALID_HANDLE); info->backward_reference = ref; + } /* fall-through */ case AV_PICTURE_TYPE_P: + if (s->last_picture_ptr) { ref = ff_vdpau_get_surface_id(&s->last_picture); assert(ref != VDP_INVALID_HANDLE); info->forward_reference = ref; + } } info->slice_count = 0;