1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16/**
17 ******************************************************************************
18 * @file        M4VIFI_Defines.h
19 * @brief        Macro Definition
20 * @note        This file defines all the macro used in the filter library
21 ******************************************************************************
22*/
23
24#ifndef _M4VIFI_DEFINES_H_
25#define _M4VIFI_DEFINES_H_
26
27/**
28 *****************************************************************************
29 *                    Macros used for color transform RGB565 to YUV
30 *****************************************************************************
31*/
32#define CST_RGB_16_SIZE 2
33#define Y16(r, g, b) CLIP(  ( ( (80593 * r)+(77855 * g)+(30728 * b)) >> 15))
34#define U16(r, g, b) CLIP(128+ ( ( -(45483 * r)-(43936 * g)+(134771 * b)) >> 15 ))
35#define V16(r, g, b) CLIP(128+ ( ( (134771 * r)-(55532 * g)-(21917 * b)) >> 15  ))
36
37
38/**
39 *****************************************************************************
40 *    Macros used for color transform YUV to RGB
41 *    B = 1.164(Y - 16)                  + 2.018(U - 128)
42 *  G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
43 *  R = 1.164(Y - 16) + 1.596(V - 128)
44 *  Above Conversion Formula is implemented for fixed point operation
45 *****************************************************************************
46*/
47
48#define CST_RGB_24_SIZE 3
49
50#ifdef __RGB_V1__
51#define DEMATRIX(Rx,Gx,Bx,Yx37,Ux,Vx) \
52    Rx = CLIP(((Yx37 + (Vx * 51) + 16) >> 5) - 223); \
53    Gx = CLIP(((Yx37 - ((Ux+(Vx<<1)) * 13) +16) >> 5) + 135); \
54    Bx = CLIP(((Yx37 + (Ux * 65) + 16) >> 5) - 277)
55#else
56#define DEMATRIX(Rx,Gx,Bx,Yx2568,Ux,Vx) \
57    Rx = CLIP(((Yx2568 +                 (Vx * 0x3343) + (M4VIFI_Int32)0xffe40800) >> 13)); \
58    Gx = CLIP(((Yx2568 - (Ux * 0x0c92) - (Vx * 0x1a1e) + (M4VIFI_Int32)0x00110180) >> 13)); \
59    Bx = CLIP(((Yx2568 + (Ux * 0x40cf)                    + (M4VIFI_Int32)0xffdd4200) >> 13));
60#endif /* __RGB_V1__ */
61
62/**
63 *****************************************************************************
64 *    Packing and Unpacking is different for little and big endian
65 *  r, g, b, Rx, Gx, Bx are 8 bit color value
66 *    a, data are 16 bit pixel value
67 *****************************************************************************
68 */
69
70/* Pack computations common for little endian and big endian modes */
71#define    PACK_BGR24(rgb_ptr,Rx,Gx,Bx) {rgb_ptr[0] = (M4VIFI_UInt8)Bx; rgb_ptr[1] =\
72                         (M4VIFI_UInt8)Gx; rgb_ptr[2] = (M4VIFI_UInt8)Rx;}
73#define    PACK_RGB24(rgb_ptr,Rx,Gx,Bx) {rgb_ptr[0] = (M4VIFI_UInt8)Rx; rgb_ptr[1] =\
74                         (M4VIFI_UInt8)Gx; rgb_ptr[2] = (M4VIFI_UInt8)Bx;}
75
76#ifdef BIG_ENDIAN
77#define    PACK_RGB565(a, Rx, Gx, Bx) (((Rx >> 3) << (11 + (a)))\
78                 | ((Gx >> 2) << (5 + (a))) | ((Bx >> 3) << (a)))
79#define    PACK_BGR565(a, Rx, Gx, Bx) (((Bx >> 3) << (11 + (a)))\
80                 | ((Gx >> 2) << (5 + (a))) | ((Rx >> 3) << (a)))
81#define GET_RGB565(r, g, b, data) {b = ((data) & 31); g =\
82                     ((data >> 5) & 63); r = ((data >> 11) & 31);}
83#define GET_BGR565(b, g, r, data) \
84    r = ((data) & 31); \
85    g = ((data >> 5) & 63); \
86    b = ((data >> 11) & 31 );
87#else /* LITTLE endian: 0x12345678 -> 78 56 34 12 */
88#define    PACK_RGB565(a, Rx, Gx, Bx) (((Bx >> 3) << (8 + (a))) \
89                  | (((Gx >> 2)&0x7) << (13 + (a))) | ((Gx >> 5) << (a)) | ((Rx >> 3) << (3 + a)))
90#define    PACK_BGR565(a, Rx, Gx, Bx) (((Rx >> 3) << (11 + (a))) \
91                  | ((Gx >> 2) << (5 + (a))) | ((Bx >> 3) << (a)))
92#define GET_RGB565(r, g, b, data) { b = (M4VIFI_UInt8)(((data) & 0x1F00) >> 8); g =\
93             (M4VIFI_UInt8)((((data) & 0x7) << 3) | (((data) & 0xE000) >> 13)); r =\
94             (M4VIFI_UInt8)(((data) & 0xF8) >> 3);}
95#define GET_BGR565(b, g, r, data) \
96    b = ((data) & 31); \
97    g = ((data >> 5) & 63); \
98    r = ((data >> 11) & 31 );
99#endif /* BIG_ENDIAN */
100
101
102#define CST_RGB_24_SIZE 3
103#define Y24(r,g,b) CLIP(( ( (19595 * r) + (38470 * g) + (9437 * b) ) >>16))
104#define U24(r,g,b) CLIP(128 + ( ( -(11059 * r) - (21709 * g) + (32768 * b)) >>16))
105#define V24(r,g,b) CLIP(128 + ( ( (32768 * r) - (27426 * g) - (5329 * b))  >>16))
106#define GET_RGB24(r,g,b,s,o) r = s[o]; g = s[o + 1]; b = s[o + 2];
107
108/**
109 ***********************************************************************************
110 *                    Macro for clipping using the clipping matrix for RGB values
111 ***********************************************************************************
112*/
113/** Clip function ensures values with range of 0 and 255 */
114#define        CLIP(x)    *(M4VIFI_ClipTable_zero + (x))
115#define        CLIP_OVF        500
116#define     CLIP_LUT_SIZE     (256 + 2 * CLIP_OVF)
117/** Division table for RGB565 to HLS conversion */
118#define        DIVCLIP(x)    *(M4VIFI_DivTable_zero + (x))
119
120/**
121 *****************************************************************************
122 *                    Endianness (default configuration is Little Endian)
123 *****************************************************************************
124*/
125#if (!defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN))
126/** Default endian setting */
127#define LITTLE_ENDIAN
128#endif
129
130/**
131 *****************************************************************************
132 *                    Other macros and define
133 *****************************************************************************
134*/
135/** YUV plane index */
136#define PLANES    3
137#define YPlane    0
138#define UPlane    1
139#define VPlane    2
140
141/** Check for value is EVEN */
142#ifndef IS_EVEN
143#define IS_EVEN(a)    (!(a & 0x01))
144#endif
145
146/* Used for fixed point implementation */
147#ifndef MAX_SHORT
148#define MAX_SHORT    0x10000
149#endif
150
151#endif /* _M4VIFI_DEFINES_H_ */
152
153/* End of file M4VIFI_Defines.h */
154
155