* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+
/**
* @file qcelpdec.c
* QCELP decoder
#undef NDEBUG
#include <assert.h>
-static void weighted_vector_sumf(float *out,
- const float *in_a,
- const float *in_b,
- float weight_coeff_a,
- float weight_coeff_b,
- int length) {
- int i;
+static void weighted_vector_sumf(float *out, const float *in_a,
+ const float *in_b, float weight_coeff_a,
+ float weight_coeff_b, int length)
+{
+ int i;
- for (i = 0; i < length; i++)
+ for(i=0; i<length; i++)
out[i] = weight_coeff_a * in_a[i]
+ weight_coeff_b * in_b[i];
}
*
* @return filter output vector
*/
-static const float *do_pitchfilter(float memory[303],
- const float v_in[160],
- const float gain[4],
- const uint8_t *lag,
- const uint8_t pfrac[4]) {
+static const float *do_pitchfilter(float memory[303], const float v_in[160],
+ const float gain[4], const uint8_t *lag,
+ const uint8_t pfrac[4])
+{
int i, j;
float *v_lag, *v_out;
const float *v_len;
v_out = memory + 143; // Output vector starts at memory[143].
- for (i = 0; i < 4; i++)
- if (gain[i]) {
+ for(i=0; i<4; i++)
+ {
+ if(gain[i])
+ {
v_lag = memory + 143 + 40 * i - lag[i];
- for (v_len = v_in + 40; v_in < v_len; v_in++) {
- if (pfrac[i]) { // If it is a fractional lag...
- for (j = 0, *v_out = 0.; j < 4; j++)
+ for(v_len=v_in+40; v_in<v_len; v_in++)
+ {
+ if(pfrac[i]) // If it is a fractional lag...
+ {
+ for(j=0, *v_out=0.; j<4; j++)
*v_out += qcelp_hammsinc_table[j] * (v_lag[j-4] + v_lag[3-j]);
- } else
+ }else
*v_out = *v_lag;
*v_out = *v_in + gain[i] * *v_out;
v_lag++;
v_out++;
}
- } else {
+ }else
+ {
memcpy(v_out, v_in, 40 * sizeof(float));
v_in += 40;
v_out += 40;
}
+ }
memmove(memory, memory + 160, 143 * sizeof(float));
return memory + 143;
* @param lpc float vector for the resulting LPC
* @param subframe_num frame number in decoded stream
*/
-void interpolate_lpc(QCELPContext *q,
- const float *curr_lspf,
- float *lpc,
- const int subframe_num) {
+void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc,
+ const int subframe_num)
+{
float interpolated_lspf[10];
float weight;
- if (q->framerate >= RATE_QUARTER) {
+ if(q->framerate >= RATE_QUARTER)
weight = 0.25 * (subframe_num + 1);
- } else if (q->framerate == RATE_OCTAVE && !subframe_num) {
+ else if(q->framerate == RATE_OCTAVE && !subframe_num)
weight = 0.625;
- } else {
+ else
weight = 1.0;
- }
- if (weight != 1.0) {
- weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf, weight, 1.0 - weight, 10);
+ if(weight != 1.0)
+ {
+ weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
+ weight, 1.0 - weight, 10);
qcelp_lspf2lpc(interpolated_lspf, lpc);
- } else if (q->framerate >= RATE_QUARTER || (q->framerate == I_F_Q && !subframe_num))
+ }else if(q->framerate >= RATE_QUARTER || (q->framerate == I_F_Q && !subframe_num))
qcelp_lspf2lpc(curr_lspf, lpc);
}
-static int buf_size2framerate(const int buf_size) {
- switch (buf_size) {
- case 35:
- return RATE_FULL;
- case 17:
- return RATE_HALF;
- case 8:
- return RATE_QUARTER;
- case 4:
- return RATE_OCTAVE;
- case 1:
- return SILENCE;
+static int buf_size2framerate(const int buf_size)
+{
+ switch(buf_size)
+ {
+ case 35:
+ return RATE_FULL;
+ case 17:
+ return RATE_HALF;
+ case 8:
+ return RATE_QUARTER;
+ case 4:
+ return RATE_OCTAVE;
+ case 1:
+ return SILENCE;
}
+
return -1;
}
static void warn_insufficient_frame_quality(AVCodecContext *avctx,
- const char *message) {
- av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number, message);
+ const char *message)
+{
+ av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number,
+ message);
}
AVCodec qcelp_decoder =