mirror of https://git.videolan.org/git/ffmpeg.git
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:
commit
4cf4831ae7
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue