|
|
|
@@ -89,6 +89,7 @@ typedef struct MPADecodeContext { |
|
|
|
void (*compute_antialias)(struct MPADecodeContext *s, struct GranuleDef *g); |
|
|
|
int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 |
|
|
|
int dither_state; |
|
|
|
int error_resilience; |
|
|
|
} MPADecodeContext; |
|
|
|
|
|
|
|
/** |
|
|
|
@@ -305,6 +306,7 @@ static int decode_init(AVCodecContext * avctx) |
|
|
|
#else |
|
|
|
avctx->sample_fmt= SAMPLE_FMT_S16; |
|
|
|
#endif |
|
|
|
s->error_resilience= avctx->error_resilience; |
|
|
|
|
|
|
|
if(avctx->antialias_algo != FF_AA_FLOAT) |
|
|
|
s->compute_antialias= compute_antialias_integer; |
|
|
|
@@ -1705,6 +1707,8 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, |
|
|
|
s_index -= 4; |
|
|
|
skip_bits_long(&s->gb, last_pos - pos); |
|
|
|
av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); |
|
|
|
if(s->error_resilience >= FF_ER_COMPLIANT) |
|
|
|
s_index=0; |
|
|
|
break; |
|
|
|
} |
|
|
|
// av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); |
|
|
|
@@ -1742,14 +1746,17 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, |
|
|
|
} |
|
|
|
s_index+=4; |
|
|
|
} |
|
|
|
memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index)); |
|
|
|
|
|
|
|
/* skip extension bits */ |
|
|
|
bits_left = end_pos - get_bits_count(&s->gb); |
|
|
|
//av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer); |
|
|
|
if (bits_left < 0) { |
|
|
|
if (bits_left < 0 || bits_left > 16) { |
|
|
|
av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left); |
|
|
|
s_index=0; |
|
|
|
}else if(bits_left > 0 && s->error_resilience >= FF_ER_AGGRESSIVE){ |
|
|
|
av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left); |
|
|
|
s_index=0; |
|
|
|
} |
|
|
|
memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index)); |
|
|
|
skip_bits_long(&s->gb, bits_left); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|