h263dec: Propagate AV_LOG_ERRORs from slice decoding through frame decoding with sufficient error recognition
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
committed by
Ronald S. Bultje
parent
f5f004bc5a
commit
2a11952f45
@@ -470,6 +470,8 @@ FF_ER_COMPLIANT
|
|||||||
FF_ER_AGGRESSIVE
|
FF_ER_AGGRESSIVE
|
||||||
@item 4
|
@item 4
|
||||||
FF_ER_VERY_AGGRESSIVE
|
FF_ER_VERY_AGGRESSIVE
|
||||||
|
@item 5
|
||||||
|
FF_ER_EXPLODE
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item -ec @var{bit_mask}
|
@item -ec @var{bit_mask}
|
||||||
|
@@ -1446,6 +1446,7 @@ typedef struct AVCodecContext {
|
|||||||
#define FF_ER_COMPLIANT 2
|
#define FF_ER_COMPLIANT 2
|
||||||
#define FF_ER_AGGRESSIVE 3
|
#define FF_ER_AGGRESSIVE 3
|
||||||
#define FF_ER_VERY_AGGRESSIVE 4
|
#define FF_ER_VERY_AGGRESSIVE 4
|
||||||
|
#define FF_ER_EXPLODE 5
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called at the beginning of each frame to get a buffer for it.
|
* Called at the beginning of each frame to get a buffer for it.
|
||||||
|
@@ -638,7 +638,7 @@ retry:
|
|||||||
s->mb_x=0;
|
s->mb_x=0;
|
||||||
s->mb_y=0;
|
s->mb_y=0;
|
||||||
|
|
||||||
decode_slice(s);
|
ret = decode_slice(s);
|
||||||
while(s->mb_y<s->mb_height){
|
while(s->mb_y<s->mb_height){
|
||||||
if(s->msmpeg4_version){
|
if(s->msmpeg4_version){
|
||||||
if(s->slice_height==0 || s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
|
if(s->slice_height==0 || s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
|
||||||
@@ -654,7 +654,7 @@ retry:
|
|||||||
if(s->msmpeg4_version<4 && s->h263_pred)
|
if(s->msmpeg4_version<4 && s->h263_pred)
|
||||||
ff_mpeg4_clean_buffers(s);
|
ff_mpeg4_clean_buffers(s);
|
||||||
|
|
||||||
decode_slice(s);
|
if (decode_slice(s) < 0) ret = AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I)
|
if (s->msmpeg4_version && s->msmpeg4_version<4 && s->pict_type==AV_PICTURE_TYPE_I)
|
||||||
@@ -722,7 +722,7 @@ assert(s->current_picture.pict_type == s->pict_type);
|
|||||||
av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
|
av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return get_consumed_bytes(s, buf_size);
|
return (ret && avctx->error_recognition >= FF_ER_EXPLODE)?ret:get_consumed_bytes(s, buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
AVCodec ff_h263_decoder = {
|
AVCodec ff_h263_decoder = {
|
||||||
|
@@ -184,6 +184,7 @@ static const AVOption options[]={
|
|||||||
{"compliant", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_COMPLIANT }, INT_MIN, INT_MAX, V|D, "er"},
|
{"compliant", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_COMPLIANT }, INT_MIN, INT_MAX, V|D, "er"},
|
||||||
{"aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"},
|
{"aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"},
|
||||||
{"very_aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_VERY_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"},
|
{"very_aggressive", NULL, 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_VERY_AGGRESSIVE }, INT_MIN, INT_MAX, V|D, "er"},
|
||||||
|
{"explode", "abort decoding on error recognition", 0, FF_OPT_TYPE_CONST, {.dbl = FF_ER_EXPLODE }, INT_MIN, INT_MAX, V|D, "er"},
|
||||||
{"has_b_frames", NULL, OFFSET(has_b_frames), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
{"has_b_frames", NULL, OFFSET(has_b_frames), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
||||||
{"block_align", NULL, OFFSET(block_align), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
{"block_align", NULL, OFFSET(block_align), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
||||||
{"parse_only", NULL, OFFSET(parse_only), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
{"parse_only", NULL, OFFSET(parse_only), FF_OPT_TYPE_INT, {.dbl = DEFAULT }, INT_MIN, INT_MAX},
|
||||||
|
Reference in New Issue
Block a user