mirror of https://git.ffmpeg.org/ffmpeg.git
mp3: Make the extrasize explicit
Initialize the bit buffer with the correct size (amount of bits that will be read) instead of relying on the bitstream reader overreading the correct values. Signed-off-by: Luca Barbato <lu_zero@gentoo.org> Signed-off-by: Diego Biurrun <diego@biurrun.de>
This commit is contained in:
parent
52567e8198
commit
74b1bf632f
|
@ -70,6 +70,7 @@ typedef struct MPADecodeContext {
|
||||||
MPA_DECODE_HEADER
|
MPA_DECODE_HEADER
|
||||||
uint8_t last_buf[LAST_BUF_SIZE];
|
uint8_t last_buf[LAST_BUF_SIZE];
|
||||||
int last_buf_size;
|
int last_buf_size;
|
||||||
|
int extrasize;
|
||||||
/* next header (used in free format parsing) */
|
/* next header (used in free format parsing) */
|
||||||
uint32_t free_format_next_header;
|
uint32_t free_format_next_header;
|
||||||
GetBitContext gb;
|
GetBitContext gb;
|
||||||
|
@ -798,9 +799,10 @@ static void exponents_from_scale_factors(MPADecodeContext *s, GranuleDef *g,
|
||||||
static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos,
|
static void switch_buffer(MPADecodeContext *s, int *pos, int *end_pos,
|
||||||
int *end_pos2)
|
int *end_pos2)
|
||||||
{
|
{
|
||||||
if (s->in_gb.buffer && *pos >= s->gb.size_in_bits) {
|
if (s->in_gb.buffer && *pos >= s->gb.size_in_bits - s->extrasize * 8) {
|
||||||
s->gb = s->in_gb;
|
s->gb = s->in_gb;
|
||||||
s->in_gb.buffer = NULL;
|
s->in_gb.buffer = NULL;
|
||||||
|
s->extrasize = 0;
|
||||||
assert((get_bits_count(&s->gb) & 7) == 0);
|
assert((get_bits_count(&s->gb) & 7) == 0);
|
||||||
skip_bits_long(&s->gb, *pos - *end_pos);
|
skip_bits_long(&s->gb, *pos - *end_pos);
|
||||||
*end_pos2 =
|
*end_pos2 =
|
||||||
|
@ -832,7 +834,7 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
|
||||||
int i;
|
int i;
|
||||||
int last_pos, bits_left;
|
int last_pos, bits_left;
|
||||||
VLC *vlc;
|
VLC *vlc;
|
||||||
int end_pos = FFMIN(end_pos2, s->gb.size_in_bits);
|
int end_pos = FFMIN(end_pos2, s->gb.size_in_bits - s->extrasize * 8);
|
||||||
|
|
||||||
/* low frequencies (called big values) */
|
/* low frequencies (called big values) */
|
||||||
s_index = 0;
|
s_index = 0;
|
||||||
|
@ -1354,19 +1356,16 @@ static int mp_decode_layer3(MPADecodeContext *s)
|
||||||
if (!s->adu_mode) {
|
if (!s->adu_mode) {
|
||||||
int skip;
|
int skip;
|
||||||
const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
|
const uint8_t *ptr = s->gb.buffer + (get_bits_count(&s->gb)>>3);
|
||||||
int extrasize = av_clip(get_bits_left(&s->gb) >> 3, 0,
|
s->extrasize = av_clip((get_bits_left(&s->gb) >> 3) - s->extrasize, 0,
|
||||||
FFMAX(0, LAST_BUF_SIZE - s->last_buf_size));
|
FFMAX(0, LAST_BUF_SIZE - s->last_buf_size));
|
||||||
assert((get_bits_count(&s->gb) & 7) == 0);
|
assert((get_bits_count(&s->gb) & 7) == 0);
|
||||||
/* now we get bits from the main_data_begin offset */
|
/* now we get bits from the main_data_begin offset */
|
||||||
ff_dlog(s->avctx, "seekback:%d, lastbuf:%d\n",
|
ff_dlog(s->avctx, "seekback:%d, lastbuf:%d\n",
|
||||||
main_data_begin, s->last_buf_size);
|
main_data_begin, s->last_buf_size);
|
||||||
|
|
||||||
memcpy(s->last_buf + s->last_buf_size, ptr, extrasize);
|
memcpy(s->last_buf + s->last_buf_size, ptr, s->extrasize);
|
||||||
s->in_gb = s->gb;
|
s->in_gb = s->gb;
|
||||||
init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8);
|
init_get_bits(&s->gb, s->last_buf, (s->last_buf_size + s->extrasize) * 8);
|
||||||
#if !UNCHECKED_BITSTREAM_READER
|
|
||||||
s->gb.size_in_bits_plus8 += extrasize * 8;
|
|
||||||
#endif
|
|
||||||
s->last_buf_size <<= 3;
|
s->last_buf_size <<= 3;
|
||||||
for (gr = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++) {
|
for (gr = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++) {
|
||||||
for (ch = 0; ch < s->nb_channels; ch++) {
|
for (ch = 0; ch < s->nb_channels; ch++) {
|
||||||
|
@ -1377,15 +1376,17 @@ static int mp_decode_layer3(MPADecodeContext *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
skip = s->last_buf_size - 8 * main_data_begin;
|
skip = s->last_buf_size - 8 * main_data_begin;
|
||||||
if (skip >= s->gb.size_in_bits && s->in_gb.buffer) {
|
if (skip >= s->gb.size_in_bits - s->extrasize * 8 && s->in_gb.buffer) {
|
||||||
skip_bits_long(&s->in_gb, skip - s->gb.size_in_bits);
|
skip_bits_long(&s->in_gb, skip - s->gb.size_in_bits + s->extrasize * 8);
|
||||||
s->gb = s->in_gb;
|
s->gb = s->in_gb;
|
||||||
s->in_gb.buffer = NULL;
|
s->in_gb.buffer = NULL;
|
||||||
|
s->extrasize = 0;
|
||||||
} else {
|
} else {
|
||||||
skip_bits_long(&s->gb, skip);
|
skip_bits_long(&s->gb, skip);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
gr = 0;
|
gr = 0;
|
||||||
|
s->extrasize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; gr < nb_granules; gr++) {
|
for (; gr < nb_granules; gr++) {
|
||||||
|
@ -1553,7 +1554,7 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples,
|
||||||
s->last_buf_size=0;
|
s->last_buf_size=0;
|
||||||
if (s->in_gb.buffer) {
|
if (s->in_gb.buffer) {
|
||||||
align_get_bits(&s->gb);
|
align_get_bits(&s->gb);
|
||||||
i = get_bits_left(&s->gb)>>3;
|
i = (get_bits_left(&s->gb) >> 3) - s->extrasize;
|
||||||
if (i >= 0 && i <= BACKSTEP_SIZE) {
|
if (i >= 0 && i <= BACKSTEP_SIZE) {
|
||||||
memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i);
|
memmove(s->last_buf, s->gb.buffer + (get_bits_count(&s->gb)>>3), i);
|
||||||
s->last_buf_size=i;
|
s->last_buf_size=i;
|
||||||
|
@ -1561,12 +1562,12 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT **samples,
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "invalid old backstep %d\n", i);
|
av_log(s->avctx, AV_LOG_ERROR, "invalid old backstep %d\n", i);
|
||||||
s->gb = s->in_gb;
|
s->gb = s->in_gb;
|
||||||
s->in_gb.buffer = NULL;
|
s->in_gb.buffer = NULL;
|
||||||
|
s->extrasize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
align_get_bits(&s->gb);
|
align_get_bits(&s->gb);
|
||||||
assert((get_bits_count(&s->gb) & 7) == 0);
|
assert((get_bits_count(&s->gb) & 7) == 0);
|
||||||
i = get_bits_left(&s->gb) >> 3;
|
i = (get_bits_left(&s->gb) >> 3) - s->extrasize;
|
||||||
|
|
||||||
if (i < 0 || i > BACKSTEP_SIZE || nb_frames < 0) {
|
if (i < 0 || i > BACKSTEP_SIZE || nb_frames < 0) {
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "invalid new backstep %d\n", i);
|
av_log(s->avctx, AV_LOG_ERROR, "invalid new backstep %d\n", i);
|
||||||
|
|
Loading…
Reference in New Issue