| 2117 | |
| 2118 | |
| 2119 | template<typename T> static void |
| 2120 | IDCT( const T* src, int src_step, T* dft_src, T* dft_dst, T* dst, int dst_step, |
| 2121 | int n, int nf, int* factors, const int* itab, const Complex<T>* dft_wave, |
| 2122 | const Complex<T>* dct_wave, const void* spec, Complex<T>* buf ) |
| 2123 | { |
| 2124 | static const T sin_45 = (T)0.70710678118654752440084436210485; |
| 2125 | int j, n2 = n >> 1; |
| 2126 | |
| 2127 | src_step /= sizeof(src[0]); |
| 2128 | dst_step /= sizeof(dst[0]); |
| 2129 | const T* src1 = src + (n-1)*src_step; |
| 2130 | |
| 2131 | if( n == 1 ) |
| 2132 | { |
| 2133 | dst[0] = src[0]; |
| 2134 | return; |
| 2135 | } |
| 2136 | |
| 2137 | dft_src[0] = (T)(src[0]*2*dct_wave->re*sin_45); |
| 2138 | src += src_step; |
| 2139 | for( j = 1, dct_wave++; j < n2; j++, dct_wave++, |
| 2140 | src += src_step, src1 -= src_step ) |
| 2141 | { |
| 2142 | T t0 = dct_wave->re*src[0] - dct_wave->im*src1[0]; |
| 2143 | T t1 = -dct_wave->im*src[0] - dct_wave->re*src1[0]; |
| 2144 | dft_src[j*2-1] = t0; |
| 2145 | dft_src[j*2] = t1; |
| 2146 | } |
| 2147 | |
| 2148 | dft_src[n-1] = (T)(src[0]*2*dct_wave->re); |
| 2149 | CCSIDFT( dft_src, dft_dst, n, nf, factors, itab, |
| 2150 | dft_wave, n, spec, buf, 0, 1.0 ); |
| 2151 | |
| 2152 | for( j = 0; j < n2; j++, dst += dst_step*2 ) |
| 2153 | { |
| 2154 | dst[0] = dft_dst[j]; |
| 2155 | dst[dst_step] = dft_dst[n-j-1]; |
| 2156 | } |
| 2157 | } |
| 2158 | |
| 2159 | |
| 2160 | static void |