mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-08-18 15:25:05 +02:00
make the h263 decoder more error tolerant
Originally committed as revision 2099 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
e7d0374f27
commit
ffba1dc02b
@ -2500,6 +2500,8 @@ static int h263_decode_gob_header(MpegEncContext *s)
|
|||||||
return -1;
|
return -1;
|
||||||
s->mb_x= 0;
|
s->mb_x= 0;
|
||||||
s->mb_y= s->gob_index* s->gob_number;
|
s->mb_y= s->gob_index* s->gob_number;
|
||||||
|
if(s->mb_y >= s->mb_height)
|
||||||
|
return -1;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
|
fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale);
|
||||||
#endif
|
#endif
|
||||||
@ -4069,7 +4071,7 @@ int h263_decode_picture_header(MpegEncContext *s)
|
|||||||
|
|
||||||
startcode= get_bits(&s->gb, 22-8);
|
startcode= get_bits(&s->gb, 22-8);
|
||||||
|
|
||||||
for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>0; i--) {
|
for(i= s->gb.size_in_bits - get_bits_count(&s->gb); i>24; i-=8) {
|
||||||
startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
|
startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
|
||||||
|
|
||||||
if(startcode == 0x20)
|
if(startcode == 0x20)
|
||||||
@ -4116,8 +4118,6 @@ int h263_decode_picture_header(MpegEncContext *s)
|
|||||||
if (!width)
|
if (!width)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
s->width = width;
|
|
||||||
s->height = height;
|
|
||||||
s->pict_type = I_TYPE + get_bits1(&s->gb);
|
s->pict_type = I_TYPE + get_bits1(&s->gb);
|
||||||
|
|
||||||
s->unrestricted_mv = get_bits1(&s->gb);
|
s->unrestricted_mv = get_bits1(&s->gb);
|
||||||
@ -4137,6 +4137,9 @@ int h263_decode_picture_header(MpegEncContext *s)
|
|||||||
}
|
}
|
||||||
s->qscale = get_bits(&s->gb, 5);
|
s->qscale = get_bits(&s->gb, 5);
|
||||||
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
|
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
|
||||||
|
|
||||||
|
s->width = width;
|
||||||
|
s->height = height;
|
||||||
} else {
|
} else {
|
||||||
int ufep;
|
int ufep;
|
||||||
|
|
||||||
|
@ -470,6 +470,15 @@ retry:
|
|||||||
} else {
|
} else {
|
||||||
ret = h263_decode_picture_header(s);
|
ret = h263_decode_picture_header(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
|
||||||
|
|
||||||
|
/* skip if the header was thrashed */
|
||||||
|
if (ret < 0){
|
||||||
|
fprintf(stderr, "header damaged\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
avctx->has_b_frames= !s->low_delay;
|
avctx->has_b_frames= !s->low_delay;
|
||||||
|
|
||||||
if(s->workaround_bugs&FF_BUG_AUTODETECT){
|
if(s->workaround_bugs&FF_BUG_AUTODETECT){
|
||||||
@ -604,13 +613,6 @@ retry:
|
|||||||
|
|
||||||
if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
|
if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
|
||||||
s->gob_index = ff_h263_get_gob_height(s);
|
s->gob_index = ff_h263_get_gob_height(s);
|
||||||
|
|
||||||
if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
|
|
||||||
/* skip if the header was thrashed */
|
|
||||||
if (ret < 0){
|
|
||||||
fprintf(stderr, "header damaged\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for hurry_up==5
|
// for hurry_up==5
|
||||||
s->current_picture.pict_type= s->pict_type;
|
s->current_picture.pict_type= s->pict_type;
|
||||||
|
@ -1004,6 +1004,14 @@ alloc:
|
|||||||
if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr;
|
if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr;
|
||||||
if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr;
|
if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr;
|
||||||
|
|
||||||
|
if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){
|
||||||
|
fprintf(stderr, "warning: first frame is no keyframe\n");
|
||||||
|
assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
|
||||||
|
goto alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(s->pict_type == I_TYPE || (s->last_picture_ptr && s->last_picture_ptr->data[0]));
|
||||||
|
|
||||||
if(s->picture_structure!=PICT_FRAME){
|
if(s->picture_structure!=PICT_FRAME){
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<4; i++){
|
for(i=0; i<4; i++){
|
||||||
@ -1015,12 +1023,6 @@ alloc:
|
|||||||
s->next_picture.linesize[i] *=2;
|
s->next_picture.linesize[i] *=2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){
|
|
||||||
fprintf(stderr, "warning: first frame is no keyframe\n");
|
|
||||||
assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference
|
|
||||||
goto alloc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s->hurry_up= s->avctx->hurry_up;
|
s->hurry_up= s->avctx->hurry_up;
|
||||||
|
Loading…
Reference in New Issue
Block a user