|
|
@@ -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; |
|
|
|