aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-05-05 15:17:51 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-05-05 15:43:58 +0200
commit2264c1108135380c49fdf0aef97520bf77a6ed37 (patch)
tree8bd9fa44647bd07fc7aa4213fb874571f51a0ece /libavcodec
parentb0e7a932e6ea9bb83e7e15c4cd4c1bda110d16e2 (diff)
downloadffmpeg-2264c1108135380c49fdf0aef97520bf77a6ed37.tar.gz
SVQ3: do not modify const input buffer
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/svq3.c22
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;
}