1 #include "opj_includes.h"
3 /*--------------------------------------------------------
4 Matrix f�r sYCC, Amendment 1 to IEC 61966-2-1
6 Y : 0.299 0.587 0.114 :R
7 Cb: -0.1687 -0.3312 0.5 :G
8 Cr: 0.5 -0.4187 -0.0812 :B
12 R: 1 -3.68213e-05 1.40199 :Y
13 G: 1.00003 -0.344125 -0.714128 :Cb - 2^(prec - 1)
14 B: 0.999823 1.77204 -8.04142e-06 :Cr - 2^(prec - 1)
16 -----------------------------------------------------------*/
17 static void sycc_to_rgb(int offset, int upb, int y, int cb, int cr,
18 int *out_r, int *out_g, int *out_b)
22 cb -= offset; cr -= offset;
23 r = y + (int)(1.402 * (float)cr);
24 if(r < 0) r = 0; else if(r > upb) r = upb; *out_r = r;
26 g = y - (int)(0.344 * (float)cb + 0.714 * (float)cr);
27 if(g < 0) g = 0; else if(g > upb) g = upb; *out_g = g;
29 b = y + (int)(1.772 * (float)cb);
30 if(b < 0) b = 0; else if(b > upb) b = upb; *out_b = b;
33 static void opj_convert_sycc444(opj_image_t *img)
35 int *d0, *d1, *d2, *r, *g, *b;
36 const int *y, *cb, *cr;
37 int maxw, maxh, max, i, offset, upb;
39 i = img->comps[0].prec;
40 offset = 1<<(i - 1); upb = (1<<i)-1;
42 maxw = img->comps[0].w; maxh = img->comps[0].h;
45 y = img->comps[0].data;
46 cb = img->comps[1].data;
47 cr = img->comps[2].data;
49 d0 = r = (int*)opj_malloc(sizeof(int) * max);
50 d1 = g = (int*)opj_malloc(sizeof(int) * max);
51 d2 = b = (int*)opj_malloc(sizeof(int) * max);
53 for(i = 0; i < max; ++i)
55 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
57 ++y; ++cb; ++cr; ++r; ++g; ++b;
59 opj_free(img->comps[0].data); img->comps[0].data = d0;
60 opj_free(img->comps[1].data); img->comps[1].data = d1;
61 opj_free(img->comps[2].data); img->comps[2].data = d2;
63 }/* opj_convert_sycc444() */
65 static void opj_convert_sycc422(opj_image_t *img)
67 int *d0, *d1, *d2, *r, *g, *b;
68 const int *y, *cb, *cr;
69 int maxw, maxh, max, offset, upb;
72 i = img->comps[0].prec;
73 offset = 1<<(i - 1); upb = (1<<i)-1;
75 maxw = img->comps[0].w; maxh = img->comps[0].h;
78 y = img->comps[0].data;
79 cb = img->comps[1].data;
80 cr = img->comps[2].data;
82 d0 = r = (int*)opj_malloc(sizeof(int) * max);
83 d1 = g = (int*)opj_malloc(sizeof(int) * max);
84 d2 = b = (int*)opj_malloc(sizeof(int) * max);
86 for(i=0; i < maxh; ++i)
88 for(j=0; j < maxw; j += 2)
90 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
94 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
96 ++y; ++r; ++g; ++b; ++cb; ++cr;
99 opj_free(img->comps[0].data); img->comps[0].data = d0;
100 opj_free(img->comps[1].data); img->comps[1].data = d1;
101 opj_free(img->comps[2].data); img->comps[2].data = d2;
103 img->comps[1].w = maxw; img->comps[1].h = maxh;
104 img->comps[2].w = maxw; img->comps[2].h = maxh;
105 img->comps[1].dx = img->comps[0].dx;
106 img->comps[2].dx = img->comps[0].dx;
107 img->comps[1].dy = img->comps[0].dy;
108 img->comps[2].dy = img->comps[0].dy;
110 }/* opj_convert_sycc422() */
112 static void opj_convert_sycc420(opj_image_t *img)
114 int *d0, *d1, *d2, *r, *g, *b, *nr, *ng, *nb;
115 const int *y, *cb, *cr, *ny;
116 int maxw, maxh, max, offset, upb;
119 i = img->comps[0].prec;
120 offset = 1<<(i - 1); upb = (1<<i)-1;
122 maxw = img->comps[0].w; maxh = img->comps[0].h;
125 y = img->comps[0].data;
126 cb = img->comps[1].data;
127 cr = img->comps[2].data;
129 d0 = r = (int*)opj_malloc(sizeof(int) * max);
130 d1 = g = (int*)opj_malloc(sizeof(int) * max);
131 d2 = b = (int*)opj_malloc(sizeof(int) * max);
133 for(i=0; i < maxh; i += 2)
136 nr = r + maxw; ng = g + maxw; nb = b + maxw;
138 for(j=0; j < maxw; j += 2)
140 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
144 sycc_to_rgb(offset, upb, *y, *cb, *cr, r, g, b);
148 sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
150 ++ny; ++nr; ++ng; ++nb;
152 sycc_to_rgb(offset, upb, *ny, *cb, *cr, nr, ng, nb);
154 ++ny; ++nr; ++ng; ++nb; ++cb; ++cr;
156 y += maxw; r += maxw; g += maxw; b += maxw;
158 opj_free(img->comps[0].data); img->comps[0].data = d0;
159 opj_free(img->comps[1].data); img->comps[1].data = d1;
160 opj_free(img->comps[2].data); img->comps[2].data = d2;
162 img->comps[1].w = maxw; img->comps[1].h = maxh;
163 img->comps[2].w = maxw; img->comps[2].h = maxh;
164 img->comps[1].dx = img->comps[0].dx;
165 img->comps[2].dx = img->comps[0].dx;
166 img->comps[1].dy = img->comps[0].dy;
167 img->comps[2].dy = img->comps[0].dy;
169 }/* opj_convert_sycc420() */
171 void opj_convert_sycc_to_rgb(opj_image_t *img)
173 if(img->numcomps < 3)
175 img->color_space = CLRSPC_GRAY;
179 if((img->comps[0].dx == 1)
180 && (img->comps[1].dx == 2)
181 && (img->comps[2].dx == 2)
182 && (img->comps[0].dy == 1)
183 && (img->comps[1].dy == 2)
184 && (img->comps[2].dy == 2))/* horizontal and vertical sub-sample */
186 opj_convert_sycc420(img);
189 if((img->comps[0].dx == 1)
190 && (img->comps[1].dx == 2)
191 && (img->comps[2].dx == 2)
192 && (img->comps[0].dy == 1)
193 && (img->comps[1].dy == 1)
194 && (img->comps[2].dy == 1))/* horizontal sub-sample only */
196 opj_convert_sycc422(img);
199 if((img->comps[0].dx == 1)
200 && (img->comps[1].dx == 1)
201 && (img->comps[2].dx == 1)
202 && (img->comps[0].dy == 1)
203 && (img->comps[1].dy == 1)
204 && (img->comps[2].dy == 1))/* no sub-sample */
206 opj_convert_sycc444(img);
210 fprintf(stderr,"%s:%d:opj_convert_sycc_to_rgb\n\tCAN NOT CONVERT\n",
214 img->color_space = CLRSPC_SRGB;
216 }/* opj_convert_sycc_to_rgb() */