Max 5 API Reference
00001 #include "jit.common.h" 00002 #include "jit.fixmath.h" 00003 #include "jit.uyvy.h" 00004 00005 /* 00006 CCIR 601/ITU-R. more info on http://www.fourcc.org 00007 Y: 0. - 1. normalized to the range (16-235) 00008 U/V(Cb/Cr): -0.5 - 0.5 to the range (16-239)? but leaving full range for now (see microsoft.com?) 00009 00010 00011 Y = 0.299R + 0.587G + 0.114B 00012 Cb = (B-Y)*0.565 00013 Cr = (R-Y)*0.713 00014 00015 with reciprocal versions: 00016 R = Y + 1.403Cr 00017 G = Y - 0.344Cb - 0.714Cr 00018 B = Y + 1.770Cb 00019 00020 */ 00021 00022 #define UYVY_YNORM 75962L //((long)((255./220.)*fixed1)) 00023 #define UYVY_YNORM_INV 56540L //((long)((220./255.)*fixed1)) 00024 #define UYVY_CRRSCALE 91947L //((long)((1.403)*fixed1)) 00025 #define UYVY_CRGSCALE -46792L //((long)((-0.714)*fixed1)) 00026 #define UYVY_CBGSCALE -22544L //((long)((-0.344)*fixed1)) 00027 #define UYVY_CBBSCALE 115998L //(long)((1.770)*fixed1) 00028 00029 // to avoid a few extra right shifts below, we're using 00030 // 10 bit fixed point for r/g/b scale and ynorm 00031 #define RGB_YNORM_INV10 883L //((long)((220./255.)*(1<<10L))) 00032 #define RGB_RSCALE10 306L //(long)(0.299*(double)(1<<10L)) 00033 #define RGB_GSCALE10 601L //(long)(0.587*(double)(1<<10L)) 00034 #define RGB_BSCALE10 116L //(long)(0.114*(double)(1<<10L)) 00035 #define RGB_CRSCALE 46727L //(long)(0.713*(double)fixed1) 00036 #define RGB_CBSCALE 37027L //(long)(0.565*(double)fixed1) 00037 00038 t_jit_err jit_uyvy2argb_init(void); 00039 t_jit_err jit_argb2uyvy_init(void); 00040 t_jit_err jit_uyvy2ayuv_init(void); 00041 t_jit_err jit_ayuv2uyvy_init(void); 00042 t_jit_err jit_argb2ayuv_init(void); 00043 t_jit_err jit_ayuv2argb_init(void); 00044 t_jit_err jit_uyvy2luma_init(void); 00045 t_jit_err jit_luma2uyvy_init(void); 00046 t_jit_err jit_ayuv2luma_init(void); 00047 t_jit_err jit_luma2ayuv_init(void); 00048 00049 t_jit_err jit_uyvy_init(void) 00050 { 00051 jit_uyvy2argb_init(); 00052 jit_argb2uyvy_init(); 00053 jit_uyvy2ayuv_init(); 00054 jit_ayuv2uyvy_init(); 00055 jit_argb2ayuv_init(); 00056 jit_ayuv2argb_init(); 00057 jit_uyvy2luma_init(); 00058 jit_luma2uyvy_init(); 00059 jit_ayuv2luma_init(); 00060 jit_luma2ayuv_init(); 00061 00062 return JIT_ERR_NONE; 00063 } 00064 00065 void jit_uyvy2argb_vector_char(long n, uchar *ip, uchar *op) 00066 { 00067 long j,y,cb,cr,cb0,cr0,r,g,b; 00068 00069 //first one pixel extend 00070 cb = ip[0]-128; 00071 cr = ip[2]-128; 00072 for (j=0;j<n;j++) { 00073 y = ((long)ip[1]-16L)*UYVY_YNORM; 00074 cb0 = ip[0]-128; 00075 cr0 = ip[2]-128; 00076 cb = (cb0 + cb)>>1L; 00077 cr = (cr0 + cr)>>1L; 00078 r = (y + UYVY_CRRSCALE*cr)>>16L; 00079 g = (y + UYVY_CBGSCALE*cb + UYVY_CRGSCALE*cr)>>16L; 00080 b = (y + UYVY_CBBSCALE*cb)>>16L; 00081 op[0] = 255; 00082 op[1] = CLAMP(r,0,255); 00083 op[2] = CLAMP(g,0,255); 00084 op[3] = CLAMP(b,0,255); 00085 00086 y = ((long)ip[3]-16L)*UYVY_YNORM; 00087 cb = cb0; 00088 cr = cr0; 00089 r = (y + UYVY_CRRSCALE*cr)>>16L; 00090 g = (y + UYVY_CBGSCALE*cb + UYVY_CRGSCALE*cr)>>16L; 00091 b = (y + UYVY_CBBSCALE*cb)>>16L; 00092 op[4] = 255; 00093 op[5] = CLAMP(r,0,255); 00094 op[6] = CLAMP(g,0,255); 00095 op[7] = CLAMP(b,0,255); 00096 ip+=4; 00097 op+=8; 00098 } 00099 } 00100 00101 void jit_uyvy2rgb_vector_char(long n, uchar *ip, uchar *op) 00102 { 00103 long j,y,cb,cr,cb0,cr0,r,g,b; 00104 00105 //first one pixel extend 00106 cb = ip[0]-128; 00107 cr = ip[2]-128; 00108 for (j=0;j<n;j++) { 00109 y = ((long)ip[1]-16L)*UYVY_YNORM; 00110 cb0 = ip[0]-128; 00111 cr0 = ip[2]-128; 00112 cb = (cb0 + cb)>>1L; 00113 cr = (cr0 + cr)>>1L; 00114 r = (y + UYVY_CRRSCALE*cr)>>16L; 00115 g = (y + UYVY_CBGSCALE*cb + UYVY_CRGSCALE*cr)>>16L; 00116 b = (y + UYVY_CBBSCALE*cb)>>16L; 00117 op[0] = CLAMP(r,0,255); 00118 op[1] = CLAMP(g,0,255); 00119 op[2] = CLAMP(b,0,255); 00120 00121 y = ((long)ip[3]-16L)*UYVY_YNORM; 00122 cb = cb0; 00123 cr = cr0; 00124 r = (y + UYVY_CRRSCALE*cr)>>16L; 00125 g = (y + UYVY_CBGSCALE*cb + UYVY_CRGSCALE*cr)>>16L; 00126 b = (y + UYVY_CBBSCALE*cb)>>16L; 00127 op[3] = CLAMP(r,0,255); 00128 op[4] = CLAMP(g,0,255); 00129 op[5] = CLAMP(b,0,255); 00130 ip+=4; 00131 op+=6; 00132 } 00133 } 00134 00135 // n is output dim 00136 void jit_argb2uyvy_vector_char(long n, uchar *ip, uchar *op) 00137 { 00138 long j,yavg,ravg,bavg,cr,cb; 00139 long y1,y2; 00140 00141 for (j=0;j<n;j++) { 00142 y1 = (RGB_RSCALE10*(long)ip[1] + RGB_GSCALE10*(long)ip[2] + RGB_BSCALE10*(long)ip[3]); 00143 y2 = (RGB_RSCALE10*(long)ip[5] + RGB_GSCALE10*(long)ip[6] + RGB_BSCALE10*(long)ip[7]); 00144 op[1] = ((y1*RGB_YNORM_INV10)>>20L) + 16L; 00145 op[3] = ((y2*RGB_YNORM_INV10)>>20L) + 16L; 00146 yavg = (y1+y2)>>10L; 00147 ravg = ((long)ip[1] + (long)ip[5]); 00148 bavg = ((long)ip[3] + (long)ip[7]); 00149 cb = (((bavg-yavg)*RGB_CBSCALE)>>17L) + 128; // U (Cb) (17 to account for avg double) 00150 cr = (((ravg-yavg)*RGB_CRSCALE)>>17L) + 128; // V (Cr) (17 to account for avg double) 00151 //op[0] = CLAMP(cb,16,239); 00152 //op[2] = CLAMP(cr,16,239); 00153 op[0] = cb; 00154 op[2] = cr; 00155 ip+=8; 00156 op+=4; 00157 } 00158 } 00159 00160 // n is output dim 00161 void jit_rgb2uyvy_vector_char(long n, uchar *ip, uchar *op) 00162 { 00163 long j,yavg,ravg,bavg,cr,cb; 00164 long y1,y2; 00165 00166 for (j=0;j<n;j++) { 00167 y1 = (RGB_RSCALE10*(long)ip[0] + RGB_GSCALE10*(long)ip[1] + RGB_BSCALE10*(long)ip[2]); 00168 y2 = (RGB_RSCALE10*(long)ip[3] + RGB_GSCALE10*(long)ip[4] + RGB_BSCALE10*(long)ip[5]); 00169 op[1] = ((y1*RGB_YNORM_INV10)>>20L) + 16L; 00170 op[3] = ((y2*RGB_YNORM_INV10)>>20L) + 16L; 00171 yavg = (y1+y2)>>10L; 00172 ravg = ((long)ip[0] + (long)ip[3]); 00173 bavg = ((long)ip[2] + (long)ip[5]); 00174 cb = (((bavg-yavg)*RGB_CBSCALE)>>17L) + 128; // U (Cb) (17 to account for avg double) 00175 cr = (((ravg-yavg)*RGB_CRSCALE)>>17L) + 128; // V (Cr) (17 to account for avg double) 00176 //op[0] = CLAMP(cb,16,239); 00177 //op[2] = CLAMP(cr,16,239); 00178 op[0] = cb; 00179 op[2] = cr; 00180 ip+=6; 00181 op+=4; 00182 } 00183 } 00184 00185 void jit_uyvy2ayuv_vector_char(long n, uchar *ip, uchar *op) 00186 { 00187 long j,cb,cr,cb0,cr0; 00188 00189 //first one pixel extend 00190 cb = ip[0]; 00191 cr = ip[2]; 00192 for (j=0;j<n;j++) { 00193 cb0 = ip[0]; 00194 cr0 = ip[2]; 00195 cb = (cb0 + cb)>>1L; 00196 cr = (cr0 + cr)>>1L; 00197 op[0] = 255; 00198 op[1] = ip[1]; 00199 op[2] = cb; 00200 op[3] = cr; 00201 00202 cb = cb0; 00203 cr = cr0; 00204 op[4] = 255; 00205 op[5] = ip[3]; 00206 op[6] = cb; 00207 op[7] = cr; 00208 ip+=4; 00209 op+=8; 00210 } 00211 } 00212 00213 void jit_uyvy2yuv_vector_char(long n, uchar *ip, uchar *op) 00214 { 00215 long j,cb,cr,cb0,cr0; 00216 00217 //first one pixel extend 00218 cb = ip[0]; 00219 cr = ip[2]; 00220 for (j=0;j<n;j++) { 00221 cb0 = ip[0]; 00222 cr0 = ip[2]; 00223 cb = (cb0 + cb)>>1L; 00224 cr = (cr0 + cr)>>1L; 00225 op[0] = ip[1]; 00226 op[1] = cb; 00227 op[2] = cr; 00228 00229 cb = cb0; 00230 cr = cr0; 00231 op[3] = ip[3]; 00232 op[4] = cb; 00233 op[5] = cr; 00234 ip+=4; 00235 op+=6; 00236 } 00237 } 00238 00239 // n is output dim 00240 void jit_ayuv2uyvy_vector_char(long n, uchar *ip, uchar *op) 00241 { 00242 long j; 00243 00244 for (j=0;j<n;j++) { 00245 op[1] = ip[1]; 00246 op[3] = ip[5]; 00247 op[0] = ((long)ip[2]+(long)ip[6])>>1L; 00248 op[2] = ((long)ip[3]+(long)ip[7])>>1L; 00249 ip+=8; 00250 op+=4; 00251 } 00252 } 00253 00254 // n is output dim 00255 void jit_yuv2uyvy_vector_char(long n, uchar *ip, uchar *op) 00256 { 00257 long j; 00258 00259 for (j=0;j<n;j++) { 00260 op[1] = ip[0]; 00261 op[3] = ip[3]; 00262 op[0] = ((long)ip[1]+(long)ip[4])>>1L; 00263 op[2] = ((long)ip[2]+(long)ip[5])>>1L; 00264 ip+=6; 00265 op+=4; 00266 } 00267 } 00268 00269 00270 // n is input + output dim 00271 void jit_argb2ayuv_vector_char(long n, uchar *ip, uchar *op) 00272 { 00273 long j,r,b,cr,cb; 00274 long y; 00275 00276 for (j=0;j<n;j++) { 00277 op[0] = ip[0]; 00278 y = (RGB_RSCALE10*(long)ip[1] + RGB_GSCALE10*(long)ip[2] + RGB_BSCALE10*(long)ip[3]); 00279 op[1] = ((y*RGB_YNORM_INV10)>>20L) + 16L; 00280 y = y>>10L; 00281 r = (long)ip[1]; 00282 b = (long)ip[3]; 00283 cb = (((b-y)*RGB_CBSCALE)>>16L) + 128; // U (Cb) 00284 cr = (((r-y)*RGB_CRSCALE)>>16L) + 128; // V (Cr) 00285 //op[2] = CLAMP(cb,16,239); 00286 //op[3] = CLAMP(cr,16,239); 00287 op[2] = cb; 00288 op[3] = cr; 00289 ip+=4; 00290 op+=4; 00291 } 00292 } 00293 00294 // n is input + output dim 00295 void jit_ayuv2argb_vector_char(long n, uchar *ip, uchar *op) 00296 { 00297 long j,y,cb,cr,r,g,b; 00298 00299 for (j=0;j<n;j++) { 00300 y = ((long)ip[1]-16L)*UYVY_YNORM; 00301 cb = ip[2]-128; 00302 cr = ip[3]-128; 00303 r = (y + UYVY_CRRSCALE*cr)>>16L; 00304 g = (y + UYVY_CBGSCALE*cb + UYVY_CRGSCALE*cr)>>16L; 00305 b = (y + UYVY_CBBSCALE*cb)>>16L; 00306 op[0] = ip[0]; 00307 op[1] = CLAMP(r,0,255); 00308 op[2] = CLAMP(g,0,255); 00309 op[3] = CLAMP(b,0,255); 00310 ip+=4; 00311 op+=4; 00312 } 00313 } 00314 00315 00316 // n is input dim 00317 void jit_uyvy2luma_vector_char(long n, uchar *ip, uchar *op) 00318 { 00319 long j,y; 00320 00321 for (j=0;j<n;j++) { 00322 y = (((long)ip[1]-16L)*UYVY_YNORM)>>16L; 00323 op[0] = CLAMP(y,0,255); 00324 y = (((long)ip[3]-16L)*UYVY_YNORM)>>16L; 00325 op[1] = CLAMP(y,0,255); 00326 ip+=4; 00327 op+=2; 00328 } 00329 } 00330 00331 // n is output dim 00332 void jit_luma2uyvy_vector_char(long n, uchar *ip, uchar *op) 00333 { 00334 long j,y; 00335 00336 for (j=0;j<n;j++) { 00337 op[1] = ((ip[0]*UYVY_YNORM_INV)>>16L) + 16L; 00338 op[3] = ((ip[1]*UYVY_YNORM_INV)>>16L) + 16L; 00339 op[0] = op[2] = 128; 00340 ip+=2; 00341 op+=4; 00342 } 00343 } 00344 00345 // n is input + output dim 00346 void jit_ayuv2luma_vector_char(long n, uchar *ip, uchar *op) 00347 { 00348 long j,y; 00349 00350 for (j=0;j<n;j++) { 00351 y = (((long)ip[1]-16L)*UYVY_YNORM)>>16L; 00352 op[0] = CLAMP(y,0,255); 00353 ip+=4; 00354 op+=1; 00355 } 00356 } 00357 00358 // n is input + output dim 00359 void jit_luma2ayuv_vector_char(long n, uchar *ip, uchar *op) 00360 { 00361 long j,y; 00362 00363 for (j=0;j<n;j++) { 00364 op[0] = 255; 00365 op[1] = ((ip[0]*UYVY_YNORM_INV)>>16L) + 16L; 00366 op[2] = op[3] = 128; 00367 ip+=1; 00368 op+=4; 00369 } 00370 }
Copyright © 2008, Cycling '74