ffmpeg | branch: master | Clément Bœsch <[email protected]> | Tue Apr 25 19:10:39 2017 +0200| [91f8ccdda0605d480111f7bd3b2e1bcf8d9a1fe0] | committer: Clément Bœsch
Merge commit '730c02326094bcfb1fa67f10a7e7b22f03f5a88f' * commit '730c02326094bcfb1fa67f10a7e7b22f03f5a88f': binkaudio: switch to the new send/receive API Merged-by: Clément Bœsch <[email protected]> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=91f8ccdda0605d480111f7bd3b2e1bcf8d9a1fe0 --- libavcodec/binkaudio.c | 60 +++++++++++++++++++++++++++----------------------- 1 file 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, }; ====================================================================== diff --cc libavcodec/binkaudio.c index f1fa2ab882,51fb6c83ce..e0f3d14eef --- a/libavcodec/binkaudio.c +++ b/libavcodec/binkaudio.c @@@ -33,8 -33,9 +33,9 @@@ #define BITSTREAM_READER_LE #include "avcodec.h" -#include "bitstream.h" #include "dct.h" + #include "decode.h" +#include "get_bits.h" #include "internal.h" #include "rdft.h" #include "wma_freqs.h" @@@ -278,43 -284,36 +284,35 @@@ static av_cold int decode_end(AVCodecCo return 0; } -static void get_bits_align32(BitstreamContext *s) +static void get_bits_align32(GetBitContext *s) { - int n = (-bitstream_tell(s)) & 31; - if (n) - bitstream_skip(s, n); + int n = (-get_bits_count(s)) & 31; + 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; - BitstreamContext *bc = &s->bc; + 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 = bitstream_init8(bc, s->pkt->data, s->pkt->size); ++ ret = init_get_bits8(gb, s->pkt->data, s->pkt->size); + if (ret < 0) + goto fail; /* skip reported size */ - bitstream_skip(bc, 32); + skip_bits_long(gb, 32); } /* get output buffer */ @@@ -327,12 -328,18 +325,18 @@@ av_log(avctx, AV_LOG_ERROR, "Incomplete packet\n"); return AVERROR_INVALIDDATA; } - get_bits_align32(bc); - if (!bitstream_bits_left(bc)) { - memset(bc, 0, sizeof(*bc)); + 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 = { _______________________________________________ ffmpeg-cvslog mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog
