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>
This commit is contained in:
Hendrik Leppkes 2015-08-18 09:05:54 +02:00
commit 4cf4831ae7
1 changed files with 17 additions and 46 deletions

View File

@ -41,8 +41,8 @@ enum ConcealMethod {
typedef struct FDKAACDecContext { typedef struct FDKAACDecContext {
const AVClass *class; const AVClass *class;
HANDLE_AACDECODER handle; HANDLE_AACDECODER handle;
int initialized;
uint8_t *decoder_buffer; uint8_t *decoder_buffer;
int decoder_buffer_size;
uint8_t *anc_buffer; uint8_t *anc_buffer;
int conceal_method; int conceal_method;
int drc_level; int drc_level;
@ -305,6 +305,13 @@ static av_cold int fdk_aac_decode_init(AVCodecContext *avctx)
avctx->sample_fmt = AV_SAMPLE_FMT_S16; 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; return 0;
fail: fail:
fdk_aac_decode_close(avctx); fdk_aac_decode_close(avctx);
@ -319,8 +326,6 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
int ret; int ret;
AAC_DECODER_ERROR err; AAC_DECODER_ERROR err;
UINT valid = avpkt->size; UINT valid = avpkt->size;
uint8_t *buf, *tmpptr = NULL;
int buf_size;
err = aacDecoder_Fill(s->handle, &avpkt->data, &avpkt->size, &valid); err = aacDecoder_Fill(s->handle, &avpkt->data, &avpkt->size, &valid);
if (err != AAC_DEC_OK) { if (err != AAC_DEC_OK) {
@ -328,31 +333,7 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (s->initialized) { err = aacDecoder_DecodeFrame(s->handle, (INT_PCM *) s->decoder_buffer, s->decoder_buffer_size, 0);
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);
if (err == AAC_DEC_NOT_ENOUGH_BITS) { if (err == AAC_DEC_NOT_ENOUGH_BITS) {
ret = avpkt->size - valid; ret = avpkt->size - valid;
goto end; goto end;
@ -364,26 +345,16 @@ static int fdk_aac_decode_frame(AVCodecContext *avctx, void *data,
goto end; goto end;
} }
if (!s->initialized) { if ((ret = get_stream_info(avctx)) < 0)
if ((ret = get_stream_info(avctx)) < 0) goto end;
goto end; frame->nb_samples = avctx->frame_size;
s->initialized = 1;
frame->nb_samples = avctx->frame_size;
}
if (tmpptr) { if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
frame->nb_samples = avctx->frame_size; goto end;
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 (!s->anc_buffer) memcpy(frame->extended_data[0], s->decoder_buffer,
av_freep(&s->decoder_buffer); avctx->channels * avctx->frame_size *
} av_get_bytes_per_sample(avctx->sample_fmt));
*got_frame_ptr = 1; *got_frame_ptr = 1;
ret = avpkt->size - valid; ret = avpkt->size - valid;