X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Faudiotoolboxdec.c;h=607d3ba4d4803fb082c4d758ba91e0a0772edec8;hb=5c9373385d1a1d940b84f71fb583dc5519b17b8a;hp=04a9be9fcb2ceb0c2ddfd73f130027b21b871343;hpb=3f17751eeb7e3348576e2597884d5e5155aadcfb;p=ffmpeg diff --git a/libavcodec/audiotoolboxdec.c b/libavcodec/audiotoolboxdec.c index 04a9be9fcb2..607d3ba4d48 100644 --- a/libavcodec/audiotoolboxdec.c +++ b/libavcodec/audiotoolboxdec.c @@ -43,7 +43,6 @@ typedef struct ATDecodeContext { AudioStreamPacketDescription pkt_desc; AVPacket in_pkt; AVPacket new_in_pkt; - AVBSFContext *bsf; char *decoded_data; int channel_map[64]; @@ -399,8 +398,13 @@ static av_cold int ffat_create_decoder(AVCodecContext *avctx, AVPacket *pkt) static av_cold int ffat_init_decoder(AVCodecContext *avctx) { ATDecodeContext *at = avctx->priv_data; - at->extradata = avctx->extradata; - at->extradata_size = avctx->extradata_size; + if (avctx->extradata_size) { + at->extradata = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!at->extradata) + return AVERROR(ENOMEM); + at->extradata_size = avctx->extradata_size; + memcpy(at->extradata, avctx->extradata, avctx->extradata_size); + } if ((avctx->channels && avctx->sample_rate) || ffat_usable_extradata(avctx)) return ffat_create_decoder(avctx, NULL); @@ -473,46 +477,28 @@ static int ffat_decode(AVCodecContext *avctx, void *data, ATDecodeContext *at = avctx->priv_data; AVFrame *frame = data; int pkt_size = avpkt->size; - AVPacket filtered_packet = {0}; OSStatus ret; AudioBufferList out_buffers; - if (avctx->codec_id == AV_CODEC_ID_AAC && avpkt->size > 2 && - (AV_RB16(avpkt->data) & 0xfff0) == 0xfff0) { - AVPacket filter_pkt = {0}; - if (!at->bsf) { - const AVBitStreamFilter *bsf = av_bsf_get_by_name("aac_adtstoasc"); - if(!bsf) - return AVERROR_BSF_NOT_FOUND; - if ((ret = av_bsf_alloc(bsf, &at->bsf))) - return ret; - if (((ret = avcodec_parameters_from_context(at->bsf->par_in, avctx)) < 0) || - ((ret = av_bsf_init(at->bsf)) < 0)) { - av_bsf_free(&at->bsf); - return ret; + if (avctx->codec_id == AV_CODEC_ID_AAC) { + if (!at->extradata_size) { + uint8_t *side_data; + int side_data_size = 0; + + side_data = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA, + &side_data_size); + if (side_data_size) { + at->extradata = av_mallocz(side_data_size + AV_INPUT_BUFFER_PADDING_SIZE); + if (!at->extradata) + return AVERROR(ENOMEM); + at->extradata_size = side_data_size; + memcpy(at->extradata, side_data, side_data_size); } } - - if ((ret = av_packet_ref(&filter_pkt, avpkt)) < 0) - return ret; - - if ((ret = av_bsf_send_packet(at->bsf, &filter_pkt)) < 0) { - av_packet_unref(&filter_pkt); - return ret; - } - - if ((ret = av_bsf_receive_packet(at->bsf, &filtered_packet)) < 0) - return ret; - - at->extradata = at->bsf->par_out->extradata; - at->extradata_size = at->bsf->par_out->extradata_size; - - avpkt = &filtered_packet; } if (!at->converter) { if ((ret = ffat_create_decoder(avctx, avpkt)) < 0) { - av_packet_unref(&filtered_packet); return ret; } } @@ -531,9 +517,7 @@ static int ffat_decode(AVCodecContext *avctx, void *data, av_packet_unref(&at->new_in_pkt); if (avpkt->size) { - if (filtered_packet.data) { - at->new_in_pkt = filtered_packet; - } else if ((ret = av_packet_ref(&at->new_in_pkt, avpkt)) < 0) { + if ((ret = av_packet_ref(&at->new_in_pkt, avpkt)) < 0) { return ret; } } else { @@ -582,11 +566,12 @@ static av_cold void ffat_decode_flush(AVCodecContext *avctx) static av_cold int ffat_close_decoder(AVCodecContext *avctx) { ATDecodeContext *at = avctx->priv_data; - AudioConverterDispose(at->converter); - av_bsf_free(&at->bsf); + if (at->converter) + AudioConverterDispose(at->converter); av_packet_unref(&at->new_in_pkt); av_packet_unref(&at->in_pkt); - av_free(at->decoded_data); + av_freep(&at->decoded_data); + av_freep(&at->extradata); return 0; } @@ -596,7 +581,7 @@ static av_cold int ffat_close_decoder(AVCodecContext *avctx) .version = LIBAVUTIL_VERSION_INT, \ }; -#define FFAT_DEC(NAME, ID) \ +#define FFAT_DEC(NAME, ID, bsf_name) \ FFAT_DEC_CLASS(NAME) \ AVCodec ff_##NAME##_at_decoder = { \ .name = #NAME "_at", \ @@ -609,22 +594,23 @@ static av_cold int ffat_close_decoder(AVCodecContext *avctx) .decode = ffat_decode, \ .flush = ffat_decode_flush, \ .priv_class = &ffat_##NAME##_dec_class, \ + .bsfs = bsf_name, \ .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, \ - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, \ + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, \ }; -FFAT_DEC(aac, AV_CODEC_ID_AAC) -FFAT_DEC(ac3, AV_CODEC_ID_AC3) -FFAT_DEC(adpcm_ima_qt, AV_CODEC_ID_ADPCM_IMA_QT) -FFAT_DEC(alac, AV_CODEC_ID_ALAC) -FFAT_DEC(amr_nb, AV_CODEC_ID_AMR_NB) -FFAT_DEC(eac3, AV_CODEC_ID_EAC3) -FFAT_DEC(gsm_ms, AV_CODEC_ID_GSM_MS) -FFAT_DEC(ilbc, AV_CODEC_ID_ILBC) -FFAT_DEC(mp1, AV_CODEC_ID_MP1) -FFAT_DEC(mp2, AV_CODEC_ID_MP2) -FFAT_DEC(mp3, AV_CODEC_ID_MP3) -FFAT_DEC(pcm_alaw, AV_CODEC_ID_PCM_ALAW) -FFAT_DEC(pcm_mulaw, AV_CODEC_ID_PCM_MULAW) -FFAT_DEC(qdmc, AV_CODEC_ID_QDMC) -FFAT_DEC(qdm2, AV_CODEC_ID_QDM2) +FFAT_DEC(aac, AV_CODEC_ID_AAC, "aac_adtstoasc") +FFAT_DEC(ac3, AV_CODEC_ID_AC3, NULL) +FFAT_DEC(adpcm_ima_qt, AV_CODEC_ID_ADPCM_IMA_QT, NULL) +FFAT_DEC(alac, AV_CODEC_ID_ALAC, NULL) +FFAT_DEC(amr_nb, AV_CODEC_ID_AMR_NB, NULL) +FFAT_DEC(eac3, AV_CODEC_ID_EAC3, NULL) +FFAT_DEC(gsm_ms, AV_CODEC_ID_GSM_MS, NULL) +FFAT_DEC(ilbc, AV_CODEC_ID_ILBC, NULL) +FFAT_DEC(mp1, AV_CODEC_ID_MP1, NULL) +FFAT_DEC(mp2, AV_CODEC_ID_MP2, NULL) +FFAT_DEC(mp3, AV_CODEC_ID_MP3, NULL) +FFAT_DEC(pcm_alaw, AV_CODEC_ID_PCM_ALAW, NULL) +FFAT_DEC(pcm_mulaw, AV_CODEC_ID_PCM_MULAW, NULL) +FFAT_DEC(qdmc, AV_CODEC_ID_QDMC, NULL) +FFAT_DEC(qdm2, AV_CODEC_ID_QDM2, NULL)