aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/ttaenc.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-04-26 19:17:19 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2016-04-26 19:45:59 +0200
commit005c61c6b8982f977e415aa69d2d2b42e6b7f3f2 (patch)
tree3dcf2596f101e1de5830c1ae27ba419b311b5d3e /libavcodec/ttaenc.c
parente1c20485c1d47ae54d94f4e7f86a96ec85467dd1 (diff)
downloadffmpeg-005c61c6b8982f977e415aa69d2d2b42e6b7f3f2.tar.gz
avcodec/ttaenc: Reallocate packet if its too small
Fixes assertion failure Fixes Ticket5394 Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/ttaenc.c')
-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);