Mercurial > libavcodec.hg
changeset 2786:ee07e99e034f libavcodec
fix decoding of (broken) files with f_code=0
fix segfault if the first P frames header is damaged
author | michael |
---|---|
date | Mon, 11 Jul 2005 22:15:03 +0000 |
parents | c8d53188048d |
children | af90d5dc83f0 |
files | mpeg12.c |
diffstat | 1 files changed, 7 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mpeg12.c Mon Jul 11 00:43:21 2005 +0000 +++ b/mpeg12.c Mon Jul 11 22:15:03 2005 +0000 @@ -2220,7 +2220,7 @@ if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { s->full_pel[0] = get_bits1(&s->gb); f_code = get_bits(&s->gb, 3); - if (f_code == 0) + if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) return -1; s->mpeg_f_code[0][0] = f_code; s->mpeg_f_code[0][1] = f_code; @@ -2228,7 +2228,7 @@ if (s->pict_type == B_TYPE) { s->full_pel[1] = get_bits1(&s->gb); f_code = get_bits(&s->gb, 3); - if (f_code == 0) + if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT) return -1; s->mpeg_f_code[1][0] = f_code; s->mpeg_f_code[1][1] = f_code; @@ -3138,8 +3138,12 @@ start_code <= SLICE_MAX_START_CODE) { int mb_y= start_code - SLICE_MIN_START_CODE; + if(s2->last_picture_ptr==NULL){ /* skip b frames if we dont have reference frames */ - if(s2->last_picture_ptr==NULL && s2->pict_type==B_TYPE) break; + if(s2->pict_type==B_TYPE) break; + /* skip P frames if we dont have reference frame no valid header */ + if(s2->pict_type==P_TYPE && !s2->first_slice) break; + } /* skip b frames if we are in a hurry */ if(avctx->hurry_up && s2->pict_type==B_TYPE) break; /* skip everything if we are in a hurry>=5 */