comparison mpeg12.c @ 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 b71d3566fc6d
children 0a8c847ad5e7
comparison
equal deleted inserted replaced
2785:c8d53188048d 2786:ee07e99e034f
2218 2218
2219 vbv_delay= get_bits(&s->gb, 16); 2219 vbv_delay= get_bits(&s->gb, 16);
2220 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) { 2220 if (s->pict_type == P_TYPE || s->pict_type == B_TYPE) {
2221 s->full_pel[0] = get_bits1(&s->gb); 2221 s->full_pel[0] = get_bits1(&s->gb);
2222 f_code = get_bits(&s->gb, 3); 2222 f_code = get_bits(&s->gb, 3);
2223 if (f_code == 0) 2223 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
2224 return -1; 2224 return -1;
2225 s->mpeg_f_code[0][0] = f_code; 2225 s->mpeg_f_code[0][0] = f_code;
2226 s->mpeg_f_code[0][1] = f_code; 2226 s->mpeg_f_code[0][1] = f_code;
2227 } 2227 }
2228 if (s->pict_type == B_TYPE) { 2228 if (s->pict_type == B_TYPE) {
2229 s->full_pel[1] = get_bits1(&s->gb); 2229 s->full_pel[1] = get_bits1(&s->gb);
2230 f_code = get_bits(&s->gb, 3); 2230 f_code = get_bits(&s->gb, 3);
2231 if (f_code == 0) 2231 if (f_code == 0 && avctx->error_resilience >= FF_ER_COMPLIANT)
2232 return -1; 2232 return -1;
2233 s->mpeg_f_code[1][0] = f_code; 2233 s->mpeg_f_code[1][0] = f_code;
2234 s->mpeg_f_code[1][1] = f_code; 2234 s->mpeg_f_code[1][1] = f_code;
2235 } 2235 }
2236 s->current_picture.pict_type= s->pict_type; 2236 s->current_picture.pict_type= s->pict_type;
3136 default: 3136 default:
3137 if (start_code >= SLICE_MIN_START_CODE && 3137 if (start_code >= SLICE_MIN_START_CODE &&
3138 start_code <= SLICE_MAX_START_CODE) { 3138 start_code <= SLICE_MAX_START_CODE) {
3139 int mb_y= start_code - SLICE_MIN_START_CODE; 3139 int mb_y= start_code - SLICE_MIN_START_CODE;
3140 3140
3141 if(s2->last_picture_ptr==NULL){
3141 /* skip b frames if we dont have reference frames */ 3142 /* skip b frames if we dont have reference frames */
3142 if(s2->last_picture_ptr==NULL && s2->pict_type==B_TYPE) break; 3143 if(s2->pict_type==B_TYPE) break;
3144 /* skip P frames if we dont have reference frame no valid header */
3145 if(s2->pict_type==P_TYPE && !s2->first_slice) break;
3146 }
3143 /* skip b frames if we are in a hurry */ 3147 /* skip b frames if we are in a hurry */
3144 if(avctx->hurry_up && s2->pict_type==B_TYPE) break; 3148 if(avctx->hurry_up && s2->pict_type==B_TYPE) break;
3145 /* skip everything if we are in a hurry>=5 */ 3149 /* skip everything if we are in a hurry>=5 */
3146 if(avctx->hurry_up>=5) break; 3150 if(avctx->hurry_up>=5) break;
3147 3151