# HG changeset patch # User michael # Date 1259463911 0 # Node ID 73779b8e6c5f1c407b48528da7fe890605722f93 # Parent 46cb472ecc1ef134f66395de9445b710eb0786ae 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. diff -r 46cb472ecc1e -r 73779b8e6c5f mpeg12.c --- a/mpeg12.c Sun Nov 29 01:50:43 2009 +0000 +++ b/mpeg12.c Sun Nov 29 03:05:11 2009 +0000 @@ -2371,14 +2371,8 @@ 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 @@ 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;