00001 #ifndef VIDEOVISUAL_DEFS_H
00002 #define VIDEOVISUAL_DEFS_H
00003
00004 #include <cmath>
00005
00006 class LogScale
00007 {
00008 public:
00009 LogScale(int maxscale = 0, int maxrange = 0)
00010 : indices(0), s(0), r(0)
00011 {
00012 setMax(maxscale, maxrange);
00013 }
00014
00015 ~LogScale()
00016 {
00017 if (indices)
00018 delete [] indices;
00019 }
00020
00021 int scale() const { return s; }
00022 int range() const { return r; }
00023
00024 void setMax(int maxscale, int maxrange)
00025 {
00026 if (maxscale == 0 || maxrange == 0)
00027 return;
00028
00029 s = maxscale;
00030 r = maxrange;
00031
00032 if (indices)
00033 delete [] indices;
00034
00035 double alpha;
00036 int i, scaled;
00037 long double domain = (long double) maxscale;
00038 long double range = (long double) maxrange;
00039 long double x = 1.0;
00040 long double dx = 1.0;
00041 long double y = 0.0;
00042 long double yy = 0.0;
00043 long double t = 0.0;
00044 long double e4 = 1.0E-8;
00045
00046 indices = new int[maxrange];
00047 for (i = 0; i < maxrange; i++)
00048 indices[i] = 0;
00049
00050
00051 for (uint i = 0; i < 10000 && (std::abs(dx) > e4); i++)
00052 {
00053 t = std::log((domain + x) / x);
00054 y = (x * t) - range;
00055 yy = t - (domain / (x + domain));
00056 dx = y / yy;
00057 x -= dx;
00058 }
00059
00060 alpha = x;
00061 for (i = 1; i < (int) domain; i++)
00062 {
00063 scaled = (int) floor(0.5 + (alpha * log((double(i) + alpha) / alpha)));
00064 if (scaled < 1)
00065 scaled = 1;
00066 if (indices[scaled - 1] < i)
00067 indices[scaled - 1] = i;
00068 }
00069 }
00070
00071 int operator[](int index) const
00072 {
00073 return indices[index];
00074 }
00075
00076
00077 private:
00078 int *indices;
00079 int s, r;
00080 };
00081
00082 static inline void stereo16_from_stereopcm8(register short *l,
00083 register short *r,
00084 register uchar *c,
00085 long cnt)
00086 {
00087 while (cnt >= 4l)
00088 {
00089 l[0] = c[0];
00090 r[0] = c[1];
00091 l[1] = c[2];
00092 r[1] = c[3];
00093 l[2] = c[4];
00094 r[2] = c[5];
00095 l[3] = c[6];
00096 r[3] = c[7];
00097 l += 4;
00098 r += 4;
00099 c += 8;
00100 cnt -= 4l;
00101 }
00102
00103 if (cnt > 0l)
00104 {
00105 l[0] = c[0];
00106 r[0] = c[1];
00107 if (cnt > 1l)
00108 {
00109 l[1] = c[2];
00110 r[1] = c[3];
00111 if (cnt > 2l)
00112 {
00113 l[2] = c[4];
00114 r[2] = c[5];
00115 }
00116 }
00117 }
00118 }
00119
00120 static inline void stereo16_from_stereopcm16(register short *l,
00121 register short *r,
00122 register short *s,
00123 long cnt)
00124 {
00125 while (cnt >= 4l)
00126 {
00127 l[0] = s[0];
00128 r[0] = s[1];
00129 l[1] = s[2];
00130 r[1] = s[3];
00131 l[2] = s[4];
00132 r[2] = s[5];
00133 l[3] = s[6];
00134 r[3] = s[7];
00135 l += 4;
00136 r += 4;
00137 s += 8;
00138 cnt -= 4l;
00139 }
00140
00141 if (cnt > 0l)
00142 {
00143 l[0] = s[0];
00144 r[0] = s[1];
00145 if (cnt > 1l)
00146 {
00147 l[1] = s[2];
00148 r[1] = s[3];
00149 if (cnt > 2l)
00150 {
00151 l[2] = s[4];
00152 r[2] = s[5];
00153 }
00154 }
00155 }
00156 }
00157
00158 static inline void mono16_from_monopcm8(register short *l,
00159 register uchar *c,
00160 long cnt)
00161 {
00162 while (cnt >= 4l)
00163 {
00164 l[0] = c[0];
00165 l[1] = c[1];
00166 l[2] = c[2];
00167 l[3] = c[3];
00168 l += 4;
00169 c += 4;
00170 cnt -= 4l;
00171 }
00172
00173 if (cnt > 0l)
00174 {
00175 l[0] = c[0];
00176 if (cnt > 1l)
00177 {
00178 l[1] = c[1];
00179 if (cnt > 2l)
00180 {
00181 l[2] = c[2];
00182 }
00183 }
00184 }
00185 }
00186
00187 static inline void mono16_from_monopcm16(register short *l,
00188 register short *s,
00189 long cnt)
00190 {
00191 while (cnt >= 4l)
00192 {
00193 l[0] = s[0];
00194 l[1] = s[1];
00195 l[2] = s[2];
00196 l[3] = s[3];
00197 l += 4;
00198 s += 4;
00199 cnt -= 4l;
00200 }
00201
00202 if (cnt > 0l)
00203 {
00204 l[0] = s[0];
00205 if (cnt > 1l)
00206 {
00207 l[1] = s[1];
00208 if (cnt > 2l)
00209 {
00210 l[2] = s[2];
00211 }
00212 }
00213 }
00214 }
00215
00216 #ifdef FFTW3_SUPPORT
00217
00218 #include <complex>
00219 extern "C" {
00220 #include <fftw3.h>
00221 #define myth_fftw_float double
00222 #define fftw_real myth_fftw_float
00223 #define myth_fftw_complex std::complex<myth_fftw_float>
00224 #if (myth_fftw_float == double)
00225 #define myth_fftw_complex_cast fftw_complex
00226 #elif (myth_fftw_float == float)
00227 #define myth_fftw_complex_cast fftwf_complex
00228 #endif
00229 }
00230
00231 static inline void fast_short_set(register short *p,
00232 short v,
00233 long c)
00234 {
00235 while (c >= 4l) {
00236 p[0] = v;
00237 p[1] = v;
00238 p[2] = v;
00239 p[3] = v;
00240 p += 4;
00241 c -= 4l;
00242 }
00243
00244 if (c > 0l) {
00245 p[0] = v;
00246 if (c > 1l) {
00247 p[1] = v;
00248 if (c > 2l) {
00249 p[2] = v;
00250 }
00251 }
00252 }
00253 }
00254
00255 static inline void fast_real_set_from_short(register fftw_real *d,
00256 register short *s,
00257 long c)
00258 {
00259 while (c >= 4l) {
00260 d[0] = fftw_real(s[0]);
00261 d[1] = fftw_real(s[1]);
00262 d[2] = fftw_real(s[2]);
00263 d[3] = fftw_real(s[3]);
00264 d += 4;
00265 s += 4;
00266 c -= 4l;
00267 }
00268
00269 if (c > 0l) {
00270 d[0] = fftw_real(s[0]);
00271 if (c > 1l) {
00272 d[1] = fftw_real(s[1]);
00273 if (c > 2l) {
00274 d[2] = fftw_real(s[2]);
00275 }
00276 }
00277 }
00278 }
00279
00280 static inline void fast_reals_set(register fftw_real *p1,
00281 register fftw_real *p2,
00282 fftw_real v,
00283 long c)
00284 {
00285 while (c >= 4l) {
00286 p1[0] = v;
00287 p1[1] = v;
00288 p1[2] = v;
00289 p1[3] = v;
00290 p2[0] = v;
00291 p2[1] = v;
00292 p2[2] = v;
00293 p2[3] = v;
00294 p1 += 4;
00295 p2 += 4;
00296 c -= 4l;
00297 }
00298
00299 if (c > 0l) {
00300 p1[0] = v;
00301 p2[0] = v;
00302 if (c > 1l) {
00303 p1[1] = v;
00304 p2[1] = v;
00305 if (c > 2l) {
00306 p1[2] = v;
00307 p2[2] = v;
00308 }
00309 }
00310 }
00311 }
00312
00313 #endif // FFTW3_SUPPORT
00314 #endif // VIDEOVISUAL_DEFS_H