r25243 - trunk/libavcodec/h264.c
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... */
darkshikari <subversion <at> mplayerhq.hu> writes:
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.
r25218 made VDPAU (i.e. mplayer -vc ffh264vdpau) crash immediately for some streams (DVB recordings, not Apple trailers). With this change, the streams start to play, show heavy corruption and crash sooner or later (or with a double free on exit). Would a backtrace help? Carl Eugen
participants (2)
-
cehoyos@ag.or.at -
subversion@mplayerhq.hu