FFmpeg
qcelpdec.c
Go to the documentation of this file.
1 /*
2  * QCELP decoder
3  * Copyright (c) 2007 Reynaldo H. Verdejo Pinochet
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * QCELP decoder
25  * @author Reynaldo H. Verdejo Pinochet
26  * @remark FFmpeg merging spearheaded by Kenan Gillet
27  * @remark Development mentored by Benjamin Larson
28  */
29 
30 #include <stddef.h>
31 
32 #include "libavutil/avassert.h"
34 #include "libavutil/float_dsp.h"
35 #include "avcodec.h"
36 #include "internal.h"
37 #include "get_bits.h"
38 #include "qcelpdata.h"
39 #include "celp_filters.h"
40 #include "acelp_filters.h"
41 #include "acelp_vectors.h"
42 #include "lsp.h"
43 
44 typedef enum {
45  I_F_Q = -1, /**< insufficient frame quality */
52 
53 typedef struct QCELPContext {
56  QCELPFrame frame; /**< unpacked data frame */
57 
59  uint8_t octave_count; /**< count the consecutive RATE_OCTAVE frames */
60  float prev_lspf[10];
61  float predictor_lspf[10];/**< LSP predictor for RATE_OCTAVE and I_F_Q */
64  float rnd_fir_filter_mem[180];
65  float formant_mem[170];
67  int prev_g1[2];
69  float pitch_gain[4];
71  uint16_t first16bits;
73 
74  /* postfilter */
78 } QCELPContext;
79 
80 /**
81  * Initialize the speech codec according to the specification.
82  *
83  * TIA/EIA/IS-733 2.4.9
84  */
86 {
87  QCELPContext *q = avctx->priv_data;
88  int i;
89 
90  avctx->channels = 1;
93 
94  for (i = 0; i < 10; i++)
95  q->prev_lspf[i] = (i + 1) / 11.0;
96 
97  return 0;
98 }
99 
100 /**
101  * Decode the 10 quantized LSP frequencies from the LSPV/LSP
102  * transmission codes of any bitrate and check for badly received packets.
103  *
104  * @param q the context
105  * @param lspf line spectral pair frequencies
106  *
107  * @return 0 on success, -1 if the packet is badly received
108  *
109  * TIA/EIA/IS-733 2.4.3.2.6.2-2, 2.4.8.7.3
110  */
111 static int decode_lspf(QCELPContext *q, float *lspf)
112 {
113  int i;
114  float tmp_lspf, smooth, erasure_coeff;
115  const float *predictors;
116 
117  if (q->bitrate == RATE_OCTAVE || q->bitrate == I_F_Q) {
118  predictors = q->prev_bitrate != RATE_OCTAVE &&
119  q->prev_bitrate != I_F_Q ? q->prev_lspf
120  : q->predictor_lspf;
121 
122  if (q->bitrate == RATE_OCTAVE) {
123  q->octave_count++;
124 
125  for (i = 0; i < 10; i++) {
126  q->predictor_lspf[i] =
127  lspf[i] = (q->frame.lspv[i] ? QCELP_LSP_SPREAD_FACTOR
129  predictors[i] * QCELP_LSP_OCTAVE_PREDICTOR +
130  (i + 1) * ((1 - QCELP_LSP_OCTAVE_PREDICTOR) / 11);
131  }
132  smooth = q->octave_count < 10 ? .875 : 0.1;
133  } else {
134  erasure_coeff = QCELP_LSP_OCTAVE_PREDICTOR;
135 
136  av_assert2(q->bitrate == I_F_Q);
137 
138  if (q->erasure_count > 1)
139  erasure_coeff *= q->erasure_count < 4 ? 0.9 : 0.7;
140 
141  for (i = 0; i < 10; i++) {
142  q->predictor_lspf[i] =
143  lspf[i] = (i + 1) * (1 - erasure_coeff) / 11 +
144  erasure_coeff * predictors[i];
145  }
146  smooth = 0.125;
147  }
148 
149  // Check the stability of the LSP frequencies.
150  lspf[0] = FFMAX(lspf[0], QCELP_LSP_SPREAD_FACTOR);
151  for (i = 1; i < 10; i++)
152  lspf[i] = FFMAX(lspf[i], lspf[i - 1] + QCELP_LSP_SPREAD_FACTOR);
153 
154  lspf[9] = FFMIN(lspf[9], 1.0 - QCELP_LSP_SPREAD_FACTOR);
155  for (i = 9; i > 0; i--)
156  lspf[i - 1] = FFMIN(lspf[i - 1], lspf[i] - QCELP_LSP_SPREAD_FACTOR);
157 
158  // Low-pass filter the LSP frequencies.
159  ff_weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0 - smooth, 10);
160  } else {
161  q->octave_count = 0;
162 
163  tmp_lspf = 0.0;
164  for (i = 0; i < 5; i++) {
165  lspf[2 * i + 0] = tmp_lspf += qcelp_lspvq[i][q->frame.lspv[i]][0] * 0.0001;
166  lspf[2 * i + 1] = tmp_lspf += qcelp_lspvq[i][q->frame.lspv[i]][1] * 0.0001;
167  }
168 
169  // Check for badly received packets.
170  if (q->bitrate == RATE_QUARTER) {
171  if (lspf[9] <= .70 || lspf[9] >= .97)
172  return -1;
173  for (i = 3; i < 10; i++)
174  if (fabs(lspf[i] - lspf[i - 2]) < .08)
175  return -1;
176  } else {
177  if (lspf[9] <= .66 || lspf[9] >= .985)
178  return -1;
179  for (i = 4; i < 10; i++)
180  if (fabs(lspf[i] - lspf[i - 4]) < .0931)
181  return -1;
182  }
183  }
184  return 0;
185 }
186 
187 /**
188  * Convert codebook transmission codes to GAIN and INDEX.
189  *
190  * @param q the context
191  * @param gain array holding the decoded gain
192  *
193  * TIA/EIA/IS-733 2.4.6.2
194  */
195 static void decode_gain_and_index(QCELPContext *q, float *gain)
196 {
197  int i, subframes_count, g1[16];
198  float slope;
199 
200  if (q->bitrate >= RATE_QUARTER) {
201  switch (q->bitrate) {
202  case RATE_FULL: subframes_count = 16; break;
203  case RATE_HALF: subframes_count = 4; break;
204  default: subframes_count = 5;
205  }
206  for (i = 0; i < subframes_count; i++) {
207  g1[i] = 4 * q->frame.cbgain[i];
208  if (q->bitrate == RATE_FULL && !((i + 1) & 3)) {
209  g1[i] += av_clip((g1[i - 1] + g1[i - 2] + g1[i - 3]) / 3 - 6, 0, 32);
210  }
211 
212  gain[i] = qcelp_g12ga[g1[i]];
213 
214  if (q->frame.cbsign[i]) {
215  gain[i] = -gain[i];
216  q->frame.cindex[i] = (q->frame.cindex[i] - 89) & 127;
217  }
218  }
219 
220  q->prev_g1[0] = g1[i - 2];
221  q->prev_g1[1] = g1[i - 1];
222  q->last_codebook_gain = qcelp_g12ga[g1[i - 1]];
223 
224  if (q->bitrate == RATE_QUARTER) {
225  // Provide smoothing of the unvoiced excitation energy.
226  gain[7] = gain[4];
227  gain[6] = 0.4 * gain[3] + 0.6 * gain[4];
228  gain[5] = gain[3];
229  gain[4] = 0.8 * gain[2] + 0.2 * gain[3];
230  gain[3] = 0.2 * gain[1] + 0.8 * gain[2];
231  gain[2] = gain[1];
232  gain[1] = 0.6 * gain[0] + 0.4 * gain[1];
233  }
234  } else if (q->bitrate != SILENCE) {
235  if (q->bitrate == RATE_OCTAVE) {
236  g1[0] = 2 * q->frame.cbgain[0] +
237  av_clip((q->prev_g1[0] + q->prev_g1[1]) / 2 - 5, 0, 54);
238  subframes_count = 8;
239  } else {
240  av_assert2(q->bitrate == I_F_Q);
241 
242  g1[0] = q->prev_g1[1];
243  switch (q->erasure_count) {
244  case 1 : break;
245  case 2 : g1[0] -= 1; break;
246  case 3 : g1[0] -= 2; break;
247  default: g1[0] -= 6;
248  }
249  if (g1[0] < 0)
250  g1[0] = 0;
251  subframes_count = 4;
252  }
253  // This interpolation is done to produce smoother background noise.
254  slope = 0.5 * (qcelp_g12ga[g1[0]] - q->last_codebook_gain) / subframes_count;
255  for (i = 1; i <= subframes_count; i++)
256  gain[i - 1] = q->last_codebook_gain + slope * i;
257 
258  q->last_codebook_gain = gain[i - 2];
259  q->prev_g1[0] = q->prev_g1[1];
260  q->prev_g1[1] = g1[0];
261  }
262 }
263 
264 /**
265  * If the received packet is Rate 1/4 a further sanity check is made of the
266  * codebook gain.
267  *
268  * @param cbgain the unpacked cbgain array
269  * @return -1 if the sanity check fails, 0 otherwise
270  *
271  * TIA/EIA/IS-733 2.4.8.7.3
272  */
274 {
275  int i, diff, prev_diff = 0;
276 
277  for (i = 1; i < 5; i++) {
278  diff = cbgain[i] - cbgain[i-1];
279  if (FFABS(diff) > 10)
280  return -1;
281  else if (FFABS(diff - prev_diff) > 12)
282  return -1;
283  prev_diff = diff;
284  }
285  return 0;
286 }
287 
288 /**
289  * Compute the scaled codebook vector Cdn From INDEX and GAIN
290  * for all rates.
291  *
292  * The specification lacks some information here.
293  *
294  * TIA/EIA/IS-733 has an omission on the codebook index determination
295  * formula for RATE_FULL and RATE_HALF frames at section 2.4.8.1.1. It says
296  * you have to subtract the decoded index parameter from the given scaled
297  * codebook vector index 'n' to get the desired circular codebook index, but
298  * it does not mention that you have to clamp 'n' to [0-9] in order to get
299  * RI-compliant results.
300  *
301  * The reason for this mistake seems to be the fact they forgot to mention you
302  * have to do these calculations per codebook subframe and adjust given
303  * equation values accordingly.
304  *
305  * @param q the context
306  * @param gain array holding the 4 pitch subframe gain values
307  * @param cdn_vector array for the generated scaled codebook vector
308  */
309 static void compute_svector(QCELPContext *q, const float *gain,
310  float *cdn_vector)
311 {
312  int i, j, k;
313  uint16_t cbseed, cindex;
314  float *rnd, tmp_gain, fir_filter_value;
315 
316  switch (q->bitrate) {
317  case RATE_FULL:
318  for (i = 0; i < 16; i++) {
319  tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
320  cindex = -q->frame.cindex[i];
321  for (j = 0; j < 10; j++)
322  *cdn_vector++ = tmp_gain *
323  qcelp_rate_full_codebook[cindex++ & 127];
324  }
325  break;
326  case RATE_HALF:
327  for (i = 0; i < 4; i++) {
328  tmp_gain = gain[i] * QCELP_RATE_HALF_CODEBOOK_RATIO;
329  cindex = -q->frame.cindex[i];
330  for (j = 0; j < 40; j++)
331  *cdn_vector++ = tmp_gain *
332  qcelp_rate_half_codebook[cindex++ & 127];
333  }
334  break;
335  case RATE_QUARTER:
336  cbseed = (0x0003 & q->frame.lspv[4]) << 14 |
337  (0x003F & q->frame.lspv[3]) << 8 |
338  (0x0060 & q->frame.lspv[2]) << 1 |
339  (0x0007 & q->frame.lspv[1]) << 3 |
340  (0x0038 & q->frame.lspv[0]) >> 3;
341  rnd = q->rnd_fir_filter_mem + 20;
342  for (i = 0; i < 8; i++) {
343  tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
344  for (k = 0; k < 20; k++) {
345  cbseed = 521 * cbseed + 259;
346  *rnd = (int16_t) cbseed;
347 
348  // FIR filter
349  fir_filter_value = 0.0;
350  for (j = 0; j < 10; j++)
351  fir_filter_value += qcelp_rnd_fir_coefs[j] *
352  (rnd[-j] + rnd[-20+j]);
353 
354  fir_filter_value += qcelp_rnd_fir_coefs[10] * rnd[-10];
355  *cdn_vector++ = tmp_gain * fir_filter_value;
356  rnd++;
357  }
358  }
359  memcpy(q->rnd_fir_filter_mem, q->rnd_fir_filter_mem + 160,
360  20 * sizeof(float));
361  break;
362  case RATE_OCTAVE:
363  cbseed = q->first16bits;
364  for (i = 0; i < 8; i++) {
365  tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
366  for (j = 0; j < 20; j++) {
367  cbseed = 521 * cbseed + 259;
368  *cdn_vector++ = tmp_gain * (int16_t) cbseed;
369  }
370  }
371  break;
372  case I_F_Q:
373  cbseed = -44; // random codebook index
374  for (i = 0; i < 4; i++) {
375  tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
376  for (j = 0; j < 40; j++)
377  *cdn_vector++ = tmp_gain *
378  qcelp_rate_full_codebook[cbseed++ & 127];
379  }
380  break;
381  case SILENCE:
382  memset(cdn_vector, 0, 160 * sizeof(float));
383  break;
384  }
385 }
386 
387 /**
388  * Apply generic gain control.
389  *
390  * @param v_out output vector
391  * @param v_in gain-controlled vector
392  * @param v_ref vector to control gain of
393  *
394  * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
395  */
396 static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in)
397 {
398  int i;
399 
400  for (i = 0; i < 160; i += 40) {
401  float res = avpriv_scalarproduct_float_c(v_ref + i, v_ref + i, 40);
402  ff_scale_vector_to_given_sum_of_squares(v_out + i, v_in + i, res, 40);
403  }
404 }
405 
406 /**
407  * Apply filter in pitch-subframe steps.
408  *
409  * @param memory buffer for the previous state of the filter
410  * - must be able to contain 303 elements
411  * - the 143 first elements are from the previous state
412  * - the next 160 are for output
413  * @param v_in input filter vector
414  * @param gain per-subframe gain array, each element is between 0.0 and 2.0
415  * @param lag per-subframe lag array, each element is
416  * - between 16 and 143 if its corresponding pfrac is 0,
417  * - between 16 and 139 otherwise
418  * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
419  * otherwise
420  *
421  * @return filter output vector
422  */
423 static const float *do_pitchfilter(float memory[303], const float v_in[160],
424  const float gain[4], const uint8_t *lag,
425  const uint8_t pfrac[4])
426 {
427  int i, j;
428  float *v_lag, *v_out;
429  const float *v_len;
430 
431  v_out = memory + 143; // Output vector starts at memory[143].
432 
433  for (i = 0; i < 4; i++) {
434  if (gain[i]) {
435  v_lag = memory + 143 + 40 * i - lag[i];
436  for (v_len = v_in + 40; v_in < v_len; v_in++) {
437  if (pfrac[i]) { // If it is a fractional lag...
438  for (j = 0, *v_out = 0.0; j < 4; j++)
439  *v_out += qcelp_hammsinc_table[j] *
440  (v_lag[j - 4] + v_lag[3 - j]);
441  } else
442  *v_out = *v_lag;
443 
444  *v_out = *v_in + gain[i] * *v_out;
445 
446  v_lag++;
447  v_out++;
448  }
449  } else {
450  memcpy(v_out, v_in, 40 * sizeof(float));
451  v_in += 40;
452  v_out += 40;
453  }
454  }
455 
456  memmove(memory, memory + 160, 143 * sizeof(float));
457  return memory + 143;
458 }
459 
460 /**
461  * Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
462  * TIA/EIA/IS-733 2.4.5.2, 2.4.8.7.2
463  *
464  * @param q the context
465  * @param cdn_vector the scaled codebook vector
466  */
467 static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
468 {
469  int i;
470  const float *v_synthesis_filtered, *v_pre_filtered;
471 
472  if (q->bitrate >= RATE_HALF || q->bitrate == SILENCE ||
473  (q->bitrate == I_F_Q && (q->prev_bitrate >= RATE_HALF))) {
474 
475  if (q->bitrate >= RATE_HALF) {
476  // Compute gain & lag for the whole frame.
477  for (i = 0; i < 4; i++) {
478  q->pitch_gain[i] = q->frame.plag[i] ? (q->frame.pgain[i] + 1) * 0.25 : 0.0;
479 
480  q->pitch_lag[i] = q->frame.plag[i] + 16;
481  }
482  } else {
483  float max_pitch_gain;
484 
485  if (q->bitrate == I_F_Q) {
486  if (q->erasure_count < 3)
487  max_pitch_gain = 0.9 - 0.3 * (q->erasure_count - 1);
488  else
489  max_pitch_gain = 0.0;
490  } else {
491  av_assert2(q->bitrate == SILENCE);
492  max_pitch_gain = 1.0;
493  }
494  for (i = 0; i < 4; i++)
495  q->pitch_gain[i] = FFMIN(q->pitch_gain[i], max_pitch_gain);
496 
497  memset(q->frame.pfrac, 0, sizeof(q->frame.pfrac));
498  }
499 
500  // pitch synthesis filter
501  v_synthesis_filtered = do_pitchfilter(q->pitch_synthesis_filter_mem,
502  cdn_vector, q->pitch_gain,
503  q->pitch_lag, q->frame.pfrac);
504 
505  // pitch prefilter update
506  for (i = 0; i < 4; i++)
507  q->pitch_gain[i] = 0.5 * FFMIN(q->pitch_gain[i], 1.0);
508 
509  v_pre_filtered = do_pitchfilter(q->pitch_pre_filter_mem,
510  v_synthesis_filtered,
511  q->pitch_gain, q->pitch_lag,
512  q->frame.pfrac);
513 
514  apply_gain_ctrl(cdn_vector, v_synthesis_filtered, v_pre_filtered);
515  } else {
516  memcpy(q->pitch_synthesis_filter_mem,
517  cdn_vector + 17, 143 * sizeof(float));
518  memcpy(q->pitch_pre_filter_mem, cdn_vector + 17, 143 * sizeof(float));
519  memset(q->pitch_gain, 0, sizeof(q->pitch_gain));
520  memset(q->pitch_lag, 0, sizeof(q->pitch_lag));
521  }
522 }
523 
524 /**
525  * Reconstruct LPC coefficients from the line spectral pair frequencies
526  * and perform bandwidth expansion.
527  *
528  * @param lspf line spectral pair frequencies
529  * @param lpc linear predictive coding coefficients
530  *
531  * @note: bandwidth_expansion_coeff could be precalculated into a table
532  * but it seems to be slower on x86
533  *
534  * TIA/EIA/IS-733 2.4.3.3.5
535  */
536 static void lspf2lpc(const float *lspf, float *lpc)
537 {
538  double lsp[10];
539  double bandwidth_expansion_coeff = QCELP_BANDWIDTH_EXPANSION_COEFF;
540  int i;
541 
542  for (i = 0; i < 10; i++)
543  lsp[i] = cos(M_PI * lspf[i]);
544 
545  ff_acelp_lspd2lpc(lsp, lpc, 5);
546 
547  for (i = 0; i < 10; i++) {
548  lpc[i] *= bandwidth_expansion_coeff;
549  bandwidth_expansion_coeff *= QCELP_BANDWIDTH_EXPANSION_COEFF;
550  }
551 }
552 
553 /**
554  * Interpolate LSP frequencies and compute LPC coefficients
555  * for a given bitrate & pitch subframe.
556  *
557  * TIA/EIA/IS-733 2.4.3.3.4, 2.4.8.7.2
558  *
559  * @param q the context
560  * @param curr_lspf LSP frequencies vector of the current frame
561  * @param lpc float vector for the resulting LPC
562  * @param subframe_num frame number in decoded stream
563  */
564 static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
565  float *lpc, const int subframe_num)
566 {
567  float interpolated_lspf[10];
568  float weight;
569 
570  if (q->bitrate >= RATE_QUARTER)
571  weight = 0.25 * (subframe_num + 1);
572  else if (q->bitrate == RATE_OCTAVE && !subframe_num)
573  weight = 0.625;
574  else
575  weight = 1.0;
576 
577  if (weight != 1.0) {
578  ff_weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
579  weight, 1.0 - weight, 10);
580  lspf2lpc(interpolated_lspf, lpc);
581  } else if (q->bitrate >= RATE_QUARTER ||
582  (q->bitrate == I_F_Q && !subframe_num))
583  lspf2lpc(curr_lspf, lpc);
584  else if (q->bitrate == SILENCE && !subframe_num)
585  lspf2lpc(q->prev_lspf, lpc);
586 }
587 
588 static qcelp_packet_rate buf_size2bitrate(const int buf_size)
589 {
590  switch (buf_size) {
591  case 35: return RATE_FULL;
592  case 17: return RATE_HALF;
593  case 8: return RATE_QUARTER;
594  case 4: return RATE_OCTAVE;
595  case 1: return SILENCE;
596  }
597 
598  return I_F_Q;
599 }
600 
601 /**
602  * Determine the bitrate from the frame size and/or the first byte of the frame.
603  *
604  * @param avctx the AV codec context
605  * @param buf_size length of the buffer
606  * @param buf the buffer
607  *
608  * @return the bitrate on success,
609  * I_F_Q if the bitrate cannot be satisfactorily determined
610  *
611  * TIA/EIA/IS-733 2.4.8.7.1
612  */
614  const int buf_size,
615  const uint8_t **buf)
616 {
618 
619  if ((bitrate = buf_size2bitrate(buf_size)) >= 0) {
620  if (bitrate > **buf) {
621  QCELPContext *q = avctx->priv_data;
622  if (!q->warned_buf_mismatch_bitrate) {
623  av_log(avctx, AV_LOG_WARNING,
624  "Claimed bitrate and buffer size mismatch.\n");
626  }
627  bitrate = **buf;
628  } else if (bitrate < **buf) {
629  av_log(avctx, AV_LOG_ERROR,
630  "Buffer is too small for the claimed bitrate.\n");
631  return I_F_Q;
632  }
633  (*buf)++;
634  } else if ((bitrate = buf_size2bitrate(buf_size + 1)) >= 0) {
635  av_log(avctx, AV_LOG_WARNING,
636  "Bitrate byte missing, guessing bitrate from packet size.\n");
637  } else
638  return I_F_Q;
639 
640  if (bitrate == SILENCE) {
641  // FIXME: Remove this warning when tested with samples.
642  avpriv_request_sample(avctx, "Blank frame handling");
643  }
644  return bitrate;
645 }
646 
648  const char *message)
649 {
650  av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n",
651  avctx->frame_number, message);
652 }
653 
654 static void postfilter(QCELPContext *q, float *samples, float *lpc)
655 {
656  static const float pow_0_775[10] = {
657  0.775000, 0.600625, 0.465484, 0.360750, 0.279582,
658  0.216676, 0.167924, 0.130141, 0.100859, 0.078166
659  }, pow_0_625[10] = {
660  0.625000, 0.390625, 0.244141, 0.152588, 0.095367,
661  0.059605, 0.037253, 0.023283, 0.014552, 0.009095
662  };
663  float lpc_s[10], lpc_p[10], pole_out[170], zero_out[160];
664  int n;
665 
666  for (n = 0; n < 10; n++) {
667  lpc_s[n] = lpc[n] * pow_0_625[n];
668  lpc_p[n] = lpc[n] * pow_0_775[n];
669  }
670 
671  ff_celp_lp_zero_synthesis_filterf(zero_out, lpc_s,
672  q->formant_mem + 10, 160, 10);
673  memcpy(pole_out, q->postfilter_synth_mem, sizeof(float) * 10);
674  ff_celp_lp_synthesis_filterf(pole_out + 10, lpc_p, zero_out, 160, 10);
675  memcpy(q->postfilter_synth_mem, pole_out + 160, sizeof(float) * 10);
676 
677  ff_tilt_compensation(&q->postfilter_tilt_mem, 0.3, pole_out + 10, 160);
678 
679  ff_adaptive_gain_control(samples, pole_out + 10,
681  q->formant_mem + 10,
682  160),
683  160, 0.9375, &q->postfilter_agc_mem);
684 }
685 
686 static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
687  int *got_frame_ptr, AVPacket *avpkt)
688 {
689  const uint8_t *buf = avpkt->data;
690  int buf_size = avpkt->size;
691  QCELPContext *q = avctx->priv_data;
692  AVFrame *frame = data;
693  float *outbuffer;
694  int i, ret;
695  float quantized_lspf[10], lpc[10];
696  float gain[16];
697  float *formant_mem;
698 
699  /* get output buffer */
700  frame->nb_samples = 160;
701  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
702  return ret;
703  outbuffer = (float *)frame->data[0];
704 
705  if ((q->bitrate = determine_bitrate(avctx, buf_size, &buf)) == I_F_Q) {
706  warn_insufficient_frame_quality(avctx, "Bitrate cannot be determined.");
707  goto erasure;
708  }
709 
710  if (q->bitrate == RATE_OCTAVE &&
711  (q->first16bits = AV_RB16(buf)) == 0xFFFF) {
712  warn_insufficient_frame_quality(avctx, "Bitrate is 1/8 and first 16 bits are on.");
713  goto erasure;
714  }
715 
716  if (q->bitrate > SILENCE) {
718  const QCELPBitmap *bitmaps_end = qcelp_unpacking_bitmaps_per_rate[q->bitrate] +
720  uint8_t *unpacked_data = (uint8_t *)&q->frame;
721 
722  if ((ret = init_get_bits8(&q->gb, buf, buf_size)) < 0)
723  return ret;
724 
725  memset(&q->frame, 0, sizeof(QCELPFrame));
726 
727  for (; bitmaps < bitmaps_end; bitmaps++)
728  unpacked_data[bitmaps->index] |= get_bits(&q->gb, bitmaps->bitlen) << bitmaps->bitpos;
729 
730  // Check for erasures/blanks on rates 1, 1/4 and 1/8.
731  if (q->frame.reserved) {
732  warn_insufficient_frame_quality(avctx, "Wrong data in reserved frame area.");
733  goto erasure;
734  }
735  if (q->bitrate == RATE_QUARTER &&
737  warn_insufficient_frame_quality(avctx, "Codebook gain sanity check failed.");
738  goto erasure;
739  }
740 
741  if (q->bitrate >= RATE_HALF) {
742  for (i = 0; i < 4; i++) {
743  if (q->frame.pfrac[i] && q->frame.plag[i] >= 124) {
744  warn_insufficient_frame_quality(avctx, "Cannot initialize pitch filter.");
745  goto erasure;
746  }
747  }
748  }
749  }
750 
751  decode_gain_and_index(q, gain);
752  compute_svector(q, gain, outbuffer);
753 
754  if (decode_lspf(q, quantized_lspf) < 0) {
755  warn_insufficient_frame_quality(avctx, "Badly received packets in frame.");
756  goto erasure;
757  }
758 
759  apply_pitch_filters(q, outbuffer);
760 
761  if (q->bitrate == I_F_Q) {
762 erasure:
763  q->bitrate = I_F_Q;
764  q->erasure_count++;
765  decode_gain_and_index(q, gain);
766  compute_svector(q, gain, outbuffer);
767  decode_lspf(q, quantized_lspf);
768  apply_pitch_filters(q, outbuffer);
769  } else
770  q->erasure_count = 0;
771 
772  formant_mem = q->formant_mem + 10;
773  for (i = 0; i < 4; i++) {
774  interpolate_lpc(q, quantized_lspf, lpc, i);
775  ff_celp_lp_synthesis_filterf(formant_mem, lpc,
776  outbuffer + i * 40, 40, 10);
777  formant_mem += 40;
778  }
779 
780  // postfilter, as per TIA/EIA/IS-733 2.4.8.6
781  postfilter(q, outbuffer, lpc);
782 
783  memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
784 
785  memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
786  q->prev_bitrate = q->bitrate;
787 
788  *got_frame_ptr = 1;
789 
790  return buf_size;
791 }
792 
794  .name = "qcelp",
795  .long_name = NULL_IF_CONFIG_SMALL("QCELP / PureVoice"),
796  .type = AVMEDIA_TYPE_AUDIO,
797  .id = AV_CODEC_ID_QCELP,
798  .init = qcelp_decode_init,
799  .decode = qcelp_decode_frame,
800  .capabilities = AV_CODEC_CAP_DR1,
801  .priv_data_size = sizeof(QCELPContext),
802 };
AVCodec
AVCodec.
Definition: avcodec.h:3481
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
codebook_sanity_check_for_rate_quarter
static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain)
If the received packet is Rate 1/4 a further sanity check is made of the codebook gain.
Definition: qcelpdec.c:273
SILENCE
@ SILENCE
Definition: qcelpdec.c:46
acelp_vectors.h
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2276
qcelp_lspvq
static const qcelp_vector *const qcelp_lspvq[5]
Definition: qcelpdata.h:414
QCELPContext::erasure_count
uint8_t erasure_count
Definition: qcelpdec.c:58
message
Definition: api-threadmessage-test.c:46
n
int n
Definition: avisynth_c.h:760
QCELPContext::pitch_lag
uint8_t pitch_lag[4]
Definition: qcelpdec.c:70
QCELPContext::gb
GetBitContext gb
Definition: qcelpdec.c:54
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
qcelp_unpacking_bitmaps_per_rate
static const QCELPBitmap *const qcelp_unpacking_bitmaps_per_rate[5]
Bitmapping data position for each packet type in the QCELPContext.
Definition: qcelpdata.h:268
QCELPFrame::cindex
uint8_t cindex[16]
codebook index for each codebook subframe
Definition: qcelpdata.h:45
qcelp_rate_full_codebook
static const int16_t qcelp_rate_full_codebook[128]
Circular codebook for rate 1 frames in x*100 form.
Definition: qcelpdata.h:459
QCELP_LSP_OCTAVE_PREDICTOR
#define QCELP_LSP_OCTAVE_PREDICTOR
Predictor coefficient for the conversion of LSP codes to LSP frequencies for 1/8 and I_F_Q.
Definition: qcelpdata.h:541
qcelp_decode_init
static av_cold int qcelp_decode_init(AVCodecContext *avctx)
Initialize the speech codec according to the specification.
Definition: qcelpdec.c:85
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
internal.h
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
data
const char data[16]
Definition: mxf.c:91
QCELPContext::postfilter_synth_mem
float postfilter_synth_mem[10]
Definition: qcelpdec.c:75
qcelp_packet_rate
qcelp_packet_rate
Definition: qcelpdec.c:44
QCELPFrame::lspv
uint8_t lspv[10]
line spectral pair frequencies (LSP) for RATE_OCTAVE, line spectral pair frequencies grouped into fiv...
Definition: qcelpdata.h:60
ff_celp_lp_synthesis_filterf
void ff_celp_lp_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP synthesis filter.
Definition: celp_filters.c:84
RATE_FULL
@ RATE_FULL
Definition: qcelpdec.c:50
ff_qcelp_decoder
AVCodec ff_qcelp_decoder
Definition: qcelpdec.c:793
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
QCELPContext::prev_g1
int prev_g1[2]
Definition: qcelpdec.c:67
QCELP_SQRT1887
#define QCELP_SQRT1887
sqrt(1.887) is the maximum of the pseudorandom white sequence used to generate the scaled codebook ve...
Definition: qcelpdata.h:511
QCELPBitmap::index
uint8_t index
index into the QCELPContext structure
Definition: qcelpdata.h:77
GetBitContext
Definition: get_bits.h:61
QCELPFrame::plag
uint8_t plag[4]
pitch lag for each pitch subframe
Definition: qcelpdata.h:50
RATE_OCTAVE
@ RATE_OCTAVE
Definition: qcelpdec.c:47
ff_adaptive_gain_control
void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem)
Adaptive gain control (as used in AMR postfiltering)
Definition: acelp_vectors.c:203
avassert.h
rnd
#define rnd()
Definition: checkasm.h:104
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
buf
void * buf
Definition: avisynth_c.h:766
av_cold
#define av_cold
Definition: attributes.h:84
do_pitchfilter
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])
Apply filter in pitch-subframe steps.
Definition: qcelpdec.c:423
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
QCELP_LSP_SPREAD_FACTOR
#define QCELP_LSP_SPREAD_FACTOR
This spread factor is used, for bitrate 1/8 and I_F_Q, to force LSP frequencies to be at least 80 Hz ...
Definition: qcelpdata.h:533
buf_size2bitrate
static qcelp_packet_rate buf_size2bitrate(const int buf_size)
Definition: qcelpdec.c:588
QCELPContext::formant_mem
float formant_mem[170]
Definition: qcelpdec.c:65
qcelp_unpacking_bitmaps_lengths
static const uint16_t qcelp_unpacking_bitmaps_lengths[5]
Definition: qcelpdata.h:276
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
get_bits.h
QCELPContext::first16bits
uint16_t first16bits
Definition: qcelpdec.c:71
qcelp_rate_half_codebook
static const int8_t qcelp_rate_half_codebook[128]
Circular codebook for rate 1/2 frames in x*2 form.
Definition: qcelpdata.h:484
qcelp_hammsinc_table
static const float qcelp_hammsinc_table[4]
Pre-calculated table for hammsinc function.
Definition: qcelpdata.h:74
I_F_Q
@ I_F_Q
insufficient frame quality
Definition: qcelpdec.c:45
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
QCELPContext::pitch_gain
float pitch_gain[4]
Definition: qcelpdec.c:69
if
if(ret)
Definition: filter_design.txt:179
qcelp_decode_frame
static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: qcelpdec.c:686
QCELPContext::rnd_fir_filter_mem
float rnd_fir_filter_mem[180]
Definition: qcelpdec.c:64
apply_pitch_filters
static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
Definition: qcelpdec.c:467
QCELPFrame::cbsign
uint8_t cbsign[16]
sign of the codebook gain for each codebook subframe
Definition: qcelpdata.h:43
QCELPContext::predictor_lspf
float predictor_lspf[10]
LSP predictor for RATE_OCTAVE and I_F_Q.
Definition: qcelpdec.c:61
QCELPContext::warned_buf_mismatch_bitrate
uint8_t warned_buf_mismatch_bitrate
Definition: qcelpdec.c:72
QCELPContext::prev_bitrate
int prev_bitrate
Definition: qcelpdec.c:68
celp_filters.h
QCELPContext::postfilter_agc_mem
float postfilter_agc_mem
Definition: qcelpdec.c:76
lspf2lpc
static void lspf2lpc(const float *lspf, float *lpc)
Reconstruct LPC coefficients from the line spectral pair frequencies and perform bandwidth expansion.
Definition: qcelpdec.c:536
weight
static int weight(int i, int blen, int offset)
Definition: diracdec.c:1564
float_dsp.h
QCELPContext::prev_lspf
float prev_lspf[10]
Definition: qcelpdec.c:60
warn_insufficient_frame_quality
static void warn_insufficient_frame_quality(AVCodecContext *avctx, const char *message)
Definition: qcelpdec.c:647
AV_CODEC_ID_QCELP
@ AV_CODEC_ID_QCELP
Definition: avcodec.h:588
QCELPFrame::pgain
uint8_t pgain[4]
pitch gain for each pitch subframe
Definition: qcelpdata.h:52
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1965
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:981
QCELPContext::bitrate
qcelp_packet_rate bitrate
Definition: qcelpdec.c:55
AVPacket::size
int size
Definition: avcodec.h:1478
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
FFMAX
#define FFMAX(a, b)
Definition: common.h:94
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2233
QCELPBitmap::bitlen
uint8_t bitlen
number of bits to read
Definition: qcelpdata.h:79
interpolate_lpc
static void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc, const int subframe_num)
Interpolate LSP frequencies and compute LPC coefficients for a given bitrate & pitch subframe.
Definition: qcelpdec.c:564
FFMIN
#define FFMIN(a, b)
Definition: common.h:96
QCELPFrame
QCELP unpacked data frame.
Definition: qcelpdata.h:40
bitrate
int64_t bitrate
Definition: h264_levels.c:131
M_PI
#define M_PI
Definition: mathematics.h:52
ff_tilt_compensation
void ff_tilt_compensation(float *mem, float tilt, float *samples, int size)
Apply tilt compensation filter, 1 - tilt * z-1.
Definition: acelp_filters.c:136
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
QCELPBitmap
Definition: qcelpdata.h:76
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
qcelpdata.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
apply_gain_ctrl
static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in)
Apply generic gain control.
Definition: qcelpdec.c:396
QCELPBitmap::bitpos
uint8_t bitpos
position of the lowest bit in the value's byte
Definition: qcelpdata.h:78
QCELPContext::octave_count
uint8_t octave_count
count the consecutive RATE_OCTAVE frames
Definition: qcelpdec.c:59
decode_lspf
static int decode_lspf(QCELPContext *q, float *lspf)
Decode the 10 quantized LSP frequencies from the LSPV/LSP transmission codes of any bitrate and check...
Definition: qcelpdec.c:111
determine_bitrate
static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_size, const uint8_t **buf)
Determine the bitrate from the frame size and/or the first byte of the frame.
Definition: qcelpdec.c:613
uint8_t
uint8_t
Definition: audio_convert.c:194
acelp_filters.h
ff_weighted_vector_sumf
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b, float weight_coeff_a, float weight_coeff_b, int length)
float implementation of weighted sum of two vectors.
Definition: acelp_vectors.c:193
qcelp_g12ga
static const float qcelp_g12ga[61]
Table for computing Ga (decoded linear codebook gain magnitude)
Definition: qcelpdata.h:436
AVCodec::name
const char * name
Name of the codec implementation.
Definition: avcodec.h:3488
QCELPContext::pitch_pre_filter_mem
float pitch_pre_filter_mem[303]
Definition: qcelpdec.c:63
avcodec.h
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
lsp.h
ff_celp_lp_zero_synthesis_filterf
void ff_celp_lp_zero_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP zero synthesis filter.
Definition: celp_filters.c:199
compute_svector
static void compute_svector(QCELPContext *q, const float *gain, float *cdn_vector)
Compute the scaled codebook vector Cdn From INDEX and GAIN for all rates.
Definition: qcelpdec.c:309
QCELPContext::postfilter_tilt_mem
float postfilter_tilt_mem
Definition: qcelpdec.c:77
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
RATE_HALF
@ RATE_HALF
Definition: qcelpdec.c:49
channel_layout.h
decode_gain_and_index
static void decode_gain_and_index(QCELPContext *q, float *gain)
Convert codebook transmission codes to GAIN and INDEX.
Definition: qcelpdec.c:195
QCELPContext
Definition: qcelpdec.c:53
QCELP_BANDWIDTH_EXPANSION_COEFF
#define QCELP_BANDWIDTH_EXPANSION_COEFF
Initial coefficient to perform bandwidth expansion on LPC.
Definition: qcelpdata.h:550
RATE_QUARTER
@ RATE_QUARTER
Definition: qcelpdec.c:48
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
avpriv_scalarproduct_float_c
float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len)
Return the scalar product of two vectors.
Definition: float_dsp.c:124
AVCodecContext::frame_number
int frame_number
Frame counter, set by libavcodec.
Definition: avcodec.h:2256
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
QCELPContext::frame
QCELPFrame frame
unpacked data frame
Definition: qcelpdec.c:56
QCELP_RATE_HALF_CODEBOOK_RATIO
#define QCELP_RATE_HALF_CODEBOOK_RATIO
Definition: qcelpdata.h:502
diff
static av_always_inline int diff(const uint32_t a, const uint32_t b)
Definition: vf_palettegen.c:136
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
ff_scale_vector_to_given_sum_of_squares
void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n)
Set the sum of squares of a signal by scaling.
Definition: acelp_vectors.c:224
QCELPFrame::reserved
uint8_t reserved
reserved bits only present in bitrate 1, 1/4 and 1/8 packets
Definition: qcelpdata.h:65
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
ff_acelp_lspd2lpc
void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
Reconstruct LPC coefficients from the line spectral pair frequencies.
Definition: lsp.c:209
qcelp_rnd_fir_coefs
static const double qcelp_rnd_fir_coefs[11]
Table for impulse response of BPF used to filter the white excitation for bitrate 1/4 synthesis.
Definition: qcelpdata.h:521
QCELPContext::last_codebook_gain
float last_codebook_gain
Definition: qcelpdec.c:66
QCELPFrame::pfrac
uint8_t pfrac[4]
fractional pitch lag for each pitch subframe
Definition: qcelpdata.h:51
AV_SAMPLE_FMT_FLT
@ AV_SAMPLE_FMT_FLT
float
Definition: samplefmt.h:63
QCELPFrame::cbgain
uint8_t cbgain[16]
unsigned codebook gain for each codebook subframe
Definition: qcelpdata.h:44
QCELP_RATE_FULL_CODEBOOK_RATIO
#define QCELP_RATE_FULL_CODEBOOK_RATIO
Definition: qcelpdata.h:477
postfilter
static void postfilter(QCELPContext *q, float *samples, float *lpc)
Definition: qcelpdec.c:654
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:94
QCELPContext::pitch_synthesis_filter_mem
float pitch_synthesis_filter_mem[303]
Definition: qcelpdec.c:62