Commit 02fb0d7c authored by Michael Niedermayer's avatar Michael Niedermayer

fix decoding of (broken) files with f_code=0

fix segfault if the first P frames header is damaged

Originally committed as revision 4432 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent e0827ba4
...@@ -2220,7 +2220,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx, ...@@ -2220,7 +2220,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx,
if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
s->full_pel[0] = get_bits1(&s->gb); s->full_pel[0] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3); f_code = get_bits(&s->gb, 3);
if (f_code == 0) if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
return -1; return -1;
s->mpeg_f_code[0][0] = f_code; s->mpeg_f_code[0][0] = f_code;
s->mpeg_f_code[0][1] = f_code; s->mpeg_f_code[0][1] = f_code;
...@@ -2228,7 +2228,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx, ...@@ -2228,7 +2228,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx,
if (s->pict_type == B_TYPE) { if (s->pict_type == B_TYPE) {
s->full_pel[1] = get_bits1(&s->gb); s->full_pel[1] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3); f_code = get_bits(&s->gb, 3);
if (f_code == 0) if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
return -1; return -1;
s->mpeg_f_code[1][0] = f_code; s->mpeg_f_code[1][0] = f_code;
s->mpeg_f_code[1][1] = f_code; s->mpeg_f_code[1][1] = f_code;
...@@ -3138,8 +3138,12 @@ static int mpeg_decode_frame(AVCodecContext *avctx, ...@@ -3138,8 +3138,12 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
start_code <= SLICE_MAX_START_CODE) { start_code <= SLICE_MAX_START_CODE) {
int mb_y= start_code - SLICE_MIN_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 */ /* 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 */ /* skip b frames if we are in a hurry */
if(avctx->hurry_up && s2->pict_type==B_TYPE) break; if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
/* skip everything if we are in a hurry>=5 */ /* skip everything if we are in a hurry>=5 */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment