summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/libfdk-aacdec.c68
1 files changed, 18 insertions, 50 deletions
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 30dd59f983..9f896ef2e2 100644
--- a/libavcodec/libfdk-aacdec.c
+++ b/libavcodec/libfdk-aacdec.c
@@ -41,8 +41,8 @@ enum ConcealMethod {
typedef struct FDKAACDecContext {
const AVClass *class;
HANDLE_AACDECODER handle;
- int initialized;
uint8_t *decoder_buffer;
+ int decoder_buffer_size;
uint8_t *anc_buffer;
enum ConcealMethod conceal_method;
int drc_level;
@@ -305,6 +305,13 @@ static av_cold int fdk_aac_decode_init(AVCodecContext *avctx)
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+ s->decoder_buffer_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
+ s->decoder_buffer = av_malloc(s->decoder_buffer_size);
+ if (!s->decoder_buffer) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
return 0;
fail:
fdk_aac_decode_close(avctx);
@@ -319,8 +326,6 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
int ret;
AAC_DECODER_ERROR err;
UINT valid = avpkt->size;
- uint8_t *buf, *tmpptr = NULL;
- int buf_size;
err = aacDecoder_Fill(s->handle, &avpkt->data, &avpkt->size, &valid);
if (err != AAC_DEC_OK) {
@@ -328,33 +333,7 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
return AVERROR_INVALIDDATA;
}
- if (s->initialized) {
- frame->nb_samples = avctx->frame_size;
- if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
- av_log(avctx, AV_LOG_ERROR, "ff_get_buffer() failed\n");
- return ret;
- }
-
- if (s->anc_buffer) {
- buf_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
- buf = s->decoder_buffer;
- } else {
- buf = frame->extended_data[0];
- buf_size = avctx->channels * frame->nb_samples *
- av_get_bytes_per_sample(avctx->sample_fmt);
- }
- } else {
- buf_size = DECODER_BUFFSIZE * DECODER_MAX_CHANNELS;
-
- if (!s->decoder_buffer)
- s->decoder_buffer = av_malloc(buf_size);
- if (!s->decoder_buffer)
- return AVERROR(ENOMEM);
-
- buf = tmpptr = s->decoder_buffer;
- }
-
- err = aacDecoder_DecodeFrame(s->handle, (INT_PCM *) buf, buf_size, 0);
+ err = aacDecoder_DecodeFrame(s->handle, (INT_PCM *) s->decoder_buffer, s->decoder_buffer_size, 0);
if (err == AAC_DEC_NOT_ENOUGH_BITS) {
ret = avpkt->size - valid;
goto end;
@@ -366,28 +345,17 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
goto end;
}
- if (!s->initialized) {
- if ((ret = get_stream_info(avctx)) < 0)
- goto end;
- s->initialized = 1;
- frame->nb_samples = avctx->frame_size;
- }
-
- if (tmpptr) {
- frame->nb_samples = avctx->frame_size;
- if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
- av_log(avctx, AV_LOG_ERROR, "ff_get_buffer() failed\n");
- goto end;
- }
- }
- if (s->decoder_buffer) {
- memcpy(frame->extended_data[0], buf,
- avctx->channels * avctx->frame_size *
- av_get_bytes_per_sample(avctx->sample_fmt));
+ if ((ret = get_stream_info(avctx)) < 0)
+ goto end;
+ frame->nb_samples = avctx->frame_size;
- if (!s->anc_buffer)
- av_freep(&s->decoder_buffer);
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "ff_get_buffer() failed\n");
+ goto end;
}
+ memcpy(frame->extended_data[0], s->decoder_buffer,
+ avctx->channels * avctx->frame_size *
+ av_get_bytes_per_sample(avctx->sample_fmt));
*got_frame_ptr = 1;
ret = avpkt->size - valid;