aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-04-26 19:17:19 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2016-04-27 04:40:12 +0200
commit58a750049282cb92823b075036f04d0a2b962493 (patch)
treed8fdd1afaac5d77c2e670945a42e5f2db936808d
parent3003277103a26765b1e1c1c5bd4865f703a703b4 (diff)
downloadffmpeg-58a750049282cb92823b075036f04d0a2b962493.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.c15
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);