From 5272c8c09f02206b0995f40da4b266753621064a Mon Sep 17 00:00:00 2001
From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
Date: Tue, 13 Jul 2010 00:23:55 +0200
Subject: [PATCH 401/403] [G45] Simplify vaGetImage().

---
 i965_drv_video/i965_drv_video.c |  102 +++++++++++++++++----------------------
 1 files changed, 45 insertions(+), 57 deletions(-)

diff --git a/i965_drv_video/i965_drv_video.c b/i965_drv_video/i965_drv_video.c
index 63cd917..4623734 100644
--- a/i965_drv_video/i965_drv_video.c
+++ b/i965_drv_video/i965_drv_video.c
@@ -1469,13 +1469,26 @@ i965_SetImagePalette(VADriverContextP ctx,
     return VA_STATUS_SUCCESS;
 }
 
+static inline void
+memcpy_pic(uint8_t *dst, unsigned int dst_stride,
+           const uint8_t *src, unsigned int src_stride,
+           unsigned int len, unsigned int height)
+{
+    unsigned int i;
+
+    for (i = 0; i < height; i++) {
+        memcpy(dst, src, len);
+        dst += dst_stride;
+        src += src_stride;
+    }
+}
+
 static void
 get_image_yv12(struct object_image *obj_image, uint8_t *image_data,
                struct object_surface *obj_surface,
                const VARectangle *rect)
 {
     uint8_t *dst[3], *src[3];
-    int i, x, y, w, h;
 
     if (!obj_surface->bo)
         return;
@@ -1485,11 +1498,6 @@ get_image_yv12(struct object_image *obj_image, uint8_t *image_data,
     if (!obj_surface->bo->virtual)
         return;
 
-    x = rect->x;
-    y = rect->y;
-    w = rect->width;
-    h = rect->height;
-
     dst[0] = image_data + obj_image->image.offsets[0];
     src[0] = (uint8_t *)obj_surface->bo->virtual;
     dst[1] = image_data + obj_image->image.offsets[1];
@@ -1497,34 +1505,23 @@ get_image_yv12(struct object_image *obj_image, uint8_t *image_data,
     dst[2] = image_data + obj_image->image.offsets[2];
     src[2] = src[1] + (obj_surface->width / 2) * (obj_surface->height / 2);
 
-    dst[0] += y * obj_image->image.pitches[0] + x;
-    src[0] += y * obj_surface->width + x;
-    for (i = 0; i < h; i++) {
-        memcpy(dst[0], src[0], w);
-        dst[0] += obj_image->image.pitches[0];
-        src[0] += obj_surface->width;
-    }
+    dst[0] += rect->y * obj_image->image.pitches[0] + rect->x;
+    src[0] += rect->y * obj_surface->width + rect->x;
+    memcpy_pic(dst[0], obj_image->image.pitches[0],
+               src[0], obj_surface->width,
+               rect->width, rect->height);
 
-    x /= 2;
-    y /= 2;
-    w /= 2;
-    h /= 2;
-
-    dst[1] += y * obj_image->image.pitches[1] + x;
-    src[1] += y * obj_surface->width / 2 + x;
-    for (i = 0; i < h; i++) {
-        memcpy(dst[1], src[1], w);
-        dst[1] += obj_image->image.pitches[1];
-        src[1] += obj_surface->width / 2;
-    }
+    dst[1] += rect->y * obj_image->image.pitches[1] + rect->x / 2;
+    src[1] += rect->y * obj_surface->width / 2 + rect->x / 2;
+    memcpy_pic(dst[1], obj_image->image.pitches[1],
+               src[1], obj_surface->width / 2,
+               rect->width / 2, rect->height / 2);
 
-    dst[2] += y * obj_image->image.pitches[2] + y;
-    src[2] += y * obj_surface->width / 2 + x;
-    for (i = 0; i < h; i++) {
-        memcpy(dst[2], src[2], w);
-        dst[2] += obj_image->image.pitches[2];
-        src[2] += obj_surface->width / 2;
-    }
+    dst[2] += rect->y * obj_image->image.pitches[2] + rect->x / 2;
+    src[2] += rect->y * obj_surface->width / 2 + rect->x / 2;
+    memcpy_pic(dst[2], obj_image->image.pitches[2],
+               src[2], obj_surface->width / 2,
+               rect->width / 2, rect->height / 2);
 
     dri_bo_unmap(obj_surface->bo);
 }
@@ -1534,8 +1531,7 @@ get_image_nv12(struct object_image *obj_image, uint8_t *image_data,
                struct object_surface *obj_surface,
                const VARectangle *rect)
 {
-    uint8_t *dst, *src;
-    int i, x, y, w, h;
+    uint8_t *dst[2], *src[2];
 
     if (!obj_surface->bo)
         return;
@@ -1545,30 +1541,22 @@ get_image_nv12(struct object_image *obj_image, uint8_t *image_data,
     if (!obj_surface->bo->virtual)
         return;
 
-    x = rect->x;
-    y = rect->y;
-    w = rect->width;
-    h = rect->height;
-
-    dst = image_data + obj_image->image.offsets[0] + y * obj_image->image.pitches[0] + x;
-    src = (uint8_t *)obj_surface->bo->virtual + y * obj_surface->width + x;
-    for (i = 0; i < h; i++) {
-        memcpy(dst, src, w);
-        dst += obj_image->image.pitches[0];
-        src += obj_surface->width;
-    }
-
-    x /= 2;
-    y /= 2;
-    h /= 2;
+    dst[0] = image_data + obj_image->image.offsets[0];
+    src[0] = (uint8_t *)obj_surface->bo->virtual;
+    dst[1] = image_data + obj_image->image.offsets[1];
+    src[1] = src[0] + obj_surface->width * obj_surface->height;
 
-    dst = image_data + obj_image->image.offsets[1] + y * obj_image->image.pitches[1] + x * 2;
-    src = (uint8_t *)obj_surface->bo->virtual + obj_surface->width * obj_surface->height + y * obj_surface->width + x * 2;
-    for (i = 0; i < h; i++) {
-        memcpy(dst, src, w);
-        dst += obj_image->image.pitches[1];
-        src += obj_surface->width;
-    }
+    dst[0] += rect->y * obj_image->image.pitches[0] + rect->x;
+    src[0] += rect->y * obj_surface->width + rect->x;
+    memcpy_pic(dst[0], obj_image->image.pitches[0],
+               src[0], obj_surface->width,
+               rect->width, rect->height);
+
+    dst[1] += rect->y * obj_image->image.pitches[1] + (rect->x & -2);
+    src[1] += rect->y * obj_surface->width + (rect->x & -2);
+    memcpy_pic(dst[1], obj_image->image.pitches[1],
+               src[1], obj_surface->width,
+               rect->width, rect->height / 2);
 
     dri_bo_unmap(obj_surface->bo);
 }
-- 
1.7.0.4

