Update contrib.
2 * LIBOIL - Library of Optimized Inner Loops
3 * Copyright (c) 2003,2004 David A. Schleef <ds@schleef.org>
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
27 //Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
33 #include <liboil/liboil.h>
34 #include <liboil/liboilfunction.h>
35 #include <liboil/liboiltest.h>
38 #define AYUV(a,y,u,v) (((a)<<24) | ((y)<<16) | ((u)<<8) | (v))
39 #define AYUV_A(color) (((color)>>24)&0xff)
40 #define AYUV_Y(color) (((color)>>16)&0xff)
41 #define AYUV_U(color) (((color)>>8)&0xff)
42 #define AYUV_V(color) (((color)>>0)&0xff)
51 * Converts pixels in YUYV format to AYUV. Note that only approximately
52 * half of the source array is used. Alpha values are set to 255.
54 OIL_DEFINE_CLASS (yuyv2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
61 * Converts pixels in YVYU format to AYUV. Note that only approximately
62 * half of the source array is used. Alpha values are set to 255.
64 OIL_DEFINE_CLASS (yvyu2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
71 * Converts pixels in UYVY format to AYUV. Note that only approximately
72 * half of the source array is used. Alpha values are set to 255.
74 OIL_DEFINE_CLASS (uyvy2ayuv, "uint32_t *d_n, uint32_t *s_n, int n");
82 * Converts pixels in AYUV format to YUYV. Note that only approximately
83 * half of the destination array is written. Alpha values are ignored.
85 OIL_DEFINE_CLASS (ayuv2yuyv, "uint32_t *d_n, uint32_t *s_n, int n");
92 * Converts pixels in AYUV format to YVYU. Note that only approximately
93 * half of the destination array is written. Alpha values are ignored.
95 OIL_DEFINE_CLASS (ayuv2yvyu, "uint32_t *d_n, uint32_t *s_n, int n");
102 * Converts pixels in AYUV format to UYVY. Note that only approximately
103 * half of the destination array is written. Alpha values are ignored.
105 OIL_DEFINE_CLASS (ayuv2uyvy, "uint32_t *d_n, uint32_t *s_n, int n");
114 * Packs pixels in separate Y, U, and V arrays to YUYV.
116 OIL_DEFINE_CLASS (packyuyv,
117 "uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n");
126 * Unpacks YUYV pixels into separate Y, U, and V arrays;
128 OIL_DEFINE_CLASS (unpackyuyv,
129 "uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s int n");
133 yuyv2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
135 uint8_t *src = (uint8_t *)s;
139 dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
140 dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 1], src[i*4 + 3]);
143 dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 1], src[i*4 + 3]);
146 OIL_DEFINE_IMPL_REF (yuyv2ayuv_ref, yuyv2ayuv);
149 yvyu2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
151 uint8_t *src = (uint8_t *)s;
155 dest[i*2 + 0] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
156 dest[i*2 + 1] = AYUV(0xff, src[i*4 + 2], src[i*4 + 3], src[i*4 + 1]);
159 dest[n-1] = AYUV(0xff, src[i*4 + 0], src[i*4 + 3], src[i*4 + 1]);
162 OIL_DEFINE_IMPL_REF (yvyu2ayuv_ref, yvyu2ayuv);
165 uyvy2ayuv_ref (uint32_t *dest, uint32_t *s, int n)
167 uint8_t *src = (uint8_t *)s;
171 dest[i*2 + 0] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
172 dest[i*2 + 1] = AYUV(0xff, src[i*4 + 3], src[i*4 + 0], src[i*4 + 2]);
175 dest[n-1] = AYUV(0xff, src[i*4 + 1], src[i*4 + 0], src[i*4 + 2]);
178 OIL_DEFINE_IMPL_REF (uyvy2ayuv_ref, uyvy2ayuv);
183 ayuv2yuyv_ref (uint32_t *d, uint32_t *src, int n)
185 uint8_t *dest = (uint8_t *)d;
189 dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
190 dest[i*4 + 1] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
191 dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
192 dest[i*4 + 3] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
195 dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
196 dest[(n/2)*4 + 1] = AYUV_U(src[n-1]);
197 dest[(n/2)*4 + 2] = 0;
198 dest[(n/2)*4 + 3] = AYUV_V(src[n-1]);
201 OIL_DEFINE_IMPL_REF (ayuv2yuyv_ref, ayuv2yuyv);
204 ayuv2yvyu_ref (uint32_t *d, uint32_t *src, int n)
206 uint8_t *dest = (uint8_t *)d;
210 dest[i*4 + 0] = AYUV_Y(src[i*2 + 0]);
211 dest[i*4 + 1] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
212 dest[i*4 + 2] = AYUV_Y(src[i*2 + 1]);
213 dest[i*4 + 3] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
216 dest[(n/2)*4 + 0] = AYUV_Y(src[n-1]);
217 dest[(n/2)*4 + 1] = AYUV_V(src[n-1]);
218 dest[(n/2)*4 + 2] = 0;
219 dest[(n/2)*4 + 3] = AYUV_U(src[n-1]);
222 OIL_DEFINE_IMPL_REF (ayuv2yvyu_ref, ayuv2yvyu);
225 ayuv2uyvy_ref (uint32_t *d, uint32_t *src, int n)
227 uint8_t *dest = (uint8_t *)d;
231 dest[i*4 + 0] = (AYUV_U(src[i*2 + 0]) + AYUV_U(src[i*2] + 1))/2;
232 dest[i*4 + 1] = AYUV_Y(src[i*2 + 0]);
233 dest[i*4 + 2] = (AYUV_V(src[i*2 + 0]) + AYUV_V(src[i*2] + 1))/2;
234 dest[i*4 + 3] = AYUV_Y(src[i*2 + 1]);
237 dest[(n/2)*4 + 0] = AYUV_U(src[n-1]);
238 dest[(n/2)*4 + 1] = AYUV_Y(src[n-1]);
239 dest[(n/2)*4 + 2] = AYUV_V(src[n-1]);
240 dest[(n/2)*4 + 3] = 0;
243 OIL_DEFINE_IMPL_REF (ayuv2uyvy_ref, ayuv2uyvy);
246 packyuyv_ref (uint32_t *d, uint8_t *s1_nx2, uint8_t *s2, uint8_t *s3, int n)
249 uint8_t *dest = (uint8_t *)d;
252 dest[i*4 + 0] = s1_nx2[i*2+0];
253 dest[i*4 + 2] = s1_nx2[i*2+1];
254 dest[i*4 + 1] = s2[i];
255 dest[i*4 + 3] = s3[i];
258 OIL_DEFINE_IMPL_REF (packyuyv_ref, packyuyv);
261 unpackyuyv_ref (uint8_t *d1_nx2, uint8_t *d2, uint8_t *d3, uint32_t *s, int n)
264 uint8_t *src = (uint8_t *)s;
267 d1_nx2[i*2+0] = src[i*4 + 0];
268 d1_nx2[i*2+1] = src[i*4 + 2];
269 d2[i] = src[i*4 + 1];
270 d3[i] = src[i*4 + 3];
273 OIL_DEFINE_IMPL_REF (unpackyuyv_ref, unpackyuyv);
279 OilFunctionClass* __oil_function_class_yuyv2ayuv() {
280 return &_oil_function_class_yuyv2ayuv;
286 OilFunctionClass* __oil_function_class_yvyu2ayuv() {
287 return &_oil_function_class_yvyu2ayuv;
293 OilFunctionClass* __oil_function_class_uyvy2ayuv() {
294 return &_oil_function_class_uyvy2ayuv;
300 OilFunctionClass* __oil_function_class_ayuv2yuyv() {
301 return &_oil_function_class_ayuv2yuyv;
307 OilFunctionClass* __oil_function_class_ayuv2yvyu() {
308 return &_oil_function_class_ayuv2yvyu;
314 OilFunctionClass* __oil_function_class_ayuv2uyvy() {
315 return &_oil_function_class_ayuv2uyvy;
321 OilFunctionClass* __oil_function_class_packyuyv() {
322 return &_oil_function_class_packyuyv;
328 OilFunctionClass* __oil_function_class_unpackyuyv() {
329 return &_oil_function_class_unpackyuyv;
337 OilFunctionImpl* __oil_function_impl_yuyv2ayuv_ref() {
338 return &_oil_function_impl_yuyv2ayuv_ref;
344 OilFunctionImpl* __oil_function_impl_yvyu2ayuv_ref() {
345 return &_oil_function_impl_yvyu2ayuv_ref;
351 OilFunctionImpl* __oil_function_impl_uyvy2ayuv_ref() {
352 return &_oil_function_impl_uyvy2ayuv_ref;
358 OilFunctionImpl* __oil_function_impl_ayuv2yuyv_ref() {
359 return &_oil_function_impl_ayuv2yuyv_ref;
365 OilFunctionImpl* __oil_function_impl_ayuv2yvyu_ref() {
366 return &_oil_function_impl_ayuv2yvyu_ref;
372 OilFunctionImpl* __oil_function_impl_ayuv2uyvy_ref() {
373 return &_oil_function_impl_ayuv2uyvy_ref;
379 OilFunctionImpl* __oil_function_impl_packyuyv_ref() {
380 return &_oil_function_impl_packyuyv_ref;
386 OilFunctionImpl* __oil_function_impl_unpackyuyv_ref() {
387 return &_oil_function_impl_unpackyuyv_ref;
395 EXPORT_C void** _oil_function_class_ptr_yuyv2ayuv () {
396 oil_function_class_ptr_yuyv2ayuv = __oil_function_class_yuyv2ayuv();
397 return &oil_function_class_ptr_yuyv2ayuv->func;
403 EXPORT_C void** _oil_function_class_ptr_yvyu2ayuv () {
404 oil_function_class_ptr_yvyu2ayuv = __oil_function_class_yvyu2ayuv();
405 return &oil_function_class_ptr_yvyu2ayuv->func;
411 EXPORT_C void** _oil_function_class_ptr_uyvy2ayuv () {
412 oil_function_class_ptr_uyvy2ayuv = __oil_function_class_uyvy2ayuv();
413 return &oil_function_class_ptr_uyvy2ayuv->func;
419 EXPORT_C void** _oil_function_class_ptr_ayuv2yuyv () {
420 oil_function_class_ptr_ayuv2yuyv = __oil_function_class_ayuv2yuyv();
421 return &oil_function_class_ptr_ayuv2yuyv->func;
427 EXPORT_C void** _oil_function_class_ptr_ayuv2yvyu () {
428 oil_function_class_ptr_ayuv2yvyu = __oil_function_class_ayuv2yvyu();
429 return &oil_function_class_ptr_ayuv2yvyu->func;
435 EXPORT_C void** _oil_function_class_ptr_ayuv2uyvy () {
436 oil_function_class_ptr_ayuv2uyvy = __oil_function_class_ayuv2uyvy();
437 return &oil_function_class_ptr_ayuv2uyvy->func;
443 EXPORT_C void** _oil_function_class_ptr_packyuyv () {
444 oil_function_class_ptr_packyuyv = __oil_function_class_packyuyv();
445 return &oil_function_class_ptr_packyuyv->func;
451 EXPORT_C void** _oil_function_class_ptr_unpackyuyv () {
452 oil_function_class_ptr_unpackyuyv = __oil_function_class_unpackyuyv();
453 return &oil_function_class_ptr_unpackyuyv->func;