avcodec/snow: only allocate space for edges when encoding
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Jul 2014 02:57:42 +0000 (04:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Jul 2014 02:57:42 +0000 (04:57 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/snow.c

index e3518eb..7cce7a5 100644 (file)
@@ -69,19 +69,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;
 int ff_snow_get_buffer(SnowContext *s, AVFrame *frame)
 {
     int ret, i;
+    int edges_needed = av_codec_is_encoder(s->avctx->codec);
 
 
-    frame->width  = s->avctx->width  + 2 * EDGE_WIDTH;
-    frame->height = s->avctx->height + 2 * EDGE_WIDTH;
+    frame->width  = s->avctx->width ;
+    frame->height = s->avctx->height;
+    if (edges_needed) {
+        frame->width  += 2 * EDGE_WIDTH;
+        frame->height += 2 * EDGE_WIDTH;
+    }
     if ((ret = ff_get_buffer(s->avctx, frame, AV_GET_BUFFER_FLAG_REF)) < 0)
         return ret;
     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;
+    if (edges_needed) {
+        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;
     }
     }
-    frame->width  = s->avctx->width;
-    frame->height = s->avctx->height;
 
     return 0;
 }
 
     return 0;
 }