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 
00069 #include <stdlib.h>
00070 #include <stdio.h>
00071 #include "libavutil/common.h"
00072 #include "dsputil.h"
00073 
00074 #define DCTSIZE 8
00075 #define GLOBAL(x) x
00076 #define RIGHT_SHIFT(x, n) ((x) >> (n))
00077 
00078 
00079 
00080 
00081 
00082 #if DCTSIZE != 8
00083   Sorry, this code only copes with 8x8 DCTs. 
00084 #endif
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 #define CONST_BITS  8
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 #if CONST_BITS == 8
00116 #define FIX_0_382683433  ((int32_t)   98)       
00117 #define FIX_0_541196100  ((int32_t)  139)       
00118 #define FIX_0_707106781  ((int32_t)  181)       
00119 #define FIX_1_306562965  ((int32_t)  334)       
00120 #else
00121 #define FIX_0_382683433  FIX(0.382683433)
00122 #define FIX_0_541196100  FIX(0.541196100)
00123 #define FIX_0_707106781  FIX(0.707106781)
00124 #define FIX_1_306562965  FIX(1.306562965)
00125 #endif
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 #ifndef USE_ACCURATE_ROUNDING
00134 #undef DESCALE
00135 #define DESCALE(x,n)  RIGHT_SHIFT(x, n)
00136 #endif
00137 
00138 
00139 
00140 
00141 
00142 
00143 #define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
00144 
00145 static av_always_inline void row_fdct(DCTELEM * data){
00146   int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00147   int tmp10, tmp11, tmp12, tmp13;
00148   int z1, z2, z3, z4, z5, z11, z13;
00149   DCTELEM *dataptr;
00150   int ctr;
00151 
00152   
00153 
00154   dataptr = data;
00155   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00156     tmp0 = dataptr[0] + dataptr[7];
00157     tmp7 = dataptr[0] - dataptr[7];
00158     tmp1 = dataptr[1] + dataptr[6];
00159     tmp6 = dataptr[1] - dataptr[6];
00160     tmp2 = dataptr[2] + dataptr[5];
00161     tmp5 = dataptr[2] - dataptr[5];
00162     tmp3 = dataptr[3] + dataptr[4];
00163     tmp4 = dataptr[3] - dataptr[4];
00164 
00165     
00166 
00167     tmp10 = tmp0 + tmp3;        
00168     tmp13 = tmp0 - tmp3;
00169     tmp11 = tmp1 + tmp2;
00170     tmp12 = tmp1 - tmp2;
00171 
00172     dataptr[0] = tmp10 + tmp11; 
00173     dataptr[4] = tmp10 - tmp11;
00174 
00175     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); 
00176     dataptr[2] = tmp13 + z1;    
00177     dataptr[6] = tmp13 - z1;
00178 
00179     
00180 
00181     tmp10 = tmp4 + tmp5;        
00182     tmp11 = tmp5 + tmp6;
00183     tmp12 = tmp6 + tmp7;
00184 
00185     
00186     z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); 
00187     z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5;    
00188     z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5;    
00189     z3 = MULTIPLY(tmp11, FIX_0_707106781);         
00190 
00191     z11 = tmp7 + z3;            
00192     z13 = tmp7 - z3;
00193 
00194     dataptr[5] = z13 + z2;      
00195     dataptr[3] = z13 - z2;
00196     dataptr[1] = z11 + z4;
00197     dataptr[7] = z11 - z4;
00198 
00199     dataptr += DCTSIZE;         
00200   }
00201 }
00202 
00203 
00204 
00205 
00206 
00207 GLOBAL(void)
00208 ff_fdct_ifast (DCTELEM * data)
00209 {
00210   int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00211   int tmp10, tmp11, tmp12, tmp13;
00212   int z1, z2, z3, z4, z5, z11, z13;
00213   DCTELEM *dataptr;
00214   int ctr;
00215 
00216   row_fdct(data);
00217 
00218   
00219 
00220   dataptr = data;
00221   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00222     tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7];
00223     tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7];
00224     tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6];
00225     tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6];
00226     tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5];
00227     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
00228     tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
00229     tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
00230 
00231     
00232 
00233     tmp10 = tmp0 + tmp3;        
00234     tmp13 = tmp0 - tmp3;
00235     tmp11 = tmp1 + tmp2;
00236     tmp12 = tmp1 - tmp2;
00237 
00238     dataptr[DCTSIZE*0] = tmp10 + tmp11; 
00239     dataptr[DCTSIZE*4] = tmp10 - tmp11;
00240 
00241     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); 
00242     dataptr[DCTSIZE*2] = tmp13 + z1; 
00243     dataptr[DCTSIZE*6] = tmp13 - z1;
00244 
00245     
00246 
00247     tmp10 = tmp4 + tmp5;        
00248     tmp11 = tmp5 + tmp6;
00249     tmp12 = tmp6 + tmp7;
00250 
00251     
00252     z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); 
00253     z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; 
00254     z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; 
00255     z3 = MULTIPLY(tmp11, FIX_0_707106781); 
00256 
00257     z11 = tmp7 + z3;            
00258     z13 = tmp7 - z3;
00259 
00260     dataptr[DCTSIZE*5] = z13 + z2; 
00261     dataptr[DCTSIZE*3] = z13 - z2;
00262     dataptr[DCTSIZE*1] = z11 + z4;
00263     dataptr[DCTSIZE*7] = z11 - z4;
00264 
00265     dataptr++;                  
00266   }
00267 }
00268 
00269 
00270 
00271 
00272 
00273 GLOBAL(void)
00274 ff_fdct_ifast248 (DCTELEM * data)
00275 {
00276   int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
00277   int tmp10, tmp11, tmp12, tmp13;
00278   int z1;
00279   DCTELEM *dataptr;
00280   int ctr;
00281 
00282   row_fdct(data);
00283 
00284   
00285 
00286   dataptr = data;
00287   for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
00288     tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
00289     tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
00290     tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
00291     tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
00292     tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
00293     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
00294     tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
00295     tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
00296 
00297     
00298 
00299     tmp10 = tmp0 + tmp3;
00300     tmp11 = tmp1 + tmp2;
00301     tmp12 = tmp1 - tmp2;
00302     tmp13 = tmp0 - tmp3;
00303 
00304     dataptr[DCTSIZE*0] = tmp10 + tmp11;
00305     dataptr[DCTSIZE*4] = tmp10 - tmp11;
00306 
00307     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00308     dataptr[DCTSIZE*2] = tmp13 + z1;
00309     dataptr[DCTSIZE*6] = tmp13 - z1;
00310 
00311     tmp10 = tmp4 + tmp7;
00312     tmp11 = tmp5 + tmp6;
00313     tmp12 = tmp5 - tmp6;
00314     tmp13 = tmp4 - tmp7;
00315 
00316     dataptr[DCTSIZE*1] = tmp10 + tmp11;
00317     dataptr[DCTSIZE*5] = tmp10 - tmp11;
00318 
00319     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781);
00320     dataptr[DCTSIZE*3] = tmp13 + z1;
00321     dataptr[DCTSIZE*7] = tmp13 - z1;
00322 
00323     dataptr++;                        
00324   }
00325 }
00326 
00327 
00328 #undef GLOBAL
00329 #undef CONST_BITS
00330 #undef DESCALE
00331 #undef FIX_0_541196100
00332 #undef FIX_1_306562965