Restructure dummy frame allocation.

New code also allocates a dummy frame for an p field after an i field,
previously that could segfault due to reading from NULL+x.

Originally committed as revision 20653 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Michael Niedermayer 15 years ago
parent 729ef3ba62
commit d9b99556bf
  1. 25
      libavcodec/mpeg12.c

@ -2371,14 +2371,8 @@ static int decode_chunks(AVCodecContext *avctx,
if(s2->last_picture_ptr==NULL){
/* Skip B-frames if we do not have reference frames and gop is not closed */
if(s2->pict_type==FF_B_TYPE){
int i;
if(!s2->closed_gop)
break;
/* Allocate a dummy frame */
i= ff_find_unused_picture(s2, 0);
s2->last_picture_ptr= &s2->picture[i];
if(ff_alloc_picture(s2, s2->last_picture_ptr, 0) < 0)
return -1;
}
}
if(s2->next_picture_ptr==NULL){
@ -2416,6 +2410,25 @@ static int decode_chunks(AVCodecContext *avctx,
return -1;
}
if(s2->last_picture_ptr==NULL && s2->pict_type!=FF_I_TYPE){
int i;
/* Allocate a dummy frame */
i= ff_find_unused_picture(s2, 0);
s2->last_picture_ptr= &s2->picture[i];
if(ff_alloc_picture(s2, s2->last_picture_ptr, 0) < 0)
return -1;
s2->last_picture= *s2->last_picture_ptr;
}
if(s2->next_picture_ptr==NULL && s2->pict_type==FF_B_TYPE){
int i;
/* Allocate a dummy frame */
i= ff_find_unused_picture(s2, 0);
s2->next_picture_ptr= &s2->picture[i];
if(ff_alloc_picture(s2, s2->next_picture_ptr, 0) < 0)
return -1;
s2->next_picture= *s2->next_picture_ptr;
}
if (avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU) {
s->slice_count++;
break;

Loading…
Cancel
Save