avcodec/snow: ensure the buffers have allocated edges
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 26 Jun 2014 18:44:21 +0000 (20:44 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 26 Jun 2014 18:52:06 +0000 (20:52 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/snow.c
libavcodec/snowenc.c

index bd20388..616d117 100644 (file)
@@ -661,9 +661,18 @@ int ff_snow_frame_start(SnowContext *s){
             return -1;
         }
     }
-
+    s->current_picture->width  = s->avctx->width  + 2 * EDGE_WIDTH;
+    s->current_picture->height = s->avctx->height + 2 * EDGE_WIDTH;
     if ((ret = ff_get_buffer(s->avctx, s->current_picture, AV_GET_BUFFER_FLAG_REF)) < 0)
         return ret;
+    for (i = 0; s->current_picture->data[i]; i++) {
+        int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) *
+                        s->current_picture->linesize[i] +
+                        (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0));
+        s->current_picture->data[i] += offset;
+    }
+    s->current_picture->width  = s->avctx->width;
+    s->current_picture->height = s->avctx->height;
 
     s->current_picture->key_frame= s->keyframe;
 
index 167b205..d14b88e 100644 (file)
@@ -37,6 +37,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
 {
     SnowContext *s = avctx->priv_data;
     int plane_index, ret;
+    int i;
 
     if(avctx->prediction_method == DWT_97
        && (avctx->flags & CODEC_FLAG_QSCALE)
@@ -124,11 +125,20 @@ static av_cold int encode_init(AVCodecContext *avctx)
     s->input_picture = av_frame_alloc();
     if (!s->input_picture)
         return AVERROR(ENOMEM);
+    s->input_picture->width  = s->avctx->width  + 2 * EDGE_WIDTH;
+    s->input_picture->height = s->avctx->height + 2 * EDGE_WIDTH;
     if ((ret = ff_get_buffer(s->avctx, s->input_picture, AV_GET_BUFFER_FLAG_REF)) < 0)
         return ret;
+    for (i = 0; s->input_picture->data[i]; i++) {
+        int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) *
+                        s->input_picture->linesize[i] +
+                        (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0));
+        s->input_picture->data[i] += offset;
+    }
+    s->input_picture->width  = s->avctx->width;
+    s->input_picture->height = s->avctx->height;
 
     if(s->avctx->me_method == ME_ITER){
-        int i;
         int size= s->b_width * s->b_height << 2*s->block_max_depth;
         for(i=0; i<s->max_ref_frames; i++){
             s->ref_mvs[i]= av_mallocz_array(size, sizeof(int16_t[2]));