vl/util: add copy func for yv12image to nv12surface v2
authorBoyuan Zhang <boyuan.zhang@amd.com>
Thu, 21 Jul 2016 23:40:15 +0000 (19:40 -0400)
committerChristian König <christian.koenig@amd.com>
Mon, 25 Jul 2016 11:39:18 +0000 (13:39 +0200)
Add function to copy from yv12 image to nv12 surface for VAAPI putimage call.
We need this function in VaPutImage call where copying from yv12 image to nv12
surface for encoding. Existing function can't be used because it only work for
copying from yv12 surface to nv12 image in Vaapi.

v2: cleanup variable types and commit message

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
Signed-off-by: Christian König <christian.koenig@amd.com>
src/gallium/auxiliary/util/u_video.h

index 9196afc11be0a120e0e385b147074cc9a838ec6e..7e743de253ec695d5baddb44e4df2cb3f6f0cac6 100644 (file)
@@ -129,6 +129,43 @@ u_copy_yv12_to_nv12(void *const *destination_data,
    }
 }
 
+static inline void
+u_copy_yv12_img_to_nv12_surf(ubyte *const *src,
+                             ubyte *dst,
+                             unsigned width,
+                             unsigned height,
+                             unsigned src_stride,
+                             unsigned dst_stride,
+                             int field)
+{
+   if (field == 0) {
+      ubyte *src_0 = src[field];
+      for (int i = 0; i < height ; i++) {
+         memcpy(dst, src_0, width);
+         dst += dst_stride;
+         src_0 += src_stride;
+      }
+   } else if (field == 1) {
+      const ubyte *src_1 = src[field];
+      const ubyte *src_2 = src[field+1];
+      bool odd = false;
+      for (unsigned i = 0; i < height ; i++) {
+         for (unsigned j = 0; j < width*2 ; j++) {
+            if (odd == false) {
+               dst[j] = src_1[j/2];
+               odd = true;
+            } else {
+               dst[j] = src_2[j/2];
+               odd = false;
+            }
+         }
+         dst += dst_stride;
+         src_1 += src_stride;
+         src_2 += src_stride;
+      }
+   }
+}
+
 static inline void
 u_copy_swap422_packed(void *const *destination_data,
                        uint32_t const *destination_pitches,