diff options
author | Clément Bœsch <u@pkh.me> | 2017-04-25 19:10:39 +0200 |
---|---|---|
committer | Clément Bœsch <u@pkh.me> | 2017-04-25 19:12:05 +0200 |
commit | 91f8ccdda0605d480111f7bd3b2e1bcf8d9a1fe0 (patch) | |
tree | 766f5c1ed7f7ce4f5039cc6ede1316fb16367892 /libavcodec/binkaudio.c | |
parent | d417e95af76c5303bd48fa9210bdecace091d656 (diff) | |
parent | 730c02326094bcfb1fa67f10a7e7b22f03f5a88f (diff) | |
download | ffmpeg-91f8ccdda0605d480111f7bd3b2e1bcf8d9a1fe0.tar.gz |
Merge commit '730c02326094bcfb1fa67f10a7e7b22f03f5a88f'
* commit '730c02326094bcfb1fa67f10a7e7b22f03f5a88f':
binkaudio: switch to the new send/receive API
Merged-by: Clément Bœsch <u@pkh.me>
Diffstat (limited to 'libavcodec/binkaudio.c')
-rw-r--r-- | libavcodec/binkaudio.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/libavcodec/binkaudio.c b/libavcodec/binkaudio.c index f1fa2ab882..e0f3d14eef 100644 --- a/libavcodec/binkaudio.c +++ b/libavcodec/binkaudio.c @@ -34,6 +34,7 @@ #define BITSTREAM_READER_LE #include "avcodec.h" #include "dct.h" +#include "decode.h" #include "get_bits.h" #include "internal.h" #include "rdft.h" @@ -57,7 +58,7 @@ typedef struct BinkAudioContext { float root; DECLARE_ALIGNED(32, FFTSample, coeffs)[BINK_BLOCK_MAX_SIZE]; float previous[MAX_CHANNELS][BINK_BLOCK_MAX_SIZE / 16]; ///< coeffs from previous audio block - uint8_t *packet_buffer; + AVPacket *pkt; union { RDFTContext rdft; DCTContext dct; @@ -140,6 +141,10 @@ static av_cold int decode_init(AVCodecContext *avctx) else return -1; + s->pkt = av_packet_alloc(); + if (!s->pkt) + return AVERROR(ENOMEM); + return 0; } @@ -269,12 +274,13 @@ static av_cold int decode_end(AVCodecContext *avctx) { BinkAudioContext * s = avctx->priv_data; av_freep(&s->bands); - av_freep(&s->packet_buffer); if (CONFIG_BINKAUDIO_RDFT_DECODER && avctx->codec->id == AV_CODEC_ID_BINKAUDIO_RDFT) ff_rdft_end(&s->trans.rdft); else if (CONFIG_BINKAUDIO_DCT_DECODER) ff_dct_end(&s->trans.dct); + av_packet_free(&s->pkt); + return 0; } @@ -284,34 +290,26 @@ static void get_bits_align32(GetBitContext *s) if (n) skip_bits(s, n); } -static int decode_frame(AVCodecContext *avctx, void *data, - int *got_frame_ptr, AVPacket *avpkt) +static int binkaudio_receive_frame(AVCodecContext *avctx, AVFrame *frame) { BinkAudioContext *s = avctx->priv_data; - AVFrame *frame = data; GetBitContext *gb = &s->gb; - int ret, consumed = 0; + int ret; - if (!get_bits_left(gb)) { - uint8_t *buf; - /* handle end-of-stream */ - if (!avpkt->size) { - *got_frame_ptr = 0; - return 0; - } - if (avpkt->size < 4) { + if (!s->pkt->data) { + ret = ff_decode_get_packet(avctx, s->pkt); + if (ret < 0) + return ret; + + if (s->pkt->size < 4) { av_log(avctx, AV_LOG_ERROR, "Packet is too small\n"); - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto fail; } - buf = av_realloc(s->packet_buffer, avpkt->size + AV_INPUT_BUFFER_PADDING_SIZE); - if (!buf) - return AVERROR(ENOMEM); - memset(buf + avpkt->size, 0, AV_INPUT_BUFFER_PADDING_SIZE); - s->packet_buffer = buf; - memcpy(s->packet_buffer, avpkt->data, avpkt->size); - if ((ret = init_get_bits8(gb, s->packet_buffer, avpkt->size)) < 0) - return ret; - consumed = avpkt->size; + + ret = init_get_bits8(gb, s->pkt->data, s->pkt->size); + if (ret < 0) + goto fail; /* skip reported size */ skip_bits_long(gb, 32); @@ -328,11 +326,17 @@ static int decode_frame(AVCodecContext *avctx, void *data, return AVERROR_INVALIDDATA; } get_bits_align32(gb); + if (!get_bits_left(gb)) { + memset(gb, 0, sizeof(*gb)); + av_packet_unref(s->pkt); + } frame->nb_samples = s->block_size / avctx->channels; - *got_frame_ptr = 1; - return consumed; + return 0; +fail: + av_packet_unref(s->pkt); + return ret; } AVCodec ff_binkaudio_rdft_decoder = { @@ -343,7 +347,7 @@ AVCodec ff_binkaudio_rdft_decoder = { .priv_data_size = sizeof(BinkAudioContext), .init = decode_init, .close = decode_end, - .decode = decode_frame, + .receive_frame = binkaudio_receive_frame, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1, }; @@ -355,6 +359,6 @@ AVCodec ff_binkaudio_dct_decoder = { .priv_data_size = sizeof(BinkAudioContext), .init = decode_init, .close = decode_end, - .decode = decode_frame, + .receive_frame = binkaudio_receive_frame, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1, }; |