genericopenlibs/liboil/src/ref/yuv.c
changeset 18 47c74d1534e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/liboil/src/ref/yuv.c	Fri Apr 16 16:46:38 2010 +0300
@@ -0,0 +1,456 @@
+/*
+ * LIBOIL - Library of Optimized Inner Loops
+ * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+//Portions Copyright (c)  2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <liboil/liboil.h>
+#include <liboil/liboilfunction.h>
+#include <liboil/liboiltest.h>
+
+
+#define AYUV(a,y,u,v) (((a)<<24) | ((y)<<16) | ((u)<<8) | (v))
+#define AYUV_A(color) (((color)>>24)&0xff)
+#define AYUV_Y(color) (((color)>>16)&0xff)
+#define AYUV_U(color) (((color)>>8)&0xff)
+#define AYUV_V(color) (((color)>>0)&0xff)
+
+
+/**
+ * oil_yuyv2ayuv:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in YUYV format to AYUV.  Note that only approximately
+ * half of the source array is used.  Alpha values are set to 255.
+ */
+OIL_DEFINE_CLASS (yuyv2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_yvyu2ayuv:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in YVYU format to AYUV.  Note that only approximately
+ * half of the source array is used.  Alpha values are set to 255.
+ */
+OIL_DEFINE_CLASS (yvyu2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_uyvy2ayuv:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in UYVY format to AYUV.  Note that only approximately
+ * half of the source array is used.  Alpha values are set to 255.
+ */
+OIL_DEFINE_CLASS (uyvy2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
+
+/**
+ * oil_ayuv2yuyv:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in AYUV format to YUYV.  Note that only approximately
+ * half of the destination array is written.  Alpha values are ignored.
+ */
+OIL_DEFINE_CLASS (ayuv2yuyv, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_ayuv2yvyu:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in AYUV format to YVYU.  Note that only approximately
+ * half of the destination array is written.  Alpha values are ignored.
+ */
+OIL_DEFINE_CLASS (ayuv2yvyu, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_ayuv2uyvy:
+ * @d_n:
+ * @s_n:
+ * n:
+ *
+ * Converts pixels in AYUV format to UYVY.  Note that only approximately
+ * half of the destination array is written.  Alpha values are ignored.
+ */
+OIL_DEFINE_CLASS (ayuv2uyvy, "uint32_t *d_n, uint32_t *s_n, int n");
+/**
+ * oil_packyuyv:
+ * @d:
+ * @s1_nx2:
+ * @s2:
+ * @s3:
+ * n:
+ *
+ * Packs pixels in separate Y, U, and V arrays to YUYV.
+ */
+OIL_DEFINE_CLASS (packyuyv,
+    "uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n");
+/**
+ * oil_unpackyuyv:
+ * @d1_nx2:
+ * @d2:
+ * @d3:
+ * @s:
+ * n:
+ *
+ * Unpacks YUYV pixels into separate Y, U, and V arrays;
+ */
+OIL_DEFINE_CLASS (unpackyuyv,
+    "uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s int n");
+
+
+static void
+yuyv2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
+{
+  uint8_t *src = (uint8_t *)s;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
+    dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 1], src[i*4 + 3]);
+  }
+  if (n&1) {
+    dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
+  }
+}
+OIL_DEFINE_IMPL_REF (yuyv2ayuv_ref, yuyv2ayuv);
+
+static void
+yvyu2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
+{
+  uint8_t *src = (uint8_t *)s;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
+    dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 3], src[i*4 + 1]);
+  }
+  if (n&1) {
+    dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
+  }
+}
+OIL_DEFINE_IMPL_REF (yvyu2ayuv_ref, yvyu2ayuv);
+
+static void
+uyvy2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
+{
+  uint8_t *src = (uint8_t *)s;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*2 + 0] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
+    dest[i*2 + 1] = AYUV(0xff, src[i*4 + 3], src[i*4 + 0], src[i*4 + 2]);
+  }
+  if (n&1) {
+    dest[n-1] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
+  }
+}
+OIL_DEFINE_IMPL_REF (uyvy2ayuv_ref, uyvy2ayuv);
+
+
+
+static void
+ayuv2yuyv_ref (uint32_t *d, uint32_t *src, int n)
+{
+  uint8_t *dest = (uint8_t *)d;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
+    dest[i*4 + 1] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
+    dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
+    dest[i*4 + 3] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
+  }
+  if (n&1) {
+    dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
+    dest[(n/2)*4 + 1] = AYUV_U(src[n-1]);
+    dest[(n/2)*4 + 2] = 0;
+    dest[(n/2)*4 + 3] = AYUV_V(src[n-1]);
+  }
+}
+OIL_DEFINE_IMPL_REF (ayuv2yuyv_ref, ayuv2yuyv);
+
+static void
+ayuv2yvyu_ref (uint32_t *d, uint32_t *src, int n)
+{
+  uint8_t *dest = (uint8_t *)d;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
+    dest[i*4 + 1] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
+    dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
+    dest[i*4 + 3] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
+  }
+  if (n&1) {
+    dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
+    dest[(n/2)*4 + 1] = AYUV_V(src[n-1]);
+    dest[(n/2)*4 + 2] = 0;
+    dest[(n/2)*4 + 3] = AYUV_U(src[n-1]);
+  }
+}
+OIL_DEFINE_IMPL_REF (ayuv2yvyu_ref, ayuv2yvyu);
+
+static void
+ayuv2uyvy_ref (uint32_t *d, uint32_t *src, int n)
+{
+  uint8_t *dest = (uint8_t *)d;
+  int i;
+
+  for(i=0;i<n/2;i++){
+    dest[i*4 + 0] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
+    dest[i*4 + 1] = AYUV_Y(src[i*2 + 0]);
+    dest[i*4 + 2] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
+    dest[i*4 + 3] = AYUV_Y(src[i*2 + 1]);
+  }
+  if (n&1) {
+    dest[(n/2)*4 + 0] = AYUV_U(src[n-1]);
+    dest[(n/2)*4 + 1] = AYUV_Y(src[n-1]);
+    dest[(n/2)*4 + 2] = AYUV_V(src[n-1]);
+    dest[(n/2)*4 + 3] = 0;
+  }
+}
+OIL_DEFINE_IMPL_REF (ayuv2uyvy_ref, ayuv2uyvy);
+
+static void
+packyuyv_ref (uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n)
+{
+  int i;
+  uint8_t *dest = (uint8_t *)d;
+
+  for(i=0;i<n;i++){
+    dest[i*4 + 0] = s1_nx2[i*2+0];
+    dest[i*4 + 2] = s1_nx2[i*2+1];
+    dest[i*4 + 1] = s2[i];
+    dest[i*4 + 3] = s3[i];
+  }
+}
+OIL_DEFINE_IMPL_REF (packyuyv_ref, packyuyv);
+
+static void
+unpackyuyv_ref (uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s, int n)
+{
+  int i;
+  uint8_t *src = (uint8_t *)s;
+
+  for(i=0;i<n;i++){
+    d1_nx2[i*2+0] = src[i*4 + 0];
+    d1_nx2[i*2+1] = src[i*4 + 2];
+    d2[i] = src[i*4 + 1];
+    d3[i] = src[i*4 + 3];
+  }
+}
+OIL_DEFINE_IMPL_REF (unpackyuyv_ref, unpackyuyv);
+
+
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_yuyv2ayuv() {
+		return &_oil_function_class_yuyv2ayuv;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_yvyu2ayuv() {
+		return &_oil_function_class_yvyu2ayuv;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_uyvy2ayuv() {
+		return &_oil_function_class_uyvy2ayuv;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_ayuv2yuyv() {
+		return &_oil_function_class_ayuv2yuyv;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_ayuv2yvyu() {
+		return &_oil_function_class_ayuv2yvyu;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_ayuv2uyvy() {
+		return &_oil_function_class_ayuv2uyvy;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_packyuyv() {
+		return &_oil_function_class_packyuyv;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionClass* __oil_function_class_unpackyuyv() {
+		return &_oil_function_class_unpackyuyv;
+}
+#endif
+
+
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_yuyv2ayuv_ref() {
+		return &_oil_function_impl_yuyv2ayuv_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_yvyu2ayuv_ref() {
+		return &_oil_function_impl_yvyu2ayuv_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_uyvy2ayuv_ref() {
+		return &_oil_function_impl_uyvy2ayuv_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_ayuv2yuyv_ref() {
+		return &_oil_function_impl_ayuv2yuyv_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_ayuv2yvyu_ref() {
+		return &_oil_function_impl_ayuv2yvyu_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_ayuv2uyvy_ref() {
+		return &_oil_function_impl_ayuv2uyvy_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_packyuyv_ref() {
+		return &_oil_function_impl_packyuyv_ref;
+}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+OilFunctionImpl* __oil_function_impl_unpackyuyv_ref() {
+		return &_oil_function_impl_unpackyuyv_ref;
+}
+#endif
+
+
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_yuyv2ayuv ()	{
+	oil_function_class_ptr_yuyv2ayuv = __oil_function_class_yuyv2ayuv();
+	return &oil_function_class_ptr_yuyv2ayuv->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_yvyu2ayuv ()	{
+	oil_function_class_ptr_yvyu2ayuv = __oil_function_class_yvyu2ayuv();
+	return &oil_function_class_ptr_yvyu2ayuv->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_uyvy2ayuv ()	{
+	oil_function_class_ptr_uyvy2ayuv = __oil_function_class_uyvy2ayuv();
+	return &oil_function_class_ptr_uyvy2ayuv->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_ayuv2yuyv ()	{
+	oil_function_class_ptr_ayuv2yuyv = __oil_function_class_ayuv2yuyv();
+	return &oil_function_class_ptr_ayuv2yuyv->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_ayuv2yvyu ()	{
+	oil_function_class_ptr_ayuv2yvyu = __oil_function_class_ayuv2yvyu();
+	return &oil_function_class_ptr_ayuv2yvyu->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_ayuv2uyvy ()	{
+	oil_function_class_ptr_ayuv2uyvy = __oil_function_class_ayuv2uyvy();
+	return &oil_function_class_ptr_ayuv2uyvy->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_packyuyv ()	{
+	oil_function_class_ptr_packyuyv = __oil_function_class_packyuyv();
+	return &oil_function_class_ptr_packyuyv->func;
+	}
+#endif
+
+#ifdef	__SYMBIAN32__
+ 
+EXPORT_C void** _oil_function_class_ptr_unpackyuyv ()	{
+	oil_function_class_ptr_unpackyuyv = __oil_function_class_unpackyuyv();
+	return &oil_function_class_ptr_unpackyuyv->func;
+	}
+#endif
+