summaryrefslogtreecommitdiff
path: root/libavcodec/libfdk-aacdec.c
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2015-08-18 09:05:54 +0200
committerHendrik Leppkes <h.leppkes@gmail.com>2015-08-18 09:05:54 +0200
commit4cf4831ae7e2b6ccbea9c2d65605a3722aeac9c2 (patch)
treefc30426dbe9c0f6c4a5a55e48659f136f0789e10 /libavcodec/libfdk-aacdec.c
parent9dc30d08114068ccfe65e89c3c46deee3e6a2289 (diff)
parent1b90433f79de857550d4d8c35c89fbe954920594 (diff)
downloadffmpeg-4cf4831ae7e2b6ccbea9c2d65605a3722aeac9c2.tar.gz
Merge commit '1b90433f79de857550d4d8c35c89fbe954920594'
* commit '1b90433f79de857550d4d8c35c89fbe954920594': libfdk-aacdec: Always decode into an intermediate buffer Conflicts: libavcodec/libfdk-aacdec.c Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
Diffstat (limited to 'libavcodec/libfdk-aacdec.c')
-rw-r--r--libavcodec/libfdk-aacdec.c63
1 files changed, 17 insertions, 46 deletions
diff --git a/libavcodec/libfdk-aacdec.c b/libavcodec/libfdk-aacdec.c
index 43273ffdeb..c25bd5e737 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;
int 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,31 +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)
- 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;
@@ -364,26 +345,16 @@ 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 ((ret = get_stream_info(avctx)) < 0)
+ goto end;
+ frame->nb_samples = avctx->frame_size;
- if (tmpptr) {
- frame->nb_samples = avctx->frame_size;
- if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
- 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 = ff_get_buffer(avctx, frame, 0)) < 0)
+ goto end;
- if (!s->anc_buffer)
- av_freep(&s->decoder_buffer);
- }
+ 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;