1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericopenlibs/liboil/src/ref/yuv.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,456 @@
1.4 +/*
1.5 + * LIBOIL - Library of Optimized Inner Loops
1.6 + * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org>
1.7 + * All rights reserved.
1.8 + *
1.9 + * Redistribution and use in source and binary forms, with or without
1.10 + * modification, are permitted provided that the following conditions
1.11 + * are met:
1.12 + * 1. Redistributions of source code must retain the above copyright
1.13 + * notice, this list of conditions and the following disclaimer.
1.14 + * 2. Redistributions in binary form must reproduce the above copyright
1.15 + * notice, this list of conditions and the following disclaimer in the
1.16 + * documentation and/or other materials provided with the distribution.
1.17 + *
1.18 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1.19 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1.20 + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1.21 + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
1.22 + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
1.23 + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
1.24 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1.25 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
1.26 + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
1.27 + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1.28 + * POSSIBILITY OF SUCH DAMAGE.
1.29 + */
1.30 +//Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
1.31 +
1.32 +#ifdef HAVE_CONFIG_H
1.33 +#include "config.h"
1.34 +#endif
1.35 +
1.36 +#include <liboil/liboil.h>
1.37 +#include <liboil/liboilfunction.h>
1.38 +#include <liboil/liboiltest.h>
1.39 +
1.40 +
1.41 +#define AYUV(a,y,u,v) (((a)<<24) | ((y)<<16) | ((u)<<8) | (v))
1.42 +#define AYUV_A(color) (((color)>>24)&0xff)
1.43 +#define AYUV_Y(color) (((color)>>16)&0xff)
1.44 +#define AYUV_U(color) (((color)>>8)&0xff)
1.45 +#define AYUV_V(color) (((color)>>0)&0xff)
1.46 +
1.47 +
1.48 +/**
1.49 + * oil_yuyv2ayuv:
1.50 + * @d_n:
1.51 + * @s_n:
1.52 + * n:
1.53 + *
1.54 + * Converts pixels in YUYV format to AYUV. Note that only approximately
1.55 + * half of the source array is used. Alpha values are set to 255.
1.56 + */
1.57 +OIL_DEFINE_CLASS (yuyv2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
1.58 +/**
1.59 + * oil_yvyu2ayuv:
1.60 + * @d_n:
1.61 + * @s_n:
1.62 + * n:
1.63 + *
1.64 + * Converts pixels in YVYU format to AYUV. Note that only approximately
1.65 + * half of the source array is used. Alpha values are set to 255.
1.66 + */
1.67 +OIL_DEFINE_CLASS (yvyu2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
1.68 +/**
1.69 + * oil_uyvy2ayuv:
1.70 + * @d_n:
1.71 + * @s_n:
1.72 + * n:
1.73 + *
1.74 + * Converts pixels in UYVY format to AYUV. Note that only approximately
1.75 + * half of the source array is used. Alpha values are set to 255.
1.76 + */
1.77 +OIL_DEFINE_CLASS (uyvy2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
1.78 +
1.79 +/**
1.80 + * oil_ayuv2yuyv:
1.81 + * @d_n:
1.82 + * @s_n:
1.83 + * n:
1.84 + *
1.85 + * Converts pixels in AYUV format to YUYV. Note that only approximately
1.86 + * half of the destination array is written. Alpha values are ignored.
1.87 + */
1.88 +OIL_DEFINE_CLASS (ayuv2yuyv, "uint32_t *d_n, uint32_t *s_n, int n");
1.89 +/**
1.90 + * oil_ayuv2yvyu:
1.91 + * @d_n:
1.92 + * @s_n:
1.93 + * n:
1.94 + *
1.95 + * Converts pixels in AYUV format to YVYU. Note that only approximately
1.96 + * half of the destination array is written. Alpha values are ignored.
1.97 + */
1.98 +OIL_DEFINE_CLASS (ayuv2yvyu, "uint32_t *d_n, uint32_t *s_n, int n");
1.99 +/**
1.100 + * oil_ayuv2uyvy:
1.101 + * @d_n:
1.102 + * @s_n:
1.103 + * n:
1.104 + *
1.105 + * Converts pixels in AYUV format to UYVY. Note that only approximately
1.106 + * half of the destination array is written. Alpha values are ignored.
1.107 + */
1.108 +OIL_DEFINE_CLASS (ayuv2uyvy, "uint32_t *d_n, uint32_t *s_n, int n");
1.109 +/**
1.110 + * oil_packyuyv:
1.111 + * @d:
1.112 + * @s1_nx2:
1.113 + * @s2:
1.114 + * @s3:
1.115 + * n:
1.116 + *
1.117 + * Packs pixels in separate Y, U, and V arrays to YUYV.
1.118 + */
1.119 +OIL_DEFINE_CLASS (packyuyv,
1.120 + "uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n");
1.121 +/**
1.122 + * oil_unpackyuyv:
1.123 + * @d1_nx2:
1.124 + * @d2:
1.125 + * @d3:
1.126 + * @s:
1.127 + * n:
1.128 + *
1.129 + * Unpacks YUYV pixels into separate Y, U, and V arrays;
1.130 + */
1.131 +OIL_DEFINE_CLASS (unpackyuyv,
1.132 + "uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s int n");
1.133 +
1.134 +
1.135 +static void
1.136 +yuyv2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
1.137 +{
1.138 + uint8_t *src = (uint8_t *)s;
1.139 + int i;
1.140 +
1.141 + for(i=0;i<n/2;i++){
1.142 + dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
1.143 + dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 1], src[i*4 + 3]);
1.144 + }
1.145 + if (n&1) {
1.146 + dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
1.147 + }
1.148 +}
1.149 +OIL_DEFINE_IMPL_REF (yuyv2ayuv_ref, yuyv2ayuv);
1.150 +
1.151 +static void
1.152 +yvyu2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
1.153 +{
1.154 + uint8_t *src = (uint8_t *)s;
1.155 + int i;
1.156 +
1.157 + for(i=0;i<n/2;i++){
1.158 + dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
1.159 + dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 3], src[i*4 + 1]);
1.160 + }
1.161 + if (n&1) {
1.162 + dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
1.163 + }
1.164 +}
1.165 +OIL_DEFINE_IMPL_REF (yvyu2ayuv_ref, yvyu2ayuv);
1.166 +
1.167 +static void
1.168 +uyvy2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
1.169 +{
1.170 + uint8_t *src = (uint8_t *)s;
1.171 + int i;
1.172 +
1.173 + for(i=0;i<n/2;i++){
1.174 + dest[i*2 + 0] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
1.175 + dest[i*2 + 1] = AYUV(0xff, src[i*4 + 3], src[i*4 + 0], src[i*4 + 2]);
1.176 + }
1.177 + if (n&1) {
1.178 + dest[n-1] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
1.179 + }
1.180 +}
1.181 +OIL_DEFINE_IMPL_REF (uyvy2ayuv_ref, uyvy2ayuv);
1.182 +
1.183 +
1.184 +
1.185 +static void
1.186 +ayuv2yuyv_ref (uint32_t *d, uint32_t *src, int n)
1.187 +{
1.188 + uint8_t *dest = (uint8_t *)d;
1.189 + int i;
1.190 +
1.191 + for(i=0;i<n/2;i++){
1.192 + dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
1.193 + dest[i*4 + 1] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
1.194 + dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
1.195 + dest[i*4 + 3] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
1.196 + }
1.197 + if (n&1) {
1.198 + dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
1.199 + dest[(n/2)*4 + 1] = AYUV_U(src[n-1]);
1.200 + dest[(n/2)*4 + 2] = 0;
1.201 + dest[(n/2)*4 + 3] = AYUV_V(src[n-1]);
1.202 + }
1.203 +}
1.204 +OIL_DEFINE_IMPL_REF (ayuv2yuyv_ref, ayuv2yuyv);
1.205 +
1.206 +static void
1.207 +ayuv2yvyu_ref (uint32_t *d, uint32_t *src, int n)
1.208 +{
1.209 + uint8_t *dest = (uint8_t *)d;
1.210 + int i;
1.211 +
1.212 + for(i=0;i<n/2;i++){
1.213 + dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
1.214 + dest[i*4 + 1] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
1.215 + dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
1.216 + dest[i*4 + 3] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
1.217 + }
1.218 + if (n&1) {
1.219 + dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
1.220 + dest[(n/2)*4 + 1] = AYUV_V(src[n-1]);
1.221 + dest[(n/2)*4 + 2] = 0;
1.222 + dest[(n/2)*4 + 3] = AYUV_U(src[n-1]);
1.223 + }
1.224 +}
1.225 +OIL_DEFINE_IMPL_REF (ayuv2yvyu_ref, ayuv2yvyu);
1.226 +
1.227 +static void
1.228 +ayuv2uyvy_ref (uint32_t *d, uint32_t *src, int n)
1.229 +{
1.230 + uint8_t *dest = (uint8_t *)d;
1.231 + int i;
1.232 +
1.233 + for(i=0;i<n/2;i++){
1.234 + dest[i*4 + 0] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
1.235 + dest[i*4 + 1] = AYUV_Y(src[i*2 + 0]);
1.236 + dest[i*4 + 2] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
1.237 + dest[i*4 + 3] = AYUV_Y(src[i*2 + 1]);
1.238 + }
1.239 + if (n&1) {
1.240 + dest[(n/2)*4 + 0] = AYUV_U(src[n-1]);
1.241 + dest[(n/2)*4 + 1] = AYUV_Y(src[n-1]);
1.242 + dest[(n/2)*4 + 2] = AYUV_V(src[n-1]);
1.243 + dest[(n/2)*4 + 3] = 0;
1.244 + }
1.245 +}
1.246 +OIL_DEFINE_IMPL_REF (ayuv2uyvy_ref, ayuv2uyvy);
1.247 +
1.248 +static void
1.249 +packyuyv_ref (uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n)
1.250 +{
1.251 + int i;
1.252 + uint8_t *dest = (uint8_t *)d;
1.253 +
1.254 + for(i=0;i<n;i++){
1.255 + dest[i*4 + 0] = s1_nx2[i*2+0];
1.256 + dest[i*4 + 2] = s1_nx2[i*2+1];
1.257 + dest[i*4 + 1] = s2[i];
1.258 + dest[i*4 + 3] = s3[i];
1.259 + }
1.260 +}
1.261 +OIL_DEFINE_IMPL_REF (packyuyv_ref, packyuyv);
1.262 +
1.263 +static void
1.264 +unpackyuyv_ref (uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s, int n)
1.265 +{
1.266 + int i;
1.267 + uint8_t *src = (uint8_t *)s;
1.268 +
1.269 + for(i=0;i<n;i++){
1.270 + d1_nx2[i*2+0] = src[i*4 + 0];
1.271 + d1_nx2[i*2+1] = src[i*4 + 2];
1.272 + d2[i] = src[i*4 + 1];
1.273 + d3[i] = src[i*4 + 3];
1.274 + }
1.275 +}
1.276 +OIL_DEFINE_IMPL_REF (unpackyuyv_ref, unpackyuyv);
1.277 +
1.278 +
1.279 +
1.280 +#ifdef __SYMBIAN32__
1.281 +
1.282 +OilFunctionClass* __oil_function_class_yuyv2ayuv() {
1.283 + return &_oil_function_class_yuyv2ayuv;
1.284 +}
1.285 +#endif
1.286 +
1.287 +#ifdef __SYMBIAN32__
1.288 +
1.289 +OilFunctionClass* __oil_function_class_yvyu2ayuv() {
1.290 + return &_oil_function_class_yvyu2ayuv;
1.291 +}
1.292 +#endif
1.293 +
1.294 +#ifdef __SYMBIAN32__
1.295 +
1.296 +OilFunctionClass* __oil_function_class_uyvy2ayuv() {
1.297 + return &_oil_function_class_uyvy2ayuv;
1.298 +}
1.299 +#endif
1.300 +
1.301 +#ifdef __SYMBIAN32__
1.302 +
1.303 +OilFunctionClass* __oil_function_class_ayuv2yuyv() {
1.304 + return &_oil_function_class_ayuv2yuyv;
1.305 +}
1.306 +#endif
1.307 +
1.308 +#ifdef __SYMBIAN32__
1.309 +
1.310 +OilFunctionClass* __oil_function_class_ayuv2yvyu() {
1.311 + return &_oil_function_class_ayuv2yvyu;
1.312 +}
1.313 +#endif
1.314 +
1.315 +#ifdef __SYMBIAN32__
1.316 +
1.317 +OilFunctionClass* __oil_function_class_ayuv2uyvy() {
1.318 + return &_oil_function_class_ayuv2uyvy;
1.319 +}
1.320 +#endif
1.321 +
1.322 +#ifdef __SYMBIAN32__
1.323 +
1.324 +OilFunctionClass* __oil_function_class_packyuyv() {
1.325 + return &_oil_function_class_packyuyv;
1.326 +}
1.327 +#endif
1.328 +
1.329 +#ifdef __SYMBIAN32__
1.330 +
1.331 +OilFunctionClass* __oil_function_class_unpackyuyv() {
1.332 + return &_oil_function_class_unpackyuyv;
1.333 +}
1.334 +#endif
1.335 +
1.336 +
1.337 +
1.338 +#ifdef __SYMBIAN32__
1.339 +
1.340 +OilFunctionImpl* __oil_function_impl_yuyv2ayuv_ref() {
1.341 + return &_oil_function_impl_yuyv2ayuv_ref;
1.342 +}
1.343 +#endif
1.344 +
1.345 +#ifdef __SYMBIAN32__
1.346 +
1.347 +OilFunctionImpl* __oil_function_impl_yvyu2ayuv_ref() {
1.348 + return &_oil_function_impl_yvyu2ayuv_ref;
1.349 +}
1.350 +#endif
1.351 +
1.352 +#ifdef __SYMBIAN32__
1.353 +
1.354 +OilFunctionImpl* __oil_function_impl_uyvy2ayuv_ref() {
1.355 + return &_oil_function_impl_uyvy2ayuv_ref;
1.356 +}
1.357 +#endif
1.358 +
1.359 +#ifdef __SYMBIAN32__
1.360 +
1.361 +OilFunctionImpl* __oil_function_impl_ayuv2yuyv_ref() {
1.362 + return &_oil_function_impl_ayuv2yuyv_ref;
1.363 +}
1.364 +#endif
1.365 +
1.366 +#ifdef __SYMBIAN32__
1.367 +
1.368 +OilFunctionImpl* __oil_function_impl_ayuv2yvyu_ref() {
1.369 + return &_oil_function_impl_ayuv2yvyu_ref;
1.370 +}
1.371 +#endif
1.372 +
1.373 +#ifdef __SYMBIAN32__
1.374 +
1.375 +OilFunctionImpl* __oil_function_impl_ayuv2uyvy_ref() {
1.376 + return &_oil_function_impl_ayuv2uyvy_ref;
1.377 +}
1.378 +#endif
1.379 +
1.380 +#ifdef __SYMBIAN32__
1.381 +
1.382 +OilFunctionImpl* __oil_function_impl_packyuyv_ref() {
1.383 + return &_oil_function_impl_packyuyv_ref;
1.384 +}
1.385 +#endif
1.386 +
1.387 +#ifdef __SYMBIAN32__
1.388 +
1.389 +OilFunctionImpl* __oil_function_impl_unpackyuyv_ref() {
1.390 + return &_oil_function_impl_unpackyuyv_ref;
1.391 +}
1.392 +#endif
1.393 +
1.394 +
1.395 +
1.396 +#ifdef __SYMBIAN32__
1.397 +
1.398 +EXPORT_C void** _oil_function_class_ptr_yuyv2ayuv () {
1.399 + oil_function_class_ptr_yuyv2ayuv = __oil_function_class_yuyv2ayuv();
1.400 + return &oil_function_class_ptr_yuyv2ayuv->func;
1.401 + }
1.402 +#endif
1.403 +
1.404 +#ifdef __SYMBIAN32__
1.405 +
1.406 +EXPORT_C void** _oil_function_class_ptr_yvyu2ayuv () {
1.407 + oil_function_class_ptr_yvyu2ayuv = __oil_function_class_yvyu2ayuv();
1.408 + return &oil_function_class_ptr_yvyu2ayuv->func;
1.409 + }
1.410 +#endif
1.411 +
1.412 +#ifdef __SYMBIAN32__
1.413 +
1.414 +EXPORT_C void** _oil_function_class_ptr_uyvy2ayuv () {
1.415 + oil_function_class_ptr_uyvy2ayuv = __oil_function_class_uyvy2ayuv();
1.416 + return &oil_function_class_ptr_uyvy2ayuv->func;
1.417 + }
1.418 +#endif
1.419 +
1.420 +#ifdef __SYMBIAN32__
1.421 +
1.422 +EXPORT_C void** _oil_function_class_ptr_ayuv2yuyv () {
1.423 + oil_function_class_ptr_ayuv2yuyv = __oil_function_class_ayuv2yuyv();
1.424 + return &oil_function_class_ptr_ayuv2yuyv->func;
1.425 + }
1.426 +#endif
1.427 +
1.428 +#ifdef __SYMBIAN32__
1.429 +
1.430 +EXPORT_C void** _oil_function_class_ptr_ayuv2yvyu () {
1.431 + oil_function_class_ptr_ayuv2yvyu = __oil_function_class_ayuv2yvyu();
1.432 + return &oil_function_class_ptr_ayuv2yvyu->func;
1.433 + }
1.434 +#endif
1.435 +
1.436 +#ifdef __SYMBIAN32__
1.437 +
1.438 +EXPORT_C void** _oil_function_class_ptr_ayuv2uyvy () {
1.439 + oil_function_class_ptr_ayuv2uyvy = __oil_function_class_ayuv2uyvy();
1.440 + return &oil_function_class_ptr_ayuv2uyvy->func;
1.441 + }
1.442 +#endif
1.443 +
1.444 +#ifdef __SYMBIAN32__
1.445 +
1.446 +EXPORT_C void** _oil_function_class_ptr_packyuyv () {
1.447 + oil_function_class_ptr_packyuyv = __oil_function_class_packyuyv();
1.448 + return &oil_function_class_ptr_packyuyv->func;
1.449 + }
1.450 +#endif
1.451 +
1.452 +#ifdef __SYMBIAN32__
1.453 +
1.454 +EXPORT_C void** _oil_function_class_ptr_unpackyuyv () {
1.455 + oil_function_class_ptr_unpackyuyv = __oil_function_class_unpackyuyv();
1.456 + return &oil_function_class_ptr_unpackyuyv->func;
1.457 + }
1.458 +#endif
1.459 +