[vlc-devel] [PATCH] vpx: encode: fix alignment to avoid copying line by line

Tristan Matthews tmatth at videolan.org
Wed Mar 21 01:38:20 CET 2018


This is based on a suggestion by François for the aom encoder.

---
 modules/codec/vpx.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/modules/codec/vpx.c b/modules/codec/vpx.c
index 76331a714b..fdd75ba256 100644
--- a/modules/codec/vpx.c
+++ b/modules/codec/vpx.c
@@ -441,23 +441,22 @@ static block_t *Encode(encoder_t *p_enc, picture_t *p_pict)
     unsigned i_h = p_enc->fmt_in.video.i_visible_height;
 
     /* Create and initialize the vpx_image */
-    if (!vpx_img_alloc(&img, VPX_IMG_FMT_I420, i_w, i_h, 1)) {
+    if (!vpx_img_alloc(&img, VPX_IMG_FMT_I420, i_w, i_h, 32)) {
         VPX_ERR(p_enc, ctx, "Failed to allocate image");
         return NULL;
     }
     for (int plane = 0; plane < p_pict->i_planes; plane++) {
         uint8_t *src = p_pict->p[plane].p_pixels;
         uint8_t *dst = img.planes[plane];
-        int src_stride = p_pict->p[plane].i_pitch;
         int dst_stride = img.stride[plane];
 
-        int size = __MIN(src_stride, dst_stride);
-        for (int line = 0; line < p_pict->p[plane].i_visible_lines; line++)
-        {
-            memcpy(dst, src, size);
-            src += src_stride;
-            dst += dst_stride;
+        if (unlikely(dst_stride != p_pict->p[plane].i_pitch)) {
+            VPX_ERR(p_enc, ctx, "Unexpected stride mismatch");
+            vpx_img_free(&img);
+            return NULL;
         }
+
+        memcpy(dst, src, dst_stride*p_pict->p[plane].i_visible_lines);
     }
 
     int flags = 0;
-- 
2.16.2



More information about the vlc-devel mailing list