comparison sipr16k.c @ 11649:e4e4fce64e5d libavcodec

Make the Sipr16k postfilter function write data into the target/output buffer.
author rbultje
date Wed, 21 Apr 2010 17:46:59 +0000
parents ff7c1c90b6f5
children 8b6f3d3b55cb
comparison
equal deleted inserted replaced
11648:0516f4062307 11649:e4e4fce64e5d
92 return 3 * pitch_delay_min + index - 2; 92 return 3 * pitch_delay_min + index - 2;
93 } else 93 } else
94 return 3 * pitch_lag_prev; 94 return 3 * pitch_lag_prev;
95 } 95 }
96 96
97 static void postfilter(float* synth, float* iir_mem, float* filt_mem[2], 97 static void postfilter(float *out_data, float* synth, float* iir_mem,
98 float* mem_preemph) 98 float* filt_mem[2], float* mem_preemph)
99 { 99 {
100 float buf[30 + LP_FILTER_ORDER_16k]; 100 float buf[30 + LP_FILTER_ORDER_16k];
101 float *tmpbuf = buf + LP_FILTER_ORDER_16k; 101 float *tmpbuf = buf + LP_FILTER_ORDER_16k;
102 float s; 102 float s;
103 int i; 103 int i;
112 LP_FILTER_ORDER_16k); 112 LP_FILTER_ORDER_16k);
113 113
114 memcpy(synth - LP_FILTER_ORDER_16k, mem_preemph, 114 memcpy(synth - LP_FILTER_ORDER_16k, mem_preemph,
115 LP_FILTER_ORDER_16k * sizeof(*synth)); 115 LP_FILTER_ORDER_16k * sizeof(*synth));
116 116
117 ff_celp_lp_synthesis_filterf(synth, filt_mem[0], synth, 2*L_SUBFR_16k, 117 ff_celp_lp_synthesis_filterf(synth, filt_mem[0], synth, 30,
118 LP_FILTER_ORDER_16k); 118 LP_FILTER_ORDER_16k);
119 119
120 memcpy(mem_preemph, synth + 2*L_SUBFR_16k - LP_FILTER_ORDER_16k, 120 memcpy(out_data + 30 - LP_FILTER_ORDER_16k,
121 synth + 30 - LP_FILTER_ORDER_16k,
122 LP_FILTER_ORDER_16k * sizeof(*synth));
123
124 ff_celp_lp_synthesis_filterf(out_data + 30, filt_mem[0],
125 synth + 30, 2 * L_SUBFR_16k - 30,
126 LP_FILTER_ORDER_16k);
127
128
129 memcpy(mem_preemph, out_data + 2*L_SUBFR_16k - LP_FILTER_ORDER_16k,
121 LP_FILTER_ORDER_16k * sizeof(*synth)); 130 LP_FILTER_ORDER_16k * sizeof(*synth));
122 131
123 FFSWAP(float *, filt_mem[0], filt_mem[1]); 132 FFSWAP(float *, filt_mem[0], filt_mem[1]);
124 for (i = 0, s = 0; i < 30; i++, s += 1.0/30) 133 for (i = 0, s = 0; i < 30; i++, s += 1.0/30)
125 synth[i] = tmpbuf[i] + s * (synth[i] - tmpbuf[i]); 134 out_data[i] = tmpbuf[i] + s * (synth[i] - tmpbuf[i]);
126 } 135 }
127 136
128 /** 137 /**
129 * Floating point version of ff_acelp_lp_decode(). 138 * Floating point version of ff_acelp_lp_decode().
130 */ 139 */
250 LP_FILTER_ORDER_16k * sizeof(*synth)); 259 LP_FILTER_ORDER_16k * sizeof(*synth));
251 260
252 memmove(ctx->excitation, ctx->excitation + 2 * L_SUBFR_16k, 261 memmove(ctx->excitation, ctx->excitation + 2 * L_SUBFR_16k,
253 (L_INTERPOL+PITCH_MAX) * sizeof(float)); 262 (L_INTERPOL+PITCH_MAX) * sizeof(float));
254 263
255 postfilter(synth, ctx->iir_mem, ctx->filt_mem, ctx->mem_preemph); 264 postfilter(out_data, synth, ctx->iir_mem, ctx->filt_mem, ctx->mem_preemph);
256 265
257 memcpy(ctx->iir_mem, Az[1], LP_FILTER_ORDER_16k * sizeof(float)); 266 memcpy(ctx->iir_mem, Az[1], LP_FILTER_ORDER_16k * sizeof(float));
258 267
259 ctx->dsp.vector_clipf(out_data, synth, -1, 32767./(1<<15), frame_size); 268 ctx->dsp.vector_clipf(out_data, out_data, -1, 32767./(1<<15), frame_size);
260 269
261 } 270 }
262 271
263 void ff_sipr_init_16k(SiprContext *ctx) 272 void ff_sipr_init_16k(SiprContext *ctx)
264 { 273 {