19 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
20 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 |
* |
* |
22 |
* $Id: colorspace.c,v 1.14 2006-11-10 18:58:39 chl Exp $ |
* $Id: colorspace.c,v 1.15 2009-05-13 09:39:20 Isibaar Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
152 |
#define V_B_IN 0.071 |
#define V_B_IN 0.071 |
153 |
#define V_ADD_IN 128 |
#define V_ADD_IN 128 |
154 |
|
|
155 |
#define SCALEBITS_IN 8 |
#define SCALEBITS_IN 13 |
156 |
#define FIX_IN(x) ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5)) |
#define FIX_IN(x) ((uint16_t) ((x) * (1L<<SCALEBITS_IN) + 0.5)) |
157 |
|
#define FIX_ROUND (1L<<(SCALEBITS_IN-1)) |
158 |
|
|
159 |
/* rgb16/rgb16i input */ |
/* rgb16/rgb16i input */ |
160 |
|
|
174 |
r##UVID += r = C1##_R(rgb); \ |
r##UVID += r = C1##_R(rgb); \ |
175 |
y_ptr[(ROW)*y_stride+0] = \ |
y_ptr[(ROW)*y_stride+0] = \ |
176 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
177 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; \ |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ |
178 |
rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2); \ |
rgb = *(uint16_t *) (x_ptr + ((ROW)*x_stride) + 2); \ |
179 |
b##UVID += b = C1##_B(rgb); \ |
b##UVID += b = C1##_B(rgb); \ |
180 |
g##UVID += g = C1##_G(rgb); \ |
g##UVID += g = C1##_G(rgb); \ |
181 |
r##UVID += r = C1##_R(rgb); \ |
r##UVID += r = C1##_R(rgb); \ |
182 |
y_ptr[(ROW)*y_stride+1] = \ |
y_ptr[(ROW)*y_stride+1] = \ |
183 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
184 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; |
185 |
|
|
186 |
#define READ_RGB16_UV(UV_ROW,UVID) \ |
#define READ_RGB16_UV(UV_ROW,UVID) \ |
187 |
u_ptr[(UV_ROW)*uv_stride] = \ |
u_ptr[(UV_ROW)*uv_stride] = \ |
188 |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
189 |
FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
190 |
v_ptr[(UV_ROW)*uv_stride] = \ |
v_ptr[(UV_ROW)*uv_stride] = \ |
191 |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
192 |
FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
193 |
|
|
194 |
#define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
#define RGB16_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
195 |
/* nothing */ |
/* nothing */ |
222 |
b##UVID += b = x_ptr[(ROW)*x_stride+(C3)]; \ |
b##UVID += b = x_ptr[(ROW)*x_stride+(C3)]; \ |
223 |
y_ptr[(ROW)*y_stride+0] = \ |
y_ptr[(ROW)*y_stride+0] = \ |
224 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
225 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; \ |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; \ |
226 |
r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)]; \ |
r##UVID += r = x_ptr[(ROW)*x_stride+(SIZE)+(C1)]; \ |
227 |
g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)]; \ |
g##UVID += g = x_ptr[(ROW)*x_stride+(SIZE)+(C2)]; \ |
228 |
b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)]; \ |
b##UVID += b = x_ptr[(ROW)*x_stride+(SIZE)+(C3)]; \ |
229 |
y_ptr[(ROW)*y_stride+1] = \ |
y_ptr[(ROW)*y_stride+1] = \ |
230 |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
(uint8_t) ((FIX_IN(Y_R_IN) * r + FIX_IN(Y_G_IN) * g + \ |
231 |
FIX_IN(Y_B_IN) * b) >> SCALEBITS_IN) + Y_ADD_IN; |
FIX_IN(Y_B_IN) * b + FIX_ROUND) >> SCALEBITS_IN) + Y_ADD_IN; |
232 |
|
|
233 |
#define READ_RGB_UV(UV_ROW,UVID) \ |
#define READ_RGB_UV(UV_ROW,UVID) \ |
234 |
u_ptr[(UV_ROW)*uv_stride] = \ |
u_ptr[(UV_ROW)*uv_stride] = \ |
235 |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
(uint8_t) ((-FIX_IN(U_R_IN) * r##UVID - FIX_IN(U_G_IN) * g##UVID + \ |
236 |
FIX_IN(U_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
FIX_IN(U_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + U_ADD_IN; \ |
237 |
v_ptr[(UV_ROW)*uv_stride] = \ |
v_ptr[(UV_ROW)*uv_stride] = \ |
238 |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
(uint8_t) ((FIX_IN(V_R_IN) * r##UVID - FIX_IN(V_G_IN) * g##UVID - \ |
239 |
FIX_IN(V_B_IN) * b##UVID) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
FIX_IN(V_B_IN) * b##UVID + 4*FIX_ROUND) >> (SCALEBITS_IN + 2)) + V_ADD_IN; |
240 |
|
|
241 |
|
|
242 |
#define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |
#define RGB_TO_YV12_ROW(SIZE,C1,C2,C3,C4) \ |