SVQ3: do not modify const input buffer
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>
Thu, 5 May 2011 13:17:51 +0000 (15:17 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 5 May 2011 13:43:58 +0000 (15:43 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/svq3.c

index 9dff9e9..16f4834 100644 (file)
@@ -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;
 }