[FFmpeg-cvslog] avcodec/ttaenc: Reallocate packet if its too small
Michael Niedermayer
git at videolan.org
Wed Apr 27 05:43:00 CEST 2016
ffmpeg | branch: release/2.8 | Michael Niedermayer <michael at niedermayer.cc> | Tue Apr 26 19:17:19 2016 +0200| [58a750049282cb92823b075036f04d0a2b962493] | committer: Michael Niedermayer
avcodec/ttaenc: Reallocate packet if its too small
Fixes assertion failure
Fixes Ticket5394
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
(cherry picked from commit 005c61c6b8982f977e415aa69d2d2b42e6b7f3f2)
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=58a750049282cb92823b075036f04d0a2b962493
---
libavcodec/ttaenc.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/libavcodec/ttaenc.c b/libavcodec/ttaenc.c
index 0df1fcb..2f1c8db 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);
More information about the ffmpeg-cvslog
mailing list