sl@0: /* sl@0: * LIBOIL - Library of Optimized Inner Loops sl@0: * Copyright (c) 2003,2004 David A. Schleef sl@0: * All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in the sl@0: * documentation and/or other materials provided with the distribution. sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR sl@0: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED sl@0: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE sl@0: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, sl@0: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES sl@0: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR sl@0: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, sl@0: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING sl@0: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE sl@0: * POSSIBILITY OF SUCH DAMAGE. sl@0: */ sl@0: //Portions Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. sl@0: sl@0: #ifdef HAVE_CONFIG_H sl@0: #include "config.h" sl@0: #endif sl@0: sl@0: #include sl@0: #include "jpeg.h" sl@0: sl@0: /** sl@0: * oil_zigzag8x8_s16: sl@0: * @d_8x8: sl@0: * @ds: sl@0: * @s_8x8: sl@0: * @ss: sl@0: * sl@0: * Reorders an 8x8 block using a zig-zag pattern. The zig-zag pattern sl@0: * is described in the JPEG specification. sl@0: * sl@0: * FIXME: describe zigzag pattern sl@0: */ sl@0: OIL_DEFINE_CLASS (zigzag8x8_s16, sl@0: "int16_t *d_8x8, int ds, int16_t *s_8x8, int ss"); sl@0: /** sl@0: * oil_unzigzag8x8_s16: sl@0: * @d_8x8: sl@0: * @ds: sl@0: * @s_8x8: sl@0: * @ss: sl@0: * sl@0: * Reorders an 8x8 block to reverse the zig-zag reordering of sl@0: * @oil_zigzag8x8_s16. sl@0: */ sl@0: OIL_DEFINE_CLASS (unzigzag8x8_s16, sl@0: "int16_t *d_8x8, int ds, int16_t *s_8x8, int ss"); sl@0: sl@0: sl@0: sl@0: #define BLOCK8x8_S16(ptr, stride, row, column) \ sl@0: (*((int16_t *)((void *)ptr + stride*row) + column)) sl@0: sl@0: static const unsigned char zigzag_order[64] = { sl@0: 0, sl@0: 8, 1, sl@0: 2, 9, 16, sl@0: 24, 17, 10, 3, sl@0: 4, 11, 18, 25, 32, sl@0: 40, 33, 26, 19, 12, 5, sl@0: 6, 13, 20, 27, 34, 41, 48, sl@0: 56, 49, 42, 35, 28, 21, 14, 7, sl@0: 15, 22, 29, 36, 43, 50, 57, sl@0: 58, 51, 44, 37, 30, 23, sl@0: 31, 38, 45, 52, 59, sl@0: 60, 53, 46, 39, sl@0: 47, 54, 61, sl@0: 62, 55, sl@0: 63 sl@0: }; sl@0: sl@0: static const unsigned char unzigzag_order[64] = { sl@0: 0, 1, 5, 6, 14, 15, 27, 28, sl@0: 2, 4, 7, 13, 16, 26, 29, 42, sl@0: 3, 8, 12, 17, 25, 30, 41, 43, sl@0: 9, 11, 18, 24, 31, 40, 44, 53, sl@0: 10, 19, 23, 32, 39, 45, 52, 54, sl@0: 20, 22, 33, 38, 46, 51, 55, 60, sl@0: 21, 34, 37, 47, 50, 56, 59, 61, sl@0: 35, 36, 48, 49, 57, 58, 62, 63, sl@0: }; sl@0: sl@0: sl@0: static void sl@0: zigzag8x8_s16_ref(int16_t *dest, int dstr, int16_t *src, int sstr) sl@0: { sl@0: int i,j; sl@0: unsigned int z; sl@0: sl@0: for(j=0;j<8;j++){ sl@0: for(i=0;i<8;i++){ sl@0: z = zigzag_order[j*8+i]; sl@0: OIL_GET(dest,j*dstr +i*sizeof(int16_t), int16_t) = sl@0: OIL_GET(src, sstr*(z>>3)+(z&7)*sizeof(int16_t), sl@0: int16_t); sl@0: } sl@0: } sl@0: } sl@0: OIL_DEFINE_IMPL_REF (zigzag8x8_s16_ref, zigzag8x8_s16); sl@0: sl@0: static void sl@0: unzigzag8x8_s16_ref (int16_t *dest, int dstr, int16_t *src, int sstr) sl@0: { sl@0: int i,j; sl@0: unsigned int z; sl@0: sl@0: for(i=0;i<8;i++){ sl@0: for(j=0;j<8;j++){ sl@0: z = unzigzag_order[i*8+j]; sl@0: OIL_GET(dest,j*dstr +i*sizeof(int16_t), int16_t) = sl@0: OIL_GET(src, sstr*(z>>3)+(z&7)*sizeof(int16_t), sl@0: int16_t); sl@0: } sl@0: } sl@0: } sl@0: OIL_DEFINE_IMPL_REF (unzigzag8x8_s16_ref, unzigzag8x8_s16); sl@0: sl@0: sl@0: static void sl@0: zigzag8x8_s16_unroll (int16_t *dest, int dstr, int16_t *src, int sstr) sl@0: { sl@0: #define ACK(x,y) \ sl@0: OIL_GET(dest, ((x)>>3) * dstr + ((x)&7) * sizeof(int16_t), int16_t) = \ sl@0: OIL_GET(src, ((y)>>3) * sstr + ((y)&7) * sizeof(int16_t), int16_t); sl@0: sl@0: ACK(0, 0); sl@0: ACK(1, 8); sl@0: ACK(2, 1); sl@0: ACK(3, 2); sl@0: ACK(4, 9); sl@0: ACK(5, 16); sl@0: ACK(6, 24); sl@0: ACK(7, 17); sl@0: ACK(8, 10); sl@0: ACK(9, 3); sl@0: ACK(10, 4); sl@0: ACK(11, 11); sl@0: ACK(12, 18); sl@0: ACK(13, 25); sl@0: ACK(14, 32); sl@0: ACK(15, 40); sl@0: ACK(16, 33); sl@0: ACK(17, 26); sl@0: ACK(18, 19); sl@0: ACK(19, 12); sl@0: ACK(20, 5); sl@0: ACK(21, 6); sl@0: ACK(22, 13); sl@0: ACK(23, 20); sl@0: ACK(24, 27); sl@0: ACK(25, 34); sl@0: ACK(26, 41); sl@0: ACK(27, 48); sl@0: ACK(28, 56); sl@0: ACK(29, 49); sl@0: ACK(30, 42); sl@0: ACK(31, 35); sl@0: ACK(32, 28); sl@0: ACK(33, 21); sl@0: ACK(34, 14); sl@0: ACK(35, 7); sl@0: ACK(36, 15); sl@0: ACK(37, 22); sl@0: ACK(38, 29); sl@0: ACK(39, 36); sl@0: ACK(40, 43); sl@0: ACK(41, 50); sl@0: ACK(42, 57); sl@0: ACK(43, 58); sl@0: ACK(44, 51); sl@0: ACK(45, 44); sl@0: ACK(46, 37); sl@0: ACK(47, 30); sl@0: ACK(48, 23); sl@0: ACK(49, 31); sl@0: ACK(50, 38); sl@0: ACK(51, 45); sl@0: ACK(52, 52); sl@0: ACK(53, 59); sl@0: ACK(54, 60); sl@0: ACK(55, 53); sl@0: ACK(56, 46); sl@0: ACK(57, 39); sl@0: ACK(58, 47); sl@0: ACK(59, 54); sl@0: ACK(60, 61); sl@0: ACK(61, 62); sl@0: ACK(62, 55); sl@0: ACK(63, 63); sl@0: } sl@0: OIL_DEFINE_IMPL (zigzag8x8_s16_unroll, zigzag8x8_s16); sl@0: sl@0: static void sl@0: unzigzag8x8_s16_unroll (int16_t *dest, int dstr, int16_t *src, int sstr) sl@0: { sl@0: ACK(0, 0) sl@0: ACK(1, 2) sl@0: ACK(2, 3) sl@0: ACK(3, 9) sl@0: ACK(4, 10) sl@0: ACK(5, 20) sl@0: ACK(6, 21) sl@0: ACK(7, 35) sl@0: ACK(8, 1) sl@0: ACK(9, 4) sl@0: ACK(10, 8) sl@0: ACK(11, 11) sl@0: ACK(12, 19) sl@0: ACK(13, 22) sl@0: ACK(14, 34) sl@0: ACK(15, 36) sl@0: ACK(16, 5) sl@0: ACK(17, 7) sl@0: ACK(18, 12) sl@0: ACK(19, 18) sl@0: ACK(20, 23) sl@0: ACK(21, 33) sl@0: ACK(22, 37) sl@0: ACK(23, 48) sl@0: ACK(24, 6) sl@0: ACK(25, 13) sl@0: ACK(26, 17) sl@0: ACK(27, 24) sl@0: ACK(28, 32) sl@0: ACK(29, 38) sl@0: ACK(30, 47) sl@0: ACK(31, 49) sl@0: ACK(32, 14) sl@0: ACK(33, 16) sl@0: ACK(34, 25) sl@0: ACK(35, 31) sl@0: ACK(36, 39) sl@0: ACK(37, 46) sl@0: ACK(38, 50) sl@0: ACK(39, 57) sl@0: ACK(40, 15) sl@0: ACK(41, 26) sl@0: ACK(42, 30) sl@0: ACK(43, 40) sl@0: ACK(44, 45) sl@0: ACK(45, 51) sl@0: ACK(46, 56) sl@0: ACK(47, 58) sl@0: ACK(48, 27) sl@0: ACK(49, 29) sl@0: ACK(50, 41) sl@0: ACK(51, 44) sl@0: ACK(52, 52) sl@0: ACK(53, 55) sl@0: ACK(54, 59) sl@0: ACK(55, 62) sl@0: ACK(56, 28) sl@0: ACK(57, 42) sl@0: ACK(58, 43) sl@0: ACK(59, 53) sl@0: ACK(60, 54) sl@0: ACK(61, 60) sl@0: ACK(62, 61) sl@0: ACK(63, 63) sl@0: } sl@0: OIL_DEFINE_IMPL (unzigzag8x8_s16_unroll, unzigzag8x8_s16); sl@0: sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionClass* __oil_function_class_zigzag8x8_s16() { sl@0: return &_oil_function_class_zigzag8x8_s16; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionClass* __oil_function_class_unzigzag8x8_s16() { sl@0: return &_oil_function_class_unzigzag8x8_s16; sl@0: } sl@0: #endif sl@0: sl@0: sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionImpl* __oil_function_impl_zigzag8x8_s16_ref() { sl@0: return &_oil_function_impl_zigzag8x8_s16_ref; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionImpl* __oil_function_impl_unzigzag8x8_s16_ref() { sl@0: return &_oil_function_impl_unzigzag8x8_s16_ref; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionImpl* __oil_function_impl_zigzag8x8_s16_unroll() { sl@0: return &_oil_function_impl_zigzag8x8_s16_unroll; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: OilFunctionImpl* __oil_function_impl_unzigzag8x8_s16_unroll() { sl@0: return &_oil_function_impl_unzigzag8x8_s16_unroll; sl@0: } sl@0: #endif sl@0: sl@0: sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_zigzag8x8_s16 () { sl@0: oil_function_class_ptr_zigzag8x8_s16 = __oil_function_class_zigzag8x8_s16(); sl@0: return &oil_function_class_ptr_zigzag8x8_s16->func; sl@0: } sl@0: #endif sl@0: sl@0: #ifdef __SYMBIAN32__ sl@0: sl@0: EXPORT_C void** _oil_function_class_ptr_unzigzag8x8_s16 () { sl@0: oil_function_class_ptr_unzigzag8x8_s16 = __oil_function_class_unzigzag8x8_s16(); sl@0: return &oil_function_class_ptr_unzigzag8x8_s16->func; sl@0: } sl@0: #endif sl@0: