media: vim2m: speedup passthrough copy
authorMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 1 Mar 2019 13:10:59 +0000 (08:10 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 1 Mar 2019 16:31:07 +0000 (11:31 -0500)
When in passthrough mode, copy the entire line at once, in
order to make it faster (if not HFLIP).

Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vim2m.c

index 303d020..631e79b 100644 (file)
@@ -267,25 +267,22 @@ static const char *type_name(enum v4l2_buf_type type)
 #define CLIP(__color) \
        (u8)(((__color) > 0xff) ? 0xff : (((__color) < 0) ? 0 : (__color)))
 
-static void fast_copy_two_pixels(struct vim2m_q_data *q_data_in,
-                                struct vim2m_q_data *q_data_out,
-                                u8 **src, u8 **dst, bool reverse)
+static void copy_line(struct vim2m_q_data *q_data_out,
+                     u8 *src, u8 *dst, bool reverse)
 {
-       int depth = q_data_out->fmt->depth >> 3;
+       int x, depth = q_data_out->fmt->depth >> 3;
 
        if (!reverse) {
-               memcpy(*dst, *src, depth << 1);
-               *src += depth << 1;
-               *dst += depth << 1;
+               memcpy(dst, src, q_data_out->width * depth);
+       } else {
+               for (x = 0; x < q_data_out->width >> 1; x++) {
+                       memcpy(dst, src, depth);
+                       memcpy(dst + depth, src - depth, depth);
+                       src -= depth << 1;
+                       dst += depth << 1;
+               }
                return;
        }
-
-       /* copy RGB formats in reverse order */
-       memcpy(*dst, *src, depth);
-       memcpy(*dst + depth, *src - depth, depth);
-       *src -= depth << 1;
-       *dst += depth << 1;
-       return;
 }
 
 static void copy_two_pixels(struct vim2m_q_data *q_data_in,
@@ -487,7 +484,7 @@ static int device_process(struct vim2m_ctx *ctx,
        }
        y_out = 0;
 
-       /* Faster copy logic,  when format and resolution are identical */
+       /* When format and resolution are identical, we can use a faster copy logic */
        if (q_data_in->fmt->fourcc == q_data_out->fmt->fourcc &&
            q_data_in->width == q_data_out->width &&
            q_data_in->height == q_data_out->height) {
@@ -496,15 +493,15 @@ static int device_process(struct vim2m_ctx *ctx,
                        if (ctx->mode & MEM2MEM_HFLIP)
                                p += bytesperline - (q_data_in->fmt->depth >> 3);
 
-                       for (x = 0; x < width >> 1; x++)
-                               fast_copy_two_pixels(q_data_in, q_data_out,
-                                                    &p, &p_out,
-                                                    ctx->mode & MEM2MEM_HFLIP);
+                       copy_line(q_data_out, p, p_out,
+                                 ctx->mode & MEM2MEM_HFLIP);
+
+                       p_out += bytesperline;
                }
                return 0;
        }
 
-       /* Slower algorithm with format conversion and scaler */
+       /* Slower algorithm with format conversion, hflip, vflip and scaler */
 
        /* To speed scaler up, use Bresenham for X dimension */
        x_int = q_data_in->width / q_data_out->width;