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