comparison resample2.c @ 4702:a8794f26ea98 libavcodec

AUDIOPHILE_KIDDY_MODE
author michael
date Thu, 22 Mar 2007 03:16:02 +0000
parents 5fa551fb7640
children 07f7ca450695
comparison
equal deleted inserted replaced
4701:5fa551fb7640 4702:a8794f26ea98
33 #ifndef CONFIG_RESAMPLE_HP 33 #ifndef CONFIG_RESAMPLE_HP
34 #define FILTER_SHIFT 15 34 #define FILTER_SHIFT 15
35 35
36 #define FELEM int16_t 36 #define FELEM int16_t
37 #define FELEM2 int32_t 37 #define FELEM2 int32_t
38 #define FELEML int64_t
38 #define FELEM_MAX INT16_MAX 39 #define FELEM_MAX INT16_MAX
39 #define FELEM_MIN INT16_MIN 40 #define FELEM_MIN INT16_MIN
40 #define WINDOW_TYPE 9 41 #define WINDOW_TYPE 9
41 #else 42 #elif !defined(CONFIG_RESAMPLE_AUDIOPHILE_KIDDY_MODE)
42 #define FILTER_SHIFT 30 43 #define FILTER_SHIFT 30
43 44
44 #define FELEM int32_t 45 #define FELEM int32_t
45 #define FELEM2 int64_t 46 #define FELEM2 int64_t
47 #define FELEML int64_t
46 #define FELEM_MAX INT32_MAX 48 #define FELEM_MAX INT32_MAX
47 #define FELEM_MIN INT32_MIN 49 #define FELEM_MIN INT32_MIN
48 #define WINDOW_TYPE 12 50 #define WINDOW_TYPE 12
51 #else
52 #define FILTER_SHIFT 0
53
54 #define FELEM long double
55 #define FELEM2 long double
56 #define FELEML long double
57 #define WINDOW_TYPE 24
49 #endif 58 #endif
50 59
51 60
52 typedef struct AVResampleContext{ 61 typedef struct AVResampleContext{
53 FELEM *filter_bank; 62 FELEM *filter_bank;
121 norm += y; 130 norm += y;
122 } 131 }
123 132
124 /* normalize so that an uniform color remains the same */ 133 /* normalize so that an uniform color remains the same */
125 for(i=0;i<tap_count;i++) { 134 for(i=0;i<tap_count;i++) {
126 v = av_clip(lrintf(tab[i] * scale / norm), FELEM_MIN, FELEM_MAX); 135 #ifdef CONFIG_RESAMPLE_AUDIOPHILE_KIDDY_MODE
127 filter[ph * tap_count + i] = v; 136 filter[ph * tap_count + i] = tab[i] / norm;
137 #else
138 filter[ph * tap_count + i] = av_clip(lrintf(tab[i] * scale / norm), FELEM_MIN, FELEM_MAX);
139 #endif
128 } 140 }
129 } 141 }
130 #if 0 142 #if 0
131 { 143 {
132 #define LEN 1024 144 #define LEN 1024
154 maxff= FFMAX(maxff, ff); 166 maxff= FFMAX(maxff, ff);
155 minff= FFMIN(minff, ff); 167 minff= FFMIN(minff, ff);
156 maxsf= FFMAX(maxsf, sf); 168 maxsf= FFMAX(maxsf, sf);
157 minsf= FFMIN(minsf, sf); 169 minsf= FFMIN(minsf, sf);
158 if(i%11==0){ 170 if(i%11==0){
159 av_log(NULL, AV_LOG_ERROR, "i:%4d ss:%f ff:%f-%f sf:%f-%f\n", i, ss, maxff, minff, maxsf, minsf); 171 av_log(NULL, AV_LOG_ERROR, "i:%4d ss:%f ff:%13.6e-%13.6e sf:%13.6e-%13.6e\n", i, ss, maxff, minff, maxsf, minsf);
160 minff=minsf= 2; 172 minff=minsf= 2;
161 maxff=maxsf= -2; 173 maxff=maxsf= -2;
162 } 174 }
163 } 175 }
164 } 176 }
257 break; 269 break;
258 }else if(c->linear){ 270 }else if(c->linear){
259 int64_t v=0; 271 int64_t v=0;
260 int sub_phase= (frac<<8) / c->src_incr; 272 int sub_phase= (frac<<8) / c->src_incr;
261 for(i=0; i<c->filter_length; i++){ 273 for(i=0; i<c->filter_length; i++){
262 int64_t coeff= filter[i]*(256 - sub_phase) + filter[i + c->filter_length]*sub_phase; 274 FELEML coeff= filter[i]*(256 - sub_phase) + filter[i + c->filter_length]*sub_phase;
263 v += src[sample_index + i] * coeff; 275 v += src[sample_index + i] * coeff;
264 } 276 }
265 val= v>>8; 277 val= v>>8;
266 }else{ 278 }else{
267 for(i=0; i<c->filter_length; i++){ 279 for(i=0; i<c->filter_length; i++){
268 val += src[sample_index + i] * (FELEM2)filter[i]; 280 val += src[sample_index + i] * (FELEM2)filter[i];
269 } 281 }
270 } 282 }
271 283
284 #ifdef CONFIG_RESAMPLE_AUDIOPHILE_KIDDY_MODE
285 dst[dst_index] = av_clip(lrintf(val), -32768, 32767);
286 #else
272 val = (val + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT; 287 val = (val + (1<<(FILTER_SHIFT-1)))>>FILTER_SHIFT;
273 dst[dst_index] = (unsigned)(val + 32768) > 65535 ? (val>>31) ^ 32767 : val; 288 dst[dst_index] = (unsigned)(val + 32768) > 65535 ? (val>>31) ^ 32767 : val;
289 #endif
274 290
275 frac += dst_incr_frac; 291 frac += dst_incr_frac;
276 index += dst_incr; 292 index += dst_incr;
277 if(frac >= c->src_incr){ 293 if(frac >= c->src_incr){
278 frac -= c->src_incr; 294 frac -= c->src_incr;