diff --git a/libavcodec/snow.c b/libavcodec/snow.c
index 616d1170afe96807ae7e1869f7e9af5e1101f441..e1ed29793d5972d4aec45c297ae4eec40151619e 100644
--- a/libavcodec/snow.c
+++ b/libavcodec/snow.c
@@ -66,6 +66,26 @@ void ff_snow_inner_add_yblock(const uint8_t *obmc, const int obmc_stride, uint8_
     }
 }
 
+int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
+{
+    int ret, i;
+
+    frame->width  = s->avctx->width  + 2 * EDGE_WIDTH;
+    frame->height = s->avctx->height + 2 * EDGE_WIDTH;
+    if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
+        return ret;
+    for (i = 0; frame->data[i]; i++) {
+        int offset = (EDGE_WIDTH >> (i ? s->chroma_v_shift : 0)) *
+                        frame->linesize[i] +
+                        (EDGE_WIDTH >> (i ? s->chroma_h_shift : 0));
+        frame->data[i] += offset;
+    }
+    frame->width  = s->avctx->width;
+    frame->height = s->avctx->height;
+
+    return 0;
+}
+
 void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts
     int plane_index, level, orientation;
 
@@ -661,18 +681,8 @@ 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)
+    if ((ret = ff_snow_get_buffer(s, s->current_picture)) < 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;
 
diff --git a/libavcodec/snow.h b/libavcodec/snow.h
index d0e5c5ba0b13961a47582feee2f830f5c0758c79..a9c8518d75a215442ba52b15ce62342045c00166 100644
--- a/libavcodec/snow.h
+++ b/libavcodec/snow.h
@@ -232,6 +232,7 @@ int ff_snow_frame_start(SnowContext *s);
 void ff_snow_pred_block(SnowContext *s, uint8_t *dst, uint8_t *tmp, ptrdiff_t stride,
                      int sx, int sy, int b_w, int b_h, BlockNode *block,
                      int plane_index, int w, int h);
+int ff_snow_get_buffer(SnowContext *s, AVFrame *frame);
 /* common inline functions */
 //XXX doublecheck all of them should stay inlined
 
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index d14b88e35ebecea219de340d38511dd3c44da509..a39cd84403813d8447a27ee3d447f09f74cfd89c 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -125,18 +125,9 @@ 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)
+
+    if ((ret = ff_snow_get_buffer(s, s->input_picture)) < 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 size= s->b_width * s->b_height << 2*s->block_max_depth;