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