[FFmpeg-cvslog] VC1 VDPAU: Mark missing reference frames as such.

Reimar Döffinger git at videolan.org
Wed Oct 2 20:51:49 CEST 2013


ffmpeg | branch: master | Reimar Döffinger <Reimar.Doeffinger at gmx.de> | Sat Sep 28 11:13:35 2013 +0200| [af6e232ccf8db2341361f02852017aac48772950] | committer: Reimar Döffinger

VC1 VDPAU: Mark missing reference frames as such.

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 <Reimar.Doeffinger at gmx.de>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=af6e232ccf8db2341361f02852017aac48772950
---

 libavcodec/vdpau_vc1.c |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/libavcodec/vdpau_vc1.c b/libavcodec/vdpau_vc1.c
index 272b2d9..c6e3343 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;



More information about the ffmpeg-cvslog mailing list