Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
rgbtoycc.c
Go to the documentation of this file.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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076 #include "all.h"
00077 #include "frame.h"
00078 #include "fsize.h"
00079 #include "rgbtoycc.h"
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 void
00099 PNMtoYUV(frame)
00100 MpegFrame *frame;
00101 {
00102 register int x, y;
00103 register uint8 *dy0, *dy1;
00104 register uint8 *dcr, *dcb;
00105 register xel *src0, *src1;
00106 register int ydivisor, cdivisor;
00107 static boolean first = TRUE;
00108 static float mult299[1024], mult587[1024], mult114[1024];
00109 static float mult16874[1024], mult33126[1024], mult5[1024];
00110 static float mult41869[1024], mult08131[1024];
00111
00112 if ( first ) {
00113 register int index;
00114 register int maxValue;
00115
00116 maxValue = frame->rgb_maxval;
00117
00118 for ( index = 0; index <= maxValue; index++ ) {
00119 mult299[index] = index*0.29900;
00120 mult587[index] = index*0.58700;
00121 mult114[index] = index*0.11400;
00122 mult16874[index] = -0.16874*index;
00123 mult33126[index] = -0.33126*index;
00124 mult5[index] = index*0.50000;
00125 mult41869[index] = -0.41869*index;
00126 mult08131[index] = -0.08131*index;
00127 }
00128
00129 first = FALSE;
00130 }
00131
00132 Frame_AllocYCC(frame);
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 ydivisor = (frame->rgb_maxval + 1) >> 8;
00147
00148 cdivisor = (ydivisor << 2);
00149
00150 for (y = 0; y < Fsize_y; y += 2) {
00151 for (x = 0, src0 = frame->rgb_data[y], src1 = frame->rgb_data[y + 1],
00152 dy0 = frame->orig_y[y], dy1 = frame->orig_y[y + 1],
00153 dcr = frame->orig_cr[y >> 1], dcb = frame->orig_cb[y >> 1];
00154 x < Fsize_x;
00155 x += 2, dy0 += 2, dy1 += 2, dcr++,
00156 dcb++, src0 += 2, src1 += 2) {
00157
00158 *dy0 = (mult299[PPM_GETR(*src0)] +
00159 mult587[PPM_GETG(*src0)] +
00160 mult114[PPM_GETB(*src0)]) / ydivisor;
00161
00162 *dy1 = (mult299[PPM_GETR(*src1)] +
00163 mult587[PPM_GETG(*src1)] +
00164 mult114[PPM_GETB(*src1)]) / ydivisor;
00165
00166 dy0[1] = (mult299[PPM_GETR(src0[1])] +
00167 mult587[PPM_GETG(src0[1])] +
00168 mult114[PPM_GETB(src0[1])]) / ydivisor;
00169
00170 dy1[1] = (mult299[PPM_GETR(src1[1])] +
00171 mult587[PPM_GETG(src1[1])] +
00172 mult114[PPM_GETB(src1[1])]) / ydivisor;
00173
00174 *dcb = ((mult16874[PPM_GETR(*src0)] +
00175 mult33126[PPM_GETG(*src0)] +
00176 mult5[PPM_GETB(*src0)] +
00177 mult16874[PPM_GETR(*src1)] +
00178 mult33126[PPM_GETG(*src1)] +
00179 mult5[PPM_GETB(*src1)] +
00180 mult16874[PPM_GETR(src0[1])] +
00181 mult33126[PPM_GETG(src0[1])] +
00182 mult5[PPM_GETB(src0[1])] +
00183 mult16874[PPM_GETR(src1[1])] +
00184 mult33126[PPM_GETG(src1[1])] +
00185 mult5[PPM_GETB(src1[1])]) / cdivisor) + 128;
00186
00187 *dcr = ((mult5[PPM_GETR(*src0)] +
00188 mult41869[PPM_GETG(*src0)] +
00189 mult08131[PPM_GETB(*src0)] +
00190 mult5[PPM_GETR(*src1)] +
00191 mult41869[PPM_GETG(*src1)] +
00192 mult08131[PPM_GETB(*src1)] +
00193 mult5[PPM_GETR(src0[1])] +
00194 mult41869[PPM_GETG(src0[1])] +
00195 mult08131[PPM_GETB(src0[1])] +
00196 mult5[PPM_GETR(src1[1])] +
00197 mult41869[PPM_GETG(src1[1])] +
00198 mult08131[PPM_GETB(src1[1])]) / cdivisor) + 128;
00199
00200
00201
00202
00203 #ifdef BLEAH
00204 *dy0 = (PPM_GETR(*src0) * 0.29900 +
00205 PPM_GETG(*src0) * 0.58700 +
00206 PPM_GETB(*src0) * 0.11400) / ydivisor;
00207 *dy1 = (PPM_GETR(*src1) * 0.29900 +
00208 PPM_GETG(*src1) * 0.58700 +
00209 PPM_GETB(*src1) * 0.11400) / ydivisor;
00210
00211 dy0[1] = (PPM_GETR(src0[1]) * 0.29900 +
00212 PPM_GETG(src0[1]) * 0.58700 +
00213 PPM_GETB(src0[1]) * 0.11400) / ydivisor;
00214
00215 dy1[1] = (PPM_GETR(src1[1]) * 0.29900 +
00216 PPM_GETG(src1[1]) * 0.58700 +
00217 PPM_GETB(src1[1]) * 0.11400) / ydivisor;
00218
00219 *dcb = ((PPM_GETR(*src0) * -0.16874 +
00220 PPM_GETG(*src0) * -0.33126 +
00221 PPM_GETB(*src0) * 0.50000 +
00222 PPM_GETR(*src1) * -0.16874 +
00223 PPM_GETG(*src1) * -0. +
00224 PPM_GETB(*src1) * 0.50000 +
00225 PPM_GETR(src0[1]) * -0.16874 +
00226 PPM_GETG(src0[1]) * -0.33126 +
00227 PPM_GETB(src0[1]) * 0.50000 +
00228 PPM_GETR(src1[1]) * -0.16874 +
00229 PPM_GETG(src1[1]) * -0.33126 +
00230 PPM_GETB(src1[1]) * 0.50000) / cdivisor) + 128;
00231
00232 *dcr = ((PPM_GETR(*src0) * 0.50000 +
00233 PPM_GETG(*src0) * -0.41869 +
00234 PPM_GETB(*src0) * -0.08131 +
00235 PPM_GETR(*src1) * 0.50000 +
00236 PPM_GETG(*src1) * -0.41869 +
00237 PPM_GETB(*src1) * -0.08131 +
00238 PPM_GETR(src0[1]) * 0.50000 +
00239 PPM_GETG(src0[1]) * -0.41869 +
00240 PPM_GETB(src0[1]) * -0.08131 +
00241 PPM_GETR(src1[1]) * 0.50000 +
00242 PPM_GETG(src1[1]) * -0.41869 +
00243 PPM_GETB(src1[1]) * -0.08131) / cdivisor) + 128;
00244 #endif
00245
00246 DBG_PRINT(("%3d,%3d: (%3d,%3d,%3d) --> (%3d,%3d,%3d)\n", x, y, PPM_GETR(*src0), PPM_GETG(*src0), PPM_GETB(*src0), *dy0, *dcb, *dcr));
00247 }
00248 }
00249 }
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 void
00267 PPMtoYUV(frame)
00268 MpegFrame *frame;
00269 {
00270 register int x, y;
00271 register uint8 *dy0, *dy1;
00272 register uint8 *dcr, *dcb;
00273 register uint8 *src0, *src1;
00274 register int cdivisor;
00275 static boolean first = TRUE;
00276 static float mult299[1024], mult587[1024], mult114[1024];
00277 static float mult16874[1024], mult33126[1024], mult5[1024];
00278 static float mult41869[1024], mult08131[1024];
00279
00280 if ( first ) {
00281 register int index;
00282 register int maxValue;
00283
00284 maxValue = frame->rgb_maxval;
00285
00286 for ( index = 0; index <= maxValue; index++ ) {
00287 mult299[index] = index*0.29900;
00288 mult587[index] = index*0.58700;
00289 mult114[index] = index*0.11400;
00290 mult16874[index] = -0.16874*index;
00291 mult33126[index] = -0.33126*index;
00292 mult5[index] = index*0.50000;
00293 mult41869[index] = -0.41869*index;
00294 mult08131[index] = -0.08131*index;
00295 }
00296
00297 first = FALSE;
00298 }
00299
00300 Frame_AllocYCC(frame);
00301
00302
00303 if ( frame->rgb_maxval != 255 ) {
00304 fprintf(stderr, "PPM max gray value != 255. Exiting.\n\tTry PNM type, not PPM\n");
00305 exit(1);
00306 }
00307
00308 cdivisor = 4;
00309
00310 for (y = 0; y < Fsize_y; y += 2) {
00311 src0 = frame->ppm_data[y];
00312 src1 = frame->ppm_data[y + 1];
00313 dy0 = frame->orig_y[y];
00314 dy1 = frame->orig_y[y + 1];
00315 dcr = frame->orig_cr[y >> 1];
00316 dcb = frame->orig_cb[y >> 1];
00317
00318 for ( x = 0; x < Fsize_x; x += 2, dy0 += 2, dy1 += 2, dcr++,
00319 dcb++, src0 += 6, src1 += 6) {
00320 *dy0 = (mult299[*src0] +
00321 mult587[src0[1]] +
00322 mult114[src0[2]]);
00323
00324 *dy1 = (mult299[*src1] +
00325 mult587[src1[1]] +
00326 mult114[src1[2]]);
00327
00328 dy0[1] = (mult299[src0[3]] +
00329 mult587[src0[4]] +
00330 mult114[src0[5]]);
00331
00332 dy1[1] = (mult299[src1[3]] +
00333 mult587[src1[4]] +
00334 mult114[src1[5]]);
00335
00336 *dcb = ((mult16874[*src0] +
00337 mult33126[src0[1]] +
00338 mult5[src0[2]] +
00339 mult16874[*src1] +
00340 mult33126[src1[1]] +
00341 mult5[src1[2]] +
00342 mult16874[src0[3]] +
00343 mult33126[src0[4]] +
00344 mult5[src0[5]] +
00345 mult16874[src1[3]] +
00346 mult33126[src1[4]] +
00347 mult5[src1[5]]) / cdivisor) + 128;
00348
00349 *dcr = ((mult5[*src0] +
00350 mult41869[src0[1]] +
00351 mult08131[src0[2]] +
00352 mult5[*src1] +
00353 mult41869[src1[1]] +
00354 mult08131[src1[2]] +
00355 mult5[src0[3]] +
00356 mult41869[src0[4]] +
00357 mult08131[src0[5]] +
00358 mult5[src1[3]] +
00359 mult41869[src1[4]] +
00360 mult08131[src1[5]]) / cdivisor) + 128;
00361
00362 DBG_PRINT(("%3d,%3d: (%3d,%3d,%3d) --> (%3d,%3d,%3d)\n", x, y, PPM_GETR(*src0), PPM_GETG(*src0), PPM_GETB(*src0), *dy0, *dcb, *dcr));
00363 }
00364 }
00365 }
00366