diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2011-05-05 15:17:51 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-05-05 15:43:58 +0200 |
commit | 2264c1108135380c49fdf0aef97520bf77a6ed37 (patch) | |
tree | 8bd9fa44647bd07fc7aa4213fb874571f51a0ece /libavcodec/svq3.c | |
parent | b0e7a932e6ea9bb83e7e15c4cd4c1bda110d16e2 (diff) | |
download | ffmpeg-2264c1108135380c49fdf0aef97520bf77a6ed37.tar.gz |
SVQ3: do not modify const input buffer
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/svq3.c')
-rw-r--r-- | libavcodec/svq3.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/libavcodec/svq3.c b/libavcodec/svq3.c index 9dff9e9114..16f483432f 100644 --- a/libavcodec/svq3.c +++ b/libavcodec/svq3.c @@ -70,6 +70,8 @@ typedef struct { int unknown_flag; int next_slice_index; uint32_t watermark_key; + uint8_t *buf; + int buf_size; } SVQ3Context; #define FULLPEL_MODE 1 @@ -927,12 +929,12 @@ static int svq3_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { - const uint8_t *buf = avpkt->data; SVQ3Context *svq3 = avctx->priv_data; H264Context *h = &svq3->h; MpegEncContext *s = &h->s; int buf_size = avpkt->size; int m, mb_type, left; + uint8_t *buf; /* special case for last picture */ if (buf_size == 0) { @@ -944,10 +946,21 @@ static int svq3_decode_frame(AVCodecContext *avctx, return 0; } - init_get_bits (&s->gb, buf, 8*buf_size); - s->mb_x = s->mb_y = h->mb_xy = 0; + if (svq3->watermark_key) { + svq3->buf = av_fast_realloc(svq3->buf, &svq3->buf_size, + buf_size+FF_INPUT_BUFFER_PADDING_SIZE); + if (!svq3->buf) + return AVERROR(ENOMEM); + memcpy(svq3->buf, avpkt->data, buf_size); + buf = svq3->buf; + } else { + buf = avpkt->data; + } + + init_get_bits(&s->gb, buf, 8*buf_size); + if (svq3_decode_slice_header(avctx)) return -1; @@ -1092,6 +1105,9 @@ static int svq3_decode_end(AVCodecContext *avctx) MPV_common_end(s); + av_freep(&svq3->buf); + svq3->buf_size = 0; + return 0; } |