diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2016-04-26 19:17:19 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-04-26 19:49:09 +0200 |
commit | 8d0cfa68b9a49f96e90f6c3704c18d1edbd91b33 (patch) | |
tree | 4f35eb8b12da974a2d3312b3cc60944aec7d0466 | |
parent | 83eaaae0057fc471a621a2c1bf1e95e4ab27484f (diff) | |
download | ffmpeg-8d0cfa68b9a49f96e90f6c3704c18d1edbd91b33.tar.gz |
avcodec/ttaenc: Reallocate packet if its too small
Fixes assertion failure
Fixes Ticket5394
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
(cherry picked from commit 005c61c6b8982f977e415aa69d2d2b42e6b7f3f2)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r-- | libavcodec/ttaenc.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libavcodec/ttaenc.c b/libavcodec/ttaenc.c index 0df1fcb6aa..2f1c8db556 100644 --- a/libavcodec/ttaenc.c +++ b/libavcodec/ttaenc.c @@ -114,9 +114,12 @@ static int tta_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, { TTAEncContext *s = avctx->priv_data; PutBitContext pb; - int ret, i, out_bytes, cur_chan = 0, res = 0, samples = 0; + int ret, i, out_bytes, cur_chan, res, samples; + int64_t pkt_size = frame->nb_samples * 2LL * avctx->channels * s->bps; - if ((ret = ff_alloc_packet2(avctx, avpkt, frame->nb_samples * 2 * avctx->channels * s->bps, 0)) < 0) +pkt_alloc: + cur_chan = 0, res = 0, samples = 0; + if ((ret = ff_alloc_packet2(avctx, avpkt, pkt_size, 0)) < 0) return ret; init_put_bits(&pb, avpkt->data, avpkt->size); @@ -174,6 +177,14 @@ static int tta_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, rice->k1++; unary = 1 + (outval >> k); + if (unary + 100LL > put_bits_left(&pb)) { + if (pkt_size < INT_MAX/2) { + pkt_size *= 2; + av_packet_unref(avpkt); + goto pkt_alloc; + } else + return AVERROR(ENOMEM); + } do { if (unary > 31) { put_bits(&pb, 31, 0x7FFFFFFF); |