00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <fvutils/color/rgbyuv.h>
00026 #include <fvutils/color/yuv.h>
00027 #include <fvutils/color/rgb.h>
00028 #include <fvutils/color/colorspaces.h>
00029
00030 #include <cstring>
00031
00032 namespace firevision {
00033 #if 0
00034 }
00035 #endif
00036
00037 void
00038 rgb_to_yuy2(const unsigned char *RGB, unsigned char *YUV, unsigned int width, unsigned int height)
00039 {
00040 unsigned int i, j;
00041 register int y0, y1, u0, u1, v0, v1 ;
00042 register int r, g, b;
00043
00044 for (i = 0, j = 0; i < 3 * width * height; i += 6, j += 4) {
00045 r = RGB[i + 0];
00046 g = RGB[i + 1];
00047 b = RGB[i + 2];
00048 RGB2YUV(r, g, b, y0, u0 , v0);
00049 r = RGB[i + 3];
00050 g = RGB[i + 4];
00051 b = RGB[i + 5];
00052 RGB2YUV(r, g, b, y1, u1 , v1);
00053 YUV[j + 0] = y0;
00054 YUV[j + 1] = (u0+u1)/2;
00055 YUV[j + 2] = y1;
00056 YUV[j + 3] = (v0+v1)/2;
00057 }
00058 }
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 void
00078 rgb_to_yuv411packed_plainc(const unsigned char *RGB, unsigned char *YUV,
00079 unsigned int width, unsigned int height)
00080 {
00081 register unsigned int i = 0, j = 0;
00082 register int y[4] = {0, 0, 0, 0}, u, v;
00083 register RGB_t *r;
00084 register unsigned int su = 0;
00085 register unsigned int sv = 0;
00086
00087 while (i < (width * height)) {
00088 r = (RGB_t *)RGB;
00089 for (register unsigned int k = 0; j <= 4; ++j) {
00090 RGB2YUV(r->R, r->G, r->B, y[k], u, v);
00091 su += u;
00092 sv += v;
00093 RGB += 3;
00094 }
00095 YUV[j++] = su/4;
00096 YUV[j++] = y[0];
00097 YUV[j++] = y[1];
00098 YUV[j++] = sv/4;
00099 YUV[j++] = y[2];
00100 YUV[j++] = y[3];
00101 }
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 void
00117 convert_line_rgb_to_yuv422planar(const unsigned char *RGB, unsigned char *YUV,
00118 unsigned int width, unsigned int height,
00119 unsigned int rgb_line, unsigned int yuv_line)
00120 {
00121 register unsigned int i = 0;
00122 register int y1, y2, u1, u2, v1, v2;
00123 register RGB_t *r1, *r2;
00124 register unsigned char *yp, *up, *vp;
00125
00126 yp = YUV + (width * yuv_line);
00127 up = YUV422_PLANAR_U_PLANE(YUV, width, height) + (width * yuv_line / 2);
00128 vp = YUV422_PLANAR_V_PLANE(YUV, width, height) + (width * yuv_line / 2);
00129
00130 RGB += 3 * width * rgb_line;
00131
00132 while (i < width) {
00133 r1 = (RGB_t *)RGB;
00134 RGB += 3;
00135 r2 = (RGB_t *)RGB;
00136 RGB += 3;
00137
00138 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
00139 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
00140
00141 *yp++ = y1;
00142 *yp++ = y2;
00143 *up++ = (u1 + u2) / 2;
00144 *vp++ = (v1 + v2) / 2;
00145
00146 i += 2;
00147 }
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 void
00161 rgb_to_yuv422planar_plainc(const unsigned char *RGB, unsigned char *YUV,
00162 unsigned int width, unsigned int height)
00163 {
00164 register unsigned int i = 0;
00165 register int y1, y2, u1, u2, v1, v2;
00166 register RGB_t *r1, *r2;
00167 register unsigned char *yp, *up, *vp;
00168
00169 yp = YUV;
00170 up = YUV422_PLANAR_U_PLANE(YUV, width, height);
00171 vp = YUV422_PLANAR_V_PLANE(YUV, width, height);
00172
00173 while (i < (width * height)) {
00174 r1 = (RGB_t *)RGB;
00175 RGB += 3;
00176 r2 = (RGB_t *)RGB;
00177 RGB += 3;
00178
00179 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
00180 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
00181
00182 *yp++ = y1;
00183 *yp++ = y2;
00184 *up++ = (u1 + u2) / 2;
00185 *vp++ = (v1 + v2) / 2;
00186
00187 i += 2;
00188 }
00189 }
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202 void
00203 convert_line_rgb_to_yuv422packed(const unsigned char *RGB, unsigned char *YUV,
00204 unsigned int width, unsigned int height,
00205 unsigned int rgb_line, unsigned int yuv_line)
00206 {
00207 register unsigned int i = 0;
00208 register int y1, y2, u1, u2, v1, v2;
00209 register RGB_t *r1, *r2;
00210 register unsigned char *p;
00211
00212 p = YUV + (width * yuv_line) * 2;
00213
00214 RGB += 3 * width * rgb_line;
00215
00216 while (i < width) {
00217 r1 = (RGB_t *)RGB;
00218 RGB += 3;
00219 r2 = (RGB_t *)RGB;
00220 RGB += 3;
00221
00222 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
00223 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
00224
00225 *p++ = (u1 + u2) / 2;
00226 *p++ = y1;
00227 *p++ = (v1 + v2) / 2;
00228 *p++ = y2;
00229
00230 i += 2;
00231 }
00232 }
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 void
00244 rgb_to_yuv422packed_plainc(const unsigned char *RGB, unsigned char *YUV,
00245 unsigned int width, unsigned int height)
00246 {
00247 register unsigned int i = 0;
00248 register int y1, y2, u1, u2, v1, v2;
00249 register RGB_t *r1, *r2;
00250 register unsigned char *p;
00251
00252 p = YUV;
00253
00254 while (i < (width * height)) {
00255 r1 = (RGB_t *)RGB;
00256 RGB += 3;
00257 r2 = (RGB_t *)RGB;
00258 RGB += 3;
00259
00260 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
00261 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
00262
00263 *p++ = (u1 + u2) / 2;
00264 *p++ = y1;
00265 *p++ = (v1 + v2) / 2;
00266 *p++ = y2;
00267
00268 i += 2;
00269 }
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 void
00282 bgr_to_yuv422planar_plainc(const unsigned char *BGR, unsigned char *YUV,
00283 unsigned int width, unsigned int height)
00284 {
00285 register unsigned int i = 0;
00286 register int y1, y2, u1, u2, v1, v2;
00287 register BGR_t *r1, *r2;
00288 register unsigned char *yp, *up, *vp;
00289
00290 yp = YUV;
00291 up = YUV422_PLANAR_U_PLANE(YUV, width, height);
00292 vp = YUV422_PLANAR_V_PLANE(YUV, width, height);
00293
00294 while (i < (width * height)) {
00295 r1 = (BGR_t *)BGR;
00296 BGR += 3;
00297 r2 = (BGR_t *)BGR;
00298 BGR += 3;
00299
00300 RGB2YUV(r1->R, r1->G, r1->B, y1, u1, v1);
00301 RGB2YUV(r2->R, r2->G, r2->B, y2, u2, v2);
00302
00303 *yp++ = y1;
00304 *yp++ = y2;
00305 *up++ = (u1 + u2) / 2;
00306 *vp++ = (v1 + v2) / 2;
00307
00308 i += 2;
00309 }
00310 }
00311
00312 }