[FFmpeg-cvslog] r25243 - trunk/libavcodec/h264.c

darkshikari subversion
Tue Sep 28 11:06:23 CEST 2010


Author: darkshikari
Date: Tue Sep 28 11:06:22 2010
New Revision: 25243

Log:
Try to fix crashes introduced by r25218

r25218 made assumptions about the existence of past reference frames that 
weren't necessarily true.

Modified:
   trunk/libavcodec/h264.c

Modified: trunk/libavcodec/h264.c
==============================================================================
--- trunk/libavcodec/h264.c	Tue Sep 28 05:45:27 2010	(r25242)
+++ trunk/libavcodec/h264.c	Tue Sep 28 11:06:22 2010	(r25243)
@@ -1898,6 +1898,7 @@ static int decode_slice_header(H264Conte
     if(h0->current_slice == 0){
         while(h->frame_num !=  h->prev_frame_num &&
               h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){
+            Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
             av_log(h->s.avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num);
             if (ff_h264_frame_start(h) < 0)
                 return -1;
@@ -1912,11 +1913,15 @@ static int decode_slice_header(H264Conte
              * FIXME: this doesn't copy padding for out-of-frame motion vectors.  Given we're
              * concealing a lost frame, this probably isn't noticable by comparison, but it should
              * be fixed. */
-            av_image_copy(h->short_ref[0]->data, h->short_ref[0]->linesize,
-                          (const uint8_t**)h->short_ref[1]->data, h->short_ref[1]->linesize,
-                          PIX_FMT_YUV420P, s->mb_width*16, s->mb_height*16);
-            h->short_ref[0]->frame_num = h->prev_frame_num;
-            h->short_ref[0]->poc = h->short_ref[1]->poc+2;
+            if (h->short_ref_count) {
+                if (prev) {
+                    av_image_copy(h->short_ref[0]->data, h->short_ref[0]->linesize,
+                                  (const uint8_t**)prev->data, prev->linesize,
+                                  PIX_FMT_YUV420P, s->mb_width*16, s->mb_height*16);
+                    h->short_ref[0]->poc = prev->poc+2;
+                }
+                h->short_ref[0]->frame_num = h->prev_frame_num;
+            }
         }
 
         /* See if we have a decoded first field looking for a pair... */



More information about the ffmpeg-cvslog mailing list