X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegaudiodec.c;h=52abcb290608bd909592034c7bccbc93046412b5;hb=e00eb03cd8bfb6993d33c30ccd560947b5f6bad5;hp=d6a09c86a8a0bc82b9ff85bafdd01f61734a2e30;hpb=9b4cd586119a6c50907abc35279eb2af63f278a2;p=ffmpeg diff --git a/libavcodec/mpegaudiodec.c b/libavcodec/mpegaudiodec.c index d6a09c86a8a..52abcb29060 100644 --- a/libavcodec/mpegaudiodec.c +++ b/libavcodec/mpegaudiodec.c @@ -174,9 +174,12 @@ static void ff_region_offset2size(GranuleDef *g) static void ff_init_short_region(MPADecodeContext *s, GranuleDef *g) { - if (g->block_type == 2) - g->region_size[0] = (36 / 2); - else { + if (g->block_type == 2) { + if (s->sample_rate_index != 8) + g->region_size[0] = (36 / 2); + else + g->region_size[0] = (72 / 2); + } else { if (s->sample_rate_index <= 2) g->region_size[0] = (36 / 2); else if (s->sample_rate_index != 8) @@ -201,16 +204,14 @@ static void ff_compute_band_indexes(MPADecodeContext *s, GranuleDef *g) if (g->block_type == 2) { if (g->switch_point) { /* if switched mode, we handle the 36 first samples as - long blocks. For 8000Hz, we handle the 48 first - exponents as long blocks (XXX: check this!) */ + long blocks. For 8000Hz, we handle the 72 first + exponents as long blocks */ if (s->sample_rate_index <= 2) g->long_end = 8; - else if (s->sample_rate_index != 8) - g->long_end = 6; else - g->long_end = 4; /* 8000 Hz */ + g->long_end = 6; - g->short_start = 2 + (s->sample_rate_index != 8); + g->short_start = 3; } else { g->long_end = 0; g->short_start = 0; @@ -304,11 +305,8 @@ static av_cold void decode_init_static(void) for (i = 1; i < 16; i++) { const HuffTable *h = &mpa_huff_tables[i]; int xsize, x, y; - uint8_t tmp_bits [512]; - uint16_t tmp_codes[512]; - - memset(tmp_bits , 0, sizeof(tmp_bits )); - memset(tmp_codes, 0, sizeof(tmp_codes)); + uint8_t tmp_bits [512] = { 0 }; + uint16_t tmp_codes[512] = { 0 }; xsize = h->xsize; @@ -439,7 +437,7 @@ static av_cold int decode_init(AVCodecContext * avctx) avctx->sample_fmt= OUT_FMT; s->err_recognition = avctx->err_recognition; - if (avctx->codec_id == CODEC_ID_MP3ADU) + if (avctx->codec_id == AV_CODEC_ID_MP3ADU) s->adu_mode = 1; avcodec_get_frame_defaults(&s->frame); @@ -887,9 +885,7 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, int pos = get_bits_count(&s->gb); if (pos >= end_pos){ -// av_log(NULL, AV_LOG_ERROR, "pos: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); switch_buffer(s, &pos, &end_pos, &end_pos2); -// av_log(NULL, AV_LOG_ERROR, "new pos: %d %d\n", pos, end_pos); if (pos >= end_pos) break; } @@ -963,9 +959,7 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, s_index=0; break; } -// av_log(NULL, AV_LOG_ERROR, "pos2: %d %d %d %d\n", pos, end_pos, end_pos2, s_index); switch_buffer(s, &pos, &end_pos, &end_pos2); -// av_log(NULL, AV_LOG_ERROR, "new pos2: %d %d %d\n", pos, end_pos, s_index); if (pos >= end_pos) break; } @@ -988,7 +982,6 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g, } /* skip extension bits */ bits_left = end_pos2 - 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 && (s->err_recognition & AV_EF_BUFFER)) { av_log(s->avctx, AV_LOG_ERROR, "bits_left=%d\n", bits_left); s_index=0; @@ -1021,7 +1014,7 @@ static void reorder_block(MPADecodeContext *s, GranuleDef *g) if (s->sample_rate_index != 8) ptr = g->sb_hybrid + 36; else - ptr = g->sb_hybrid + 48; + ptr = g->sb_hybrid + 72; } else { ptr = g->sb_hybrid; } @@ -1390,8 +1383,8 @@ static int mp_decode_layer3(MPADecodeContext *s) FFMAX(0, LAST_BUF_SIZE - s->last_buf_size)); assert((get_bits_count(&s->gb) & 7) == 0); /* now we get bits from the main_data_begin offset */ - av_dlog(s->avctx, "seekback: %d\n", main_data_begin); - //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); + av_dlog(s->avctx, "seekback:%d, lastbuf:%d\n", + main_data_begin, s->last_buf_size); memcpy(s->last_buf + s->last_buf_size, ptr, extrasize); s->in_gb = s->gb; @@ -1405,6 +1398,7 @@ static int mp_decode_layer3(MPADecodeContext *s) g = &s->granules[ch][gr]; s->last_buf_size += g->part2_3_length; memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); + compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]); } } skip = s->last_buf_size - 8 * main_data_begin; @@ -1536,7 +1530,7 @@ static int mp_decode_layer3(MPADecodeContext *s) huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); } /* ch */ - if (s->nb_channels == 2) + if (s->mode == MPA_JSTEREO) compute_stereo(s, &s->granules[0][gr], &s->granules[1][gr]); for (ch = 0; ch < s->nb_channels; ch++) { @@ -1578,6 +1572,9 @@ static int mp_decode_frame(MPADecodeContext *s, OUT_INT *samples, default: nb_frames = mp_decode_layer3(s); + if (nb_frames < 0) + return nb_frames; + s->last_buf_size=0; if (s->in_gb.buffer) { align_get_bits(&s->gb); @@ -1639,7 +1636,7 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, int buf_size = avpkt->size; MPADecodeContext *s = avctx->priv_data; uint32_t header; - int out_size; + int ret; if (buf_size < HEADER_SIZE) return AVERROR_INVALIDDATA; @@ -1660,41 +1657,44 @@ static int decode_frame(AVCodecContext * avctx, void *data, int *got_frame_ptr, avctx->channel_layout = s->nb_channels == 1 ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO; if (!avctx->bit_rate) avctx->bit_rate = s->bit_rate; - avctx->sub_id = s->layer; if (s->frame_size <= 0 || s->frame_size > buf_size) { av_log(avctx, AV_LOG_ERROR, "incomplete frame\n"); return AVERROR_INVALIDDATA; } else if (s->frame_size < buf_size) { - av_log(avctx, AV_LOG_ERROR, "incorrect frame size\n"); buf_size= s->frame_size; } - out_size = mp_decode_frame(s, NULL, buf, buf_size); - if (out_size >= 0) { + ret = mp_decode_frame(s, NULL, buf, buf_size); + if (ret >= 0) { *got_frame_ptr = 1; *(AVFrame *)data = s->frame; avctx->sample_rate = s->sample_rate; //FIXME maybe move the other codec info stuff from above here too } else { av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); - /* Only return an error if the bad frame makes up the whole packet. - If there is more data in the packet, just consume the bad frame - instead of returning an error, which would discard the whole - packet. */ + /* Only return an error if the bad frame makes up the whole packet or + * the error is related to buffer management. + * If there is more data in the packet, just consume the bad frame + * instead of returning an error, which would discard the whole + * packet. */ *got_frame_ptr = 0; - if (buf_size == avpkt->size) - return out_size; + if (buf_size == avpkt->size || ret != AVERROR_INVALIDDATA) + return ret; } s->frame_size = 0; return buf_size; } +static void mp_flush(MPADecodeContext *ctx) +{ + memset(ctx->synth_buf, 0, sizeof(ctx->synth_buf)); + ctx->last_buf_size = 0; +} + static void flush(AVCodecContext *avctx) { - MPADecodeContext *s = avctx->priv_data; - memset(s->synth_buf, 0, sizeof(s->synth_buf)); - s->last_buf_size = 0; + mp_flush(avctx->priv_data); } #if CONFIG_MP3ADU_DECODER || CONFIG_MP3ADUFLOAT_DECODER @@ -1705,7 +1705,7 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; MPADecodeContext *s = avctx->priv_data; uint32_t header; - int len, out_size; + int len, ret; len = buf_size; @@ -1733,11 +1733,14 @@ static int decode_frame_adu(AVCodecContext *avctx, void *data, avctx->channels = s->nb_channels; if (!avctx->bit_rate) avctx->bit_rate = s->bit_rate; - avctx->sub_id = s->layer; s->frame_size = len; - out_size = mp_decode_frame(s, NULL, buf, buf_size); + ret = mp_decode_frame(s, NULL, buf, buf_size); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Error while decoding MPEG audio frame.\n"); + return ret; + } *got_frame_ptr = 1; *(AVFrame *)data = s->frame; @@ -1881,11 +1884,8 @@ static void flush_mp3on4(AVCodecContext *avctx) int i; MP3On4DecodeContext *s = avctx->priv_data; - for (i = 0; i < s->frames; i++) { - MPADecodeContext *m = s->mp3decctx[i]; - memset(m->synth_buf, 0, sizeof(m->synth_buf)); - m->last_buf_size = 0; - } + for (i = 0; i < s->frames; i++) + mp_flush(s->mp3decctx[i]); } @@ -1944,7 +1944,10 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, } ch += m->nb_channels; - out_size += mp_decode_frame(m, outptr, buf, fsize); + if ((ret = mp_decode_frame(m, outptr, buf, fsize)) < 0) + return ret; + + out_size += ret; buf += fsize; len -= fsize; @@ -1984,7 +1987,7 @@ static int decode_frame_mp3on4(AVCodecContext *avctx, void *data, AVCodec ff_mp1_decoder = { .name = "mp1", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_MP1, + .id = AV_CODEC_ID_MP1, .priv_data_size = sizeof(MPADecodeContext), .init = decode_init, .decode = decode_frame, @@ -1997,7 +2000,7 @@ AVCodec ff_mp1_decoder = { AVCodec ff_mp2_decoder = { .name = "mp2", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_MP2, + .id = AV_CODEC_ID_MP2, .priv_data_size = sizeof(MPADecodeContext), .init = decode_init, .decode = decode_frame, @@ -2010,7 +2013,7 @@ AVCodec ff_mp2_decoder = { AVCodec ff_mp3_decoder = { .name = "mp3", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_MP3, + .id = AV_CODEC_ID_MP3, .priv_data_size = sizeof(MPADecodeContext), .init = decode_init, .decode = decode_frame, @@ -2023,7 +2026,7 @@ AVCodec ff_mp3_decoder = { AVCodec ff_mp3adu_decoder = { .name = "mp3adu", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_MP3ADU, + .id = AV_CODEC_ID_MP3ADU, .priv_data_size = sizeof(MPADecodeContext), .init = decode_init, .decode = decode_frame_adu, @@ -2036,7 +2039,7 @@ AVCodec ff_mp3adu_decoder = { AVCodec ff_mp3on4_decoder = { .name = "mp3on4", .type = AVMEDIA_TYPE_AUDIO, - .id = CODEC_ID_MP3ON4, + .id = AV_CODEC_ID_MP3ON4, .priv_data_size = sizeof(MP3On4DecodeContext), .init = decode_init_mp3on4, .close = decode_close_mp3on4,