libavcodec/g723_1.c
Go to the documentation of this file.
1 /*
2  * G.723.1 compatible decoder
3  * Copyright (c) 2006 Benjamin Larsson
4  * Copyright (c) 2010 Mohamed Naufal Basheer
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * G.723.1 compatible decoder
26  */
27 
28 #define BITSTREAM_READER_LE
30 #include "libavutil/mem.h"
31 #include "libavutil/opt.h"
32 #include "avcodec.h"
33 #include "internal.h"
34 #include "get_bits.h"
35 #include "acelp_vectors.h"
36 #include "celp_filters.h"
37 #include "celp_math.h"
38 #include "g723_1_data.h"
39 #include "internal.h"
40 
41 #define CNG_RANDOM_SEED 12345
42 
43 typedef struct g723_1_context {
44  AVClass *class;
45 
49  enum Rate cur_rate;
51  int pitch_lag[2];
53 
54  int16_t prev_lsp[LPC_ORDER];
55  int16_t sid_lsp[LPC_ORDER];
57  int16_t excitation[PITCH_MAX + FRAME_LEN + 4];
58  int16_t synth_mem[LPC_ORDER];
59  int16_t fir_mem[LPC_ORDER];
61 
66  int sid_gain;
67  int cur_gain;
69  int pf_gain; ///< formant postfilter
70  ///< gain scaling unit memory
72 
73  int16_t audio[FRAME_LEN + LPC_ORDER + PITCH_MAX + 4];
76 
77 
78  int16_t hpf_fir_mem; ///< highpass filter fir
79  int hpf_iir_mem; ///< and iir memories
80  int16_t perf_fir_mem[LPC_ORDER]; ///< perceptual filter fir
81  int16_t perf_iir_mem[LPC_ORDER]; ///< and iir memories
82 
85 
87 {
88  G723_1_Context *p = avctx->priv_data;
89 
92  avctx->channels = 1;
93  p->pf_gain = 1 << 12;
94 
95  memcpy(p->prev_lsp, dc_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
96  memcpy(p->sid_lsp, dc_lsp, LPC_ORDER * sizeof(*p->sid_lsp));
97 
100 
101  return 0;
102 }
103 
104 /**
105  * Unpack the frame into parameters.
106  *
107  * @param p the context
108  * @param buf pointer to the input buffer
109  * @param buf_size size of the input buffer
110  */
112  int buf_size)
113 {
114  GetBitContext gb;
115  int ad_cb_len;
116  int temp, info_bits, i;
117 
118  init_get_bits(&gb, buf, buf_size * 8);
119 
120  /* Extract frame type and rate info */
121  info_bits = get_bits(&gb, 2);
122 
123  if (info_bits == 3) {
125  return 0;
126  }
127 
128  /* Extract 24 bit lsp indices, 8 bit for each band */
129  p->lsp_index[2] = get_bits(&gb, 8);
130  p->lsp_index[1] = get_bits(&gb, 8);
131  p->lsp_index[0] = get_bits(&gb, 8);
132 
133  if (info_bits == 2) {
135  p->subframe[0].amp_index = get_bits(&gb, 6);
136  return 0;
137  }
138 
139  /* Extract the info common to both rates */
140  p->cur_rate = info_bits ? RATE_5300 : RATE_6300;
142 
143  p->pitch_lag[0] = get_bits(&gb, 7);
144  if (p->pitch_lag[0] > 123) /* test if forbidden code */
145  return -1;
146  p->pitch_lag[0] += PITCH_MIN;
147  p->subframe[1].ad_cb_lag = get_bits(&gb, 2);
148 
149  p->pitch_lag[1] = get_bits(&gb, 7);
150  if (p->pitch_lag[1] > 123)
151  return -1;
152  p->pitch_lag[1] += PITCH_MIN;
153  p->subframe[3].ad_cb_lag = get_bits(&gb, 2);
154  p->subframe[0].ad_cb_lag = 1;
155  p->subframe[2].ad_cb_lag = 1;
156 
157  for (i = 0; i < SUBFRAMES; i++) {
158  /* Extract combined gain */
159  temp = get_bits(&gb, 12);
160  ad_cb_len = 170;
161  p->subframe[i].dirac_train = 0;
162  if (p->cur_rate == RATE_6300 && p->pitch_lag[i >> 1] < SUBFRAME_LEN - 2) {
163  p->subframe[i].dirac_train = temp >> 11;
164  temp &= 0x7FF;
165  ad_cb_len = 85;
166  }
167  p->subframe[i].ad_cb_gain = FASTDIV(temp, GAIN_LEVELS);
168  if (p->subframe[i].ad_cb_gain < ad_cb_len) {
169  p->subframe[i].amp_index = temp - p->subframe[i].ad_cb_gain *
170  GAIN_LEVELS;
171  } else {
172  return -1;
173  }
174  }
175 
176  p->subframe[0].grid_index = get_bits1(&gb);
177  p->subframe[1].grid_index = get_bits1(&gb);
178  p->subframe[2].grid_index = get_bits1(&gb);
179  p->subframe[3].grid_index = get_bits1(&gb);
180 
181  if (p->cur_rate == RATE_6300) {
182  skip_bits1(&gb); /* skip reserved bit */
183 
184  /* Compute pulse_pos index using the 13-bit combined position index */
185  temp = get_bits(&gb, 13);
186  p->subframe[0].pulse_pos = temp / 810;
187 
188  temp -= p->subframe[0].pulse_pos * 810;
189  p->subframe[1].pulse_pos = FASTDIV(temp, 90);
190 
191  temp -= p->subframe[1].pulse_pos * 90;
192  p->subframe[2].pulse_pos = FASTDIV(temp, 9);
193  p->subframe[3].pulse_pos = temp - p->subframe[2].pulse_pos * 9;
194 
195  p->subframe[0].pulse_pos = (p->subframe[0].pulse_pos << 16) +
196  get_bits(&gb, 16);
197  p->subframe[1].pulse_pos = (p->subframe[1].pulse_pos << 14) +
198  get_bits(&gb, 14);
199  p->subframe[2].pulse_pos = (p->subframe[2].pulse_pos << 16) +
200  get_bits(&gb, 16);
201  p->subframe[3].pulse_pos = (p->subframe[3].pulse_pos << 14) +
202  get_bits(&gb, 14);
203 
204  p->subframe[0].pulse_sign = get_bits(&gb, 6);
205  p->subframe[1].pulse_sign = get_bits(&gb, 5);
206  p->subframe[2].pulse_sign = get_bits(&gb, 6);
207  p->subframe[3].pulse_sign = get_bits(&gb, 5);
208  } else { /* 5300 bps */
209  p->subframe[0].pulse_pos = get_bits(&gb, 12);
210  p->subframe[1].pulse_pos = get_bits(&gb, 12);
211  p->subframe[2].pulse_pos = get_bits(&gb, 12);
212  p->subframe[3].pulse_pos = get_bits(&gb, 12);
213 
214  p->subframe[0].pulse_sign = get_bits(&gb, 4);
215  p->subframe[1].pulse_sign = get_bits(&gb, 4);
216  p->subframe[2].pulse_sign = get_bits(&gb, 4);
217  p->subframe[3].pulse_sign = get_bits(&gb, 4);
218  }
219 
220  return 0;
221 }
222 
223 /**
224  * Bitexact implementation of sqrt(val/2).
225  */
226 static int16_t square_root(unsigned val)
227 {
228  av_assert2(!(val & 0x80000000));
229 
230  return (ff_sqrt(val << 1) >> 1) & (~1);
231 }
232 
233 /**
234  * Calculate the number of left-shifts required for normalizing the input.
235  *
236  * @param num input number
237  * @param width width of the input, 15 or 31 bits
238  */
239 static int normalize_bits(int num, int width)
240 {
241  return width - av_log2(num) - 1;
242 }
243 
244 #define normalize_bits_int16(num) normalize_bits(num, 15)
245 #define normalize_bits_int32(num) normalize_bits(num, 31)
246 
247 /**
248  * Scale vector contents based on the largest of their absolutes.
249  */
250 static int scale_vector(int16_t *dst, const int16_t *vector, int length)
251 {
252  int bits, max = 0;
253  int i;
254 
255  for (i = 0; i < length; i++)
256  max |= FFABS(vector[i]);
257 
258  bits= 14 - av_log2_16bit(max);
259  bits= FFMAX(bits, 0);
260 
261  for (i = 0; i < length; i++)
262  dst[i] = vector[i] << bits >> 3;
263 
264  return bits - 3;
265 }
266 
267 /**
268  * Perform inverse quantization of LSP frequencies.
269  *
270  * @param cur_lsp the current LSP vector
271  * @param prev_lsp the previous LSP vector
272  * @param lsp_index VQ indices
273  * @param bad_frame bad frame flag
274  */
275 static void inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp,
276  uint8_t *lsp_index, int bad_frame)
277 {
278  int min_dist, pred;
279  int i, j, temp, stable;
280 
281  /* Check for frame erasure */
282  if (!bad_frame) {
283  min_dist = 0x100;
284  pred = 12288;
285  } else {
286  min_dist = 0x200;
287  pred = 23552;
288  lsp_index[0] = lsp_index[1] = lsp_index[2] = 0;
289  }
290 
291  /* Get the VQ table entry corresponding to the transmitted index */
292  cur_lsp[0] = lsp_band0[lsp_index[0]][0];
293  cur_lsp[1] = lsp_band0[lsp_index[0]][1];
294  cur_lsp[2] = lsp_band0[lsp_index[0]][2];
295  cur_lsp[3] = lsp_band1[lsp_index[1]][0];
296  cur_lsp[4] = lsp_band1[lsp_index[1]][1];
297  cur_lsp[5] = lsp_band1[lsp_index[1]][2];
298  cur_lsp[6] = lsp_band2[lsp_index[2]][0];
299  cur_lsp[7] = lsp_band2[lsp_index[2]][1];
300  cur_lsp[8] = lsp_band2[lsp_index[2]][2];
301  cur_lsp[9] = lsp_band2[lsp_index[2]][3];
302 
303  /* Add predicted vector & DC component to the previously quantized vector */
304  for (i = 0; i < LPC_ORDER; i++) {
305  temp = ((prev_lsp[i] - dc_lsp[i]) * pred + (1 << 14)) >> 15;
306  cur_lsp[i] += dc_lsp[i] + temp;
307  }
308 
309  for (i = 0; i < LPC_ORDER; i++) {
310  cur_lsp[0] = FFMAX(cur_lsp[0], 0x180);
311  cur_lsp[LPC_ORDER - 1] = FFMIN(cur_lsp[LPC_ORDER - 1], 0x7e00);
312 
313  /* Stability check */
314  for (j = 1; j < LPC_ORDER; j++) {
315  temp = min_dist + cur_lsp[j - 1] - cur_lsp[j];
316  if (temp > 0) {
317  temp >>= 1;
318  cur_lsp[j - 1] -= temp;
319  cur_lsp[j] += temp;
320  }
321  }
322  stable = 1;
323  for (j = 1; j < LPC_ORDER; j++) {
324  temp = cur_lsp[j - 1] + min_dist - cur_lsp[j] - 4;
325  if (temp > 0) {
326  stable = 0;
327  break;
328  }
329  }
330  if (stable)
331  break;
332  }
333  if (!stable)
334  memcpy(cur_lsp, prev_lsp, LPC_ORDER * sizeof(*cur_lsp));
335 }
336 
337 /**
338  * Bitexact implementation of 2ab scaled by 1/2^16.
339  *
340  * @param a 32 bit multiplicand
341  * @param b 16 bit multiplier
342  */
343 #define MULL2(a, b) \
344  MULL(a,b,15)
345 
346 /**
347  * Convert LSP frequencies to LPC coefficients.
348  *
349  * @param lpc buffer for LPC coefficients
350  */
351 static void lsp2lpc(int16_t *lpc)
352 {
353  int f1[LPC_ORDER / 2 + 1];
354  int f2[LPC_ORDER / 2 + 1];
355  int i, j;
356 
357  /* Calculate negative cosine */
358  for (j = 0; j < LPC_ORDER; j++) {
359  int index = (lpc[j] >> 7) & 0x1FF;
360  int offset = lpc[j] & 0x7f;
361  int temp1 = cos_tab[index] << 16;
362  int temp2 = (cos_tab[index + 1] - cos_tab[index]) *
363  ((offset << 8) + 0x80) << 1;
364 
365  lpc[j] = -(av_sat_dadd32(1 << 15, temp1 + temp2) >> 16);
366  }
367 
368  /*
369  * Compute sum and difference polynomial coefficients
370  * (bitexact alternative to lsp2poly() in lsp.c)
371  */
372  /* Initialize with values in Q28 */
373  f1[0] = 1 << 28;
374  f1[1] = (lpc[0] << 14) + (lpc[2] << 14);
375  f1[2] = lpc[0] * lpc[2] + (2 << 28);
376 
377  f2[0] = 1 << 28;
378  f2[1] = (lpc[1] << 14) + (lpc[3] << 14);
379  f2[2] = lpc[1] * lpc[3] + (2 << 28);
380 
381  /*
382  * Calculate and scale the coefficients by 1/2 in
383  * each iteration for a final scaling factor of Q25
384  */
385  for (i = 2; i < LPC_ORDER / 2; i++) {
386  f1[i + 1] = f1[i - 1] + MULL2(f1[i], lpc[2 * i]);
387  f2[i + 1] = f2[i - 1] + MULL2(f2[i], lpc[2 * i + 1]);
388 
389  for (j = i; j >= 2; j--) {
390  f1[j] = MULL2(f1[j - 1], lpc[2 * i]) +
391  (f1[j] >> 1) + (f1[j - 2] >> 1);
392  f2[j] = MULL2(f2[j - 1], lpc[2 * i + 1]) +
393  (f2[j] >> 1) + (f2[j - 2] >> 1);
394  }
395 
396  f1[0] >>= 1;
397  f2[0] >>= 1;
398  f1[1] = ((lpc[2 * i] << 16 >> i) + f1[1]) >> 1;
399  f2[1] = ((lpc[2 * i + 1] << 16 >> i) + f2[1]) >> 1;
400  }
401 
402  /* Convert polynomial coefficients to LPC coefficients */
403  for (i = 0; i < LPC_ORDER / 2; i++) {
404  int64_t ff1 = f1[i + 1] + f1[i];
405  int64_t ff2 = f2[i + 1] - f2[i];
406 
407  lpc[i] = av_clipl_int32(((ff1 + ff2) << 3) + (1 << 15)) >> 16;
408  lpc[LPC_ORDER - i - 1] = av_clipl_int32(((ff1 - ff2) << 3) +
409  (1 << 15)) >> 16;
410  }
411 }
412 
413 /**
414  * Quantize LSP frequencies by interpolation and convert them to
415  * the corresponding LPC coefficients.
416  *
417  * @param lpc buffer for LPC coefficients
418  * @param cur_lsp the current LSP vector
419  * @param prev_lsp the previous LSP vector
420  */
421 static void lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, int16_t *prev_lsp)
422 {
423  int i;
424  int16_t *lpc_ptr = lpc;
425 
426  /* cur_lsp * 0.25 + prev_lsp * 0.75 */
427  ff_acelp_weighted_vector_sum(lpc, cur_lsp, prev_lsp,
428  4096, 12288, 1 << 13, 14, LPC_ORDER);
429  ff_acelp_weighted_vector_sum(lpc + LPC_ORDER, cur_lsp, prev_lsp,
430  8192, 8192, 1 << 13, 14, LPC_ORDER);
431  ff_acelp_weighted_vector_sum(lpc + 2 * LPC_ORDER, cur_lsp, prev_lsp,
432  12288, 4096, 1 << 13, 14, LPC_ORDER);
433  memcpy(lpc + 3 * LPC_ORDER, cur_lsp, LPC_ORDER * sizeof(*lpc));
434 
435  for (i = 0; i < SUBFRAMES; i++) {
436  lsp2lpc(lpc_ptr);
437  lpc_ptr += LPC_ORDER;
438  }
439 }
440 
441 /**
442  * Generate a train of dirac functions with period as pitch lag.
443  */
444 static void gen_dirac_train(int16_t *buf, int pitch_lag)
445 {
446  int16_t vector[SUBFRAME_LEN];
447  int i, j;
448 
449  memcpy(vector, buf, SUBFRAME_LEN * sizeof(*vector));
450  for (i = pitch_lag; i < SUBFRAME_LEN; i += pitch_lag) {
451  for (j = 0; j < SUBFRAME_LEN - i; j++)
452  buf[i + j] += vector[j];
453  }
454 }
455 
456 /**
457  * Generate fixed codebook excitation vector.
458  *
459  * @param vector decoded excitation vector
460  * @param subfrm current subframe
461  * @param cur_rate current bitrate
462  * @param pitch_lag closed loop pitch lag
463  * @param index current subframe index
464  */
465 static void gen_fcb_excitation(int16_t *vector, G723_1_Subframe *subfrm,
466  enum Rate cur_rate, int pitch_lag, int index)
467 {
468  int temp, i, j;
469 
470  memset(vector, 0, SUBFRAME_LEN * sizeof(*vector));
471 
472  if (cur_rate == RATE_6300) {
473  if (subfrm->pulse_pos >= max_pos[index])
474  return;
475 
476  /* Decode amplitudes and positions */
477  j = PULSE_MAX - pulses[index];
478  temp = subfrm->pulse_pos;
479  for (i = 0; i < SUBFRAME_LEN / GRID_SIZE; i++) {
480  temp -= combinatorial_table[j][i];
481  if (temp >= 0)
482  continue;
483  temp += combinatorial_table[j++][i];
484  if (subfrm->pulse_sign & (1 << (PULSE_MAX - j))) {
485  vector[subfrm->grid_index + GRID_SIZE * i] =
486  -fixed_cb_gain[subfrm->amp_index];
487  } else {
488  vector[subfrm->grid_index + GRID_SIZE * i] =
489  fixed_cb_gain[subfrm->amp_index];
490  }
491  if (j == PULSE_MAX)
492  break;
493  }
494  if (subfrm->dirac_train == 1)
495  gen_dirac_train(vector, pitch_lag);
496  } else { /* 5300 bps */
497  int cb_gain = fixed_cb_gain[subfrm->amp_index];
498  int cb_shift = subfrm->grid_index;
499  int cb_sign = subfrm->pulse_sign;
500  int cb_pos = subfrm->pulse_pos;
501  int offset, beta, lag;
502 
503  for (i = 0; i < 8; i += 2) {
504  offset = ((cb_pos & 7) << 3) + cb_shift + i;
505  vector[offset] = (cb_sign & 1) ? cb_gain : -cb_gain;
506  cb_pos >>= 3;
507  cb_sign >>= 1;
508  }
509 
510  /* Enhance harmonic components */
511  lag = pitch_contrib[subfrm->ad_cb_gain << 1] + pitch_lag +
512  subfrm->ad_cb_lag - 1;
513  beta = pitch_contrib[(subfrm->ad_cb_gain << 1) + 1];
514 
515  if (lag < SUBFRAME_LEN - 2) {
516  for (i = lag; i < SUBFRAME_LEN; i++)
517  vector[i] += beta * vector[i - lag] >> 15;
518  }
519  }
520 }
521 
522 /**
523  * Get delayed contribution from the previous excitation vector.
524  */
525 static void get_residual(int16_t *residual, int16_t *prev_excitation, int lag)
526 {
527  int offset = PITCH_MAX - PITCH_ORDER / 2 - lag;
528  int i;
529 
530  residual[0] = prev_excitation[offset];
531  residual[1] = prev_excitation[offset + 1];
532 
533  offset += 2;
534  for (i = 2; i < SUBFRAME_LEN + PITCH_ORDER - 1; i++)
535  residual[i] = prev_excitation[offset + (i - 2) % lag];
536 }
537 
538 static int dot_product(const int16_t *a, const int16_t *b, int length)
539 {
540  int sum = ff_dot_product(a,b,length);
541  return av_sat_add32(sum, sum);
542 }
543 
544 /**
545  * Generate adaptive codebook excitation.
546  */
547 static void gen_acb_excitation(int16_t *vector, int16_t *prev_excitation,
548  int pitch_lag, G723_1_Subframe *subfrm,
549  enum Rate cur_rate)
550 {
551  int16_t residual[SUBFRAME_LEN + PITCH_ORDER - 1];
552  const int16_t *cb_ptr;
553  int lag = pitch_lag + subfrm->ad_cb_lag - 1;
554 
555  int i;
556  int sum;
557 
558  get_residual(residual, prev_excitation, lag);
559 
560  /* Select quantization table */
561  if (cur_rate == RATE_6300 && pitch_lag < SUBFRAME_LEN - 2) {
562  cb_ptr = adaptive_cb_gain85;
563  } else
564  cb_ptr = adaptive_cb_gain170;
565 
566  /* Calculate adaptive vector */
567  cb_ptr += subfrm->ad_cb_gain * 20;
568  for (i = 0; i < SUBFRAME_LEN; i++) {
569  sum = ff_dot_product(residual + i, cb_ptr, PITCH_ORDER);
570  vector[i] = av_sat_dadd32(1 << 15, av_sat_add32(sum, sum)) >> 16;
571  }
572 }
573 
574 /**
575  * Estimate maximum auto-correlation around pitch lag.
576  *
577  * @param buf buffer with offset applied
578  * @param offset offset of the excitation vector
579  * @param ccr_max pointer to the maximum auto-correlation
580  * @param pitch_lag decoded pitch lag
581  * @param length length of autocorrelation
582  * @param dir forward lag(1) / backward lag(-1)
583  */
584 static int autocorr_max(const int16_t *buf, int offset, int *ccr_max,
585  int pitch_lag, int length, int dir)
586 {
587  int limit, ccr, lag = 0;
588  int i;
589 
590  pitch_lag = FFMIN(PITCH_MAX - 3, pitch_lag);
591  if (dir > 0)
592  limit = FFMIN(FRAME_LEN + PITCH_MAX - offset - length, pitch_lag + 3);
593  else
594  limit = pitch_lag + 3;
595 
596  for (i = pitch_lag - 3; i <= limit; i++) {
597  ccr = dot_product(buf, buf + dir * i, length);
598 
599  if (ccr > *ccr_max) {
600  *ccr_max = ccr;
601  lag = i;
602  }
603  }
604  return lag;
605 }
606 
607 /**
608  * Calculate pitch postfilter optimal and scaling gains.
609  *
610  * @param lag pitch postfilter forward/backward lag
611  * @param ppf pitch postfilter parameters
612  * @param cur_rate current bitrate
613  * @param tgt_eng target energy
614  * @param ccr cross-correlation
615  * @param res_eng residual energy
616  */
617 static void comp_ppf_gains(int lag, PPFParam *ppf, enum Rate cur_rate,
618  int tgt_eng, int ccr, int res_eng)
619 {
620  int pf_residual; /* square of postfiltered residual */
621  int temp1, temp2;
622 
623  ppf->index = lag;
624 
625  temp1 = tgt_eng * res_eng >> 1;
626  temp2 = ccr * ccr << 1;
627 
628  if (temp2 > temp1) {
629  if (ccr >= res_eng) {
631  } else {
632  ppf->opt_gain = (ccr << 15) / res_eng *
633  ppf_gain_weight[cur_rate] >> 15;
634  }
635  /* pf_res^2 = tgt_eng + 2*ccr*gain + res_eng*gain^2 */
636  temp1 = (tgt_eng << 15) + (ccr * ppf->opt_gain << 1);
637  temp2 = (ppf->opt_gain * ppf->opt_gain >> 15) * res_eng;
638  pf_residual = av_sat_add32(temp1, temp2 + (1 << 15)) >> 16;
639 
640  if (tgt_eng >= pf_residual << 1) {
641  temp1 = 0x7fff;
642  } else {
643  temp1 = (tgt_eng << 14) / pf_residual;
644  }
645 
646  /* scaling_gain = sqrt(tgt_eng/pf_res^2) */
647  ppf->sc_gain = square_root(temp1 << 16);
648  } else {
649  ppf->opt_gain = 0;
650  ppf->sc_gain = 0x7fff;
651  }
652 
653  ppf->opt_gain = av_clip_int16(ppf->opt_gain * ppf->sc_gain >> 15);
654 }
655 
656 /**
657  * Calculate pitch postfilter parameters.
658  *
659  * @param p the context
660  * @param offset offset of the excitation vector
661  * @param pitch_lag decoded pitch lag
662  * @param ppf pitch postfilter parameters
663  * @param cur_rate current bitrate
664  */
666  PPFParam *ppf, enum Rate cur_rate)
667 {
668 
669  int16_t scale;
670  int i;
671  int temp1, temp2;
672 
673  /*
674  * 0 - target energy
675  * 1 - forward cross-correlation
676  * 2 - forward residual energy
677  * 3 - backward cross-correlation
678  * 4 - backward residual energy
679  */
680  int energy[5] = {0, 0, 0, 0, 0};
681  int16_t *buf = p->audio + LPC_ORDER + offset;
682  int fwd_lag = autocorr_max(buf, offset, &energy[1], pitch_lag,
683  SUBFRAME_LEN, 1);
684  int back_lag = autocorr_max(buf, offset, &energy[3], pitch_lag,
685  SUBFRAME_LEN, -1);
686 
687  ppf->index = 0;
688  ppf->opt_gain = 0;
689  ppf->sc_gain = 0x7fff;
690 
691  /* Case 0, Section 3.6 */
692  if (!back_lag && !fwd_lag)
693  return;
694 
695  /* Compute target energy */
696  energy[0] = dot_product(buf, buf, SUBFRAME_LEN);
697 
698  /* Compute forward residual energy */
699  if (fwd_lag)
700  energy[2] = dot_product(buf + fwd_lag, buf + fwd_lag, SUBFRAME_LEN);
701 
702  /* Compute backward residual energy */
703  if (back_lag)
704  energy[4] = dot_product(buf - back_lag, buf - back_lag, SUBFRAME_LEN);
705 
706  /* Normalize and shorten */
707  temp1 = 0;
708  for (i = 0; i < 5; i++)
709  temp1 = FFMAX(energy[i], temp1);
710 
711  scale = normalize_bits(temp1, 31);
712  for (i = 0; i < 5; i++)
713  energy[i] = (energy[i] << scale) >> 16;
714 
715  if (fwd_lag && !back_lag) { /* Case 1 */
716  comp_ppf_gains(fwd_lag, ppf, cur_rate, energy[0], energy[1],
717  energy[2]);
718  } else if (!fwd_lag) { /* Case 2 */
719  comp_ppf_gains(-back_lag, ppf, cur_rate, energy[0], energy[3],
720  energy[4]);
721  } else { /* Case 3 */
722 
723  /*
724  * Select the largest of energy[1]^2/energy[2]
725  * and energy[3]^2/energy[4]
726  */
727  temp1 = energy[4] * ((energy[1] * energy[1] + (1 << 14)) >> 15);
728  temp2 = energy[2] * ((energy[3] * energy[3] + (1 << 14)) >> 15);
729  if (temp1 >= temp2) {
730  comp_ppf_gains(fwd_lag, ppf, cur_rate, energy[0], energy[1],
731  energy[2]);
732  } else {
733  comp_ppf_gains(-back_lag, ppf, cur_rate, energy[0], energy[3],
734  energy[4]);
735  }
736  }
737 }
738 
739 /**
740  * Classify frames as voiced/unvoiced.
741  *
742  * @param p the context
743  * @param pitch_lag decoded pitch_lag
744  * @param exc_eng excitation energy estimation
745  * @param scale scaling factor of exc_eng
746  *
747  * @return residual interpolation index if voiced, 0 otherwise
748  */
750  int *exc_eng, int *scale)
751 {
752  int offset = PITCH_MAX + 2 * SUBFRAME_LEN;
753  int16_t *buf = p->audio + LPC_ORDER;
754 
755  int index, ccr, tgt_eng, best_eng, temp;
756 
757  *scale = scale_vector(buf, p->excitation, FRAME_LEN + PITCH_MAX);
758  buf += offset;
759 
760  /* Compute maximum backward cross-correlation */
761  ccr = 0;
762  index = autocorr_max(buf, offset, &ccr, pitch_lag, SUBFRAME_LEN * 2, -1);
763  ccr = av_sat_add32(ccr, 1 << 15) >> 16;
764 
765  /* Compute target energy */
766  tgt_eng = dot_product(buf, buf, SUBFRAME_LEN * 2);
767  *exc_eng = av_sat_add32(tgt_eng, 1 << 15) >> 16;
768 
769  if (ccr <= 0)
770  return 0;
771 
772  /* Compute best energy */
773  best_eng = dot_product(buf - index, buf - index, SUBFRAME_LEN * 2);
774  best_eng = av_sat_add32(best_eng, 1 << 15) >> 16;
775 
776  temp = best_eng * *exc_eng >> 3;
777 
778  if (temp < ccr * ccr) {
779  return index;
780  } else
781  return 0;
782 }
783 
784 /**
785  * Peform residual interpolation based on frame classification.
786  *
787  * @param buf decoded excitation vector
788  * @param out output vector
789  * @param lag decoded pitch lag
790  * @param gain interpolated gain
791  * @param rseed seed for random number generator
792  */
793 static void residual_interp(int16_t *buf, int16_t *out, int lag,
794  int gain, int *rseed)
795 {
796  int i;
797  if (lag) { /* Voiced */
798  int16_t *vector_ptr = buf + PITCH_MAX;
799  /* Attenuate */
800  for (i = 0; i < lag; i++)
801  out[i] = vector_ptr[i - lag] * 3 >> 2;
802  av_memcpy_backptr((uint8_t*)(out + lag), lag * sizeof(*out),
803  (FRAME_LEN - lag) * sizeof(*out));
804  } else { /* Unvoiced */
805  for (i = 0; i < FRAME_LEN; i++) {
806  *rseed = *rseed * 521 + 259;
807  out[i] = gain * *rseed >> 15;
808  }
809  memset(buf, 0, (FRAME_LEN + PITCH_MAX) * sizeof(*buf));
810  }
811 }
812 
813 /**
814  * Perform IIR filtering.
815  *
816  * @param fir_coef FIR coefficients
817  * @param iir_coef IIR coefficients
818  * @param src source vector
819  * @param dest destination vector
820  * @param width width of the output, 16 bits(0) / 32 bits(1)
821  */
822 #define iir_filter(fir_coef, iir_coef, src, dest, width)\
823 {\
824  int m, n;\
825  int res_shift = 16 & ~-(width);\
826  int in_shift = 16 - res_shift;\
827 \
828  for (m = 0; m < SUBFRAME_LEN; m++) {\
829  int64_t filter = 0;\
830  for (n = 1; n <= LPC_ORDER; n++) {\
831  filter -= (fir_coef)[n - 1] * (src)[m - n] -\
832  (iir_coef)[n - 1] * ((dest)[m - n] >> in_shift);\
833  }\
834 \
835  (dest)[m] = av_clipl_int32(((src)[m] << 16) + (filter << 3) +\
836  (1 << 15)) >> res_shift;\
837  }\
838 }
839 
840 /**
841  * Adjust gain of postfiltered signal.
842  *
843  * @param p the context
844  * @param buf postfiltered output vector
845  * @param energy input energy coefficient
846  */
847 static void gain_scale(G723_1_Context *p, int16_t * buf, int energy)
848 {
849  int num, denom, gain, bits1, bits2;
850  int i;
851 
852  num = energy;
853  denom = 0;
854  for (i = 0; i < SUBFRAME_LEN; i++) {
855  int temp = buf[i] >> 2;
856  temp *= temp;
857  denom = av_sat_dadd32(denom, temp);
858  }
859 
860  if (num && denom) {
861  bits1 = normalize_bits(num, 31);
862  bits2 = normalize_bits(denom, 31);
863  num = num << bits1 >> 1;
864  denom <<= bits2;
865 
866  bits2 = 5 + bits1 - bits2;
867  bits2 = FFMAX(0, bits2);
868 
869  gain = (num >> 1) / (denom >> 16);
870  gain = square_root(gain << 16 >> bits2);
871  } else {
872  gain = 1 << 12;
873  }
874 
875  for (i = 0; i < SUBFRAME_LEN; i++) {
876  p->pf_gain = (15 * p->pf_gain + gain + (1 << 3)) >> 4;
877  buf[i] = av_clip_int16((buf[i] * (p->pf_gain + (p->pf_gain >> 4)) +
878  (1 << 10)) >> 11);
879  }
880 }
881 
882 /**
883  * Perform formant filtering.
884  *
885  * @param p the context
886  * @param lpc quantized lpc coefficients
887  * @param buf input buffer
888  * @param dst output buffer
889  */
890 static void formant_postfilter(G723_1_Context *p, int16_t *lpc,
891  int16_t *buf, int16_t *dst)
892 {
893  int16_t filter_coef[2][LPC_ORDER];
894  int filter_signal[LPC_ORDER + FRAME_LEN], *signal_ptr;
895  int i, j, k;
896 
897  memcpy(buf, p->fir_mem, LPC_ORDER * sizeof(*buf));
898  memcpy(filter_signal, p->iir_mem, LPC_ORDER * sizeof(*filter_signal));
899 
900  for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) {
901  for (k = 0; k < LPC_ORDER; k++) {
902  filter_coef[0][k] = (-lpc[k] * postfilter_tbl[0][k] +
903  (1 << 14)) >> 15;
904  filter_coef[1][k] = (-lpc[k] * postfilter_tbl[1][k] +
905  (1 << 14)) >> 15;
906  }
907  iir_filter(filter_coef[0], filter_coef[1], buf + i,
908  filter_signal + i, 1);
909  lpc += LPC_ORDER;
910  }
911 
912  memcpy(p->fir_mem, buf + FRAME_LEN, LPC_ORDER * sizeof(int16_t));
913  memcpy(p->iir_mem, filter_signal + FRAME_LEN, LPC_ORDER * sizeof(int));
914 
915  buf += LPC_ORDER;
916  signal_ptr = filter_signal + LPC_ORDER;
917  for (i = 0; i < SUBFRAMES; i++) {
918  int temp;
919  int auto_corr[2];
920  int scale, energy;
921 
922  /* Normalize */
923  scale = scale_vector(dst, buf, SUBFRAME_LEN);
924 
925  /* Compute auto correlation coefficients */
926  auto_corr[0] = dot_product(dst, dst + 1, SUBFRAME_LEN - 1);
927  auto_corr[1] = dot_product(dst, dst, SUBFRAME_LEN);
928 
929  /* Compute reflection coefficient */
930  temp = auto_corr[1] >> 16;
931  if (temp) {
932  temp = (auto_corr[0] >> 2) / temp;
933  }
934  p->reflection_coef = (3 * p->reflection_coef + temp + 2) >> 2;
935  temp = -p->reflection_coef >> 1 & ~3;
936 
937  /* Compensation filter */
938  for (j = 0; j < SUBFRAME_LEN; j++) {
939  dst[j] = av_sat_dadd32(signal_ptr[j],
940  (signal_ptr[j - 1] >> 16) * temp) >> 16;
941  }
942 
943  /* Compute normalized signal energy */
944  temp = 2 * scale + 4;
945  if (temp < 0) {
946  energy = av_clipl_int32((int64_t)auto_corr[1] << -temp);
947  } else
948  energy = auto_corr[1] >> temp;
949 
950  gain_scale(p, dst, energy);
951 
952  buf += SUBFRAME_LEN;
953  signal_ptr += SUBFRAME_LEN;
954  dst += SUBFRAME_LEN;
955  }
956 }
957 
958 static int sid_gain_to_lsp_index(int gain)
959 {
960  if (gain < 0x10)
961  return gain << 6;
962  else if (gain < 0x20)
963  return gain - 8 << 7;
964  else
965  return gain - 20 << 8;
966 }
967 
968 static inline int cng_rand(int *state, int base)
969 {
970  *state = (*state * 521 + 259) & 0xFFFF;
971  return (*state & 0x7FFF) * base >> 15;
972 }
973 
975 {
976  int i, shift, seg, seg2, t, val, val_add, x, y;
977 
978  shift = 16 - p->cur_gain * 2;
979  if (shift > 0)
980  t = p->sid_gain << shift;
981  else
982  t = p->sid_gain >> -shift;
983  x = t * cng_filt[0] >> 16;
984 
985  if (x >= cng_bseg[2])
986  return 0x3F;
987 
988  if (x >= cng_bseg[1]) {
989  shift = 4;
990  seg = 3;
991  } else {
992  shift = 3;
993  seg = (x >= cng_bseg[0]);
994  }
995  seg2 = FFMIN(seg, 3);
996 
997  val = 1 << shift;
998  val_add = val >> 1;
999  for (i = 0; i < shift; i++) {
1000  t = seg * 32 + (val << seg2);
1001  t *= t;
1002  if (x >= t)
1003  val += val_add;
1004  else
1005  val -= val_add;
1006  val_add >>= 1;
1007  }
1008 
1009  t = seg * 32 + (val << seg2);
1010  y = t * t - x;
1011  if (y <= 0) {
1012  t = seg * 32 + (val + 1 << seg2);
1013  t = t * t - x;
1014  val = (seg2 - 1 << 4) + val;
1015  if (t >= y)
1016  val++;
1017  } else {
1018  t = seg * 32 + (val - 1 << seg2);
1019  t = t * t - x;
1020  val = (seg2 - 1 << 4) + val;
1021  if (t >= y)
1022  val--;
1023  }
1024 
1025  return val;
1026 }
1027 
1029 {
1030  int i, j, idx, t;
1031  int off[SUBFRAMES];
1032  int signs[SUBFRAMES / 2 * 11], pos[SUBFRAMES / 2 * 11];
1033  int tmp[SUBFRAME_LEN * 2];
1034  int16_t *vector_ptr;
1035  int64_t sum;
1036  int b0, c, delta, x, shift;
1037 
1038  p->pitch_lag[0] = cng_rand(&p->cng_random_seed, 21) + 123;
1039  p->pitch_lag[1] = cng_rand(&p->cng_random_seed, 19) + 123;
1040 
1041  for (i = 0; i < SUBFRAMES; i++) {
1042  p->subframe[i].ad_cb_gain = cng_rand(&p->cng_random_seed, 50) + 1;
1044  }
1045 
1046  for (i = 0; i < SUBFRAMES / 2; i++) {
1047  t = cng_rand(&p->cng_random_seed, 1 << 13);
1048  off[i * 2] = t & 1;
1049  off[i * 2 + 1] = ((t >> 1) & 1) + SUBFRAME_LEN;
1050  t >>= 2;
1051  for (j = 0; j < 11; j++) {
1052  signs[i * 11 + j] = (t & 1) * 2 - 1 << 14;
1053  t >>= 1;
1054  }
1055  }
1056 
1057  idx = 0;
1058  for (i = 0; i < SUBFRAMES; i++) {
1059  for (j = 0; j < SUBFRAME_LEN / 2; j++)
1060  tmp[j] = j;
1061  t = SUBFRAME_LEN / 2;
1062  for (j = 0; j < pulses[i]; j++, idx++) {
1063  int idx2 = cng_rand(&p->cng_random_seed, t);
1064 
1065  pos[idx] = tmp[idx2] * 2 + off[i];
1066  tmp[idx2] = tmp[--t];
1067  }
1068  }
1069 
1070  vector_ptr = p->audio + LPC_ORDER;
1071  memcpy(vector_ptr, p->prev_excitation,
1072  PITCH_MAX * sizeof(*p->excitation));
1073  for (i = 0; i < SUBFRAMES; i += 2) {
1074  gen_acb_excitation(vector_ptr, vector_ptr,
1075  p->pitch_lag[i >> 1], &p->subframe[i],
1076  p->cur_rate);
1077  gen_acb_excitation(vector_ptr + SUBFRAME_LEN,
1078  vector_ptr + SUBFRAME_LEN,
1079  p->pitch_lag[i >> 1], &p->subframe[i + 1],
1080  p->cur_rate);
1081 
1082  t = 0;
1083  for (j = 0; j < SUBFRAME_LEN * 2; j++)
1084  t |= FFABS(vector_ptr[j]);
1085  t = FFMIN(t, 0x7FFF);
1086  if (!t) {
1087  shift = 0;
1088  } else {
1089  shift = -10 + av_log2(t);
1090  if (shift < -2)
1091  shift = -2;
1092  }
1093  sum = 0;
1094  if (shift < 0) {
1095  for (j = 0; j < SUBFRAME_LEN * 2; j++) {
1096  t = vector_ptr[j] << -shift;
1097  sum += t * t;
1098  tmp[j] = t;
1099  }
1100  } else {
1101  for (j = 0; j < SUBFRAME_LEN * 2; j++) {
1102  t = vector_ptr[j] >> shift;
1103  sum += t * t;
1104  tmp[j] = t;
1105  }
1106  }
1107 
1108  b0 = 0;
1109  for (j = 0; j < 11; j++)
1110  b0 += tmp[pos[(i / 2) * 11 + j]] * signs[(i / 2) * 11 + j];
1111  b0 = b0 * 2 * 2979LL + (1 << 29) >> 30; // approximated division by 11
1112 
1113  c = p->cur_gain * (p->cur_gain * SUBFRAME_LEN >> 5);
1114  if (shift * 2 + 3 >= 0)
1115  c >>= shift * 2 + 3;
1116  else
1117  c <<= -(shift * 2 + 3);
1118  c = (av_clipl_int32(sum << 1) - c) * 2979LL >> 15;
1119 
1120  delta = b0 * b0 * 2 - c;
1121  if (delta <= 0) {
1122  x = -b0;
1123  } else {
1124  delta = square_root(delta);
1125  x = delta - b0;
1126  t = delta + b0;
1127  if (FFABS(t) < FFABS(x))
1128  x = -t;
1129  }
1130  shift++;
1131  if (shift < 0)
1132  x >>= -shift;
1133  else
1134  x <<= shift;
1135  x = av_clip(x, -10000, 10000);
1136 
1137  for (j = 0; j < 11; j++) {
1138  idx = (i / 2) * 11 + j;
1139  vector_ptr[pos[idx]] = av_clip_int16(vector_ptr[pos[idx]] +
1140  (x * signs[idx] >> 15));
1141  }
1142 
1143  /* copy decoded data to serve as a history for the next decoded subframes */
1144  memcpy(vector_ptr + PITCH_MAX, vector_ptr,
1145  sizeof(*vector_ptr) * SUBFRAME_LEN * 2);
1146  vector_ptr += SUBFRAME_LEN * 2;
1147  }
1148  /* Save the excitation for the next frame */
1149  memcpy(p->prev_excitation, p->audio + LPC_ORDER + FRAME_LEN,
1150  PITCH_MAX * sizeof(*p->excitation));
1151 }
1152 
1153 static int g723_1_decode_frame(AVCodecContext *avctx, void *data,
1154  int *got_frame_ptr, AVPacket *avpkt)
1155 {
1156  G723_1_Context *p = avctx->priv_data;
1157  AVFrame *frame = data;
1158  const uint8_t *buf = avpkt->data;
1159  int buf_size = avpkt->size;
1160  int dec_mode = buf[0] & 3;
1161 
1162  PPFParam ppf[SUBFRAMES];
1163  int16_t cur_lsp[LPC_ORDER];
1164  int16_t lpc[SUBFRAMES * LPC_ORDER];
1165  int16_t acb_vector[SUBFRAME_LEN];
1166  int16_t *out;
1167  int bad_frame = 0, i, j, ret;
1168  int16_t *audio = p->audio;
1169 
1170  if (buf_size < frame_size[dec_mode]) {
1171  if (buf_size)
1172  av_log(avctx, AV_LOG_WARNING,
1173  "Expected %d bytes, got %d - skipping packet\n",
1174  frame_size[dec_mode], buf_size);
1175  *got_frame_ptr = 0;
1176  return buf_size;
1177  }
1178 
1179  if (unpack_bitstream(p, buf, buf_size) < 0) {
1180  bad_frame = 1;
1181  if (p->past_frame_type == ACTIVE_FRAME)
1183  else
1185  }
1186 
1187  frame->nb_samples = FRAME_LEN;
1188  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1189  return ret;
1190 
1191  out = (int16_t *)frame->data[0];
1192 
1193  if (p->cur_frame_type == ACTIVE_FRAME) {
1194  if (!bad_frame)
1195  p->erased_frames = 0;
1196  else if (p->erased_frames != 3)
1197  p->erased_frames++;
1198 
1199  inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, bad_frame);
1200  lsp_interpolate(lpc, cur_lsp, p->prev_lsp);
1201 
1202  /* Save the lsp_vector for the next frame */
1203  memcpy(p->prev_lsp, cur_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
1204 
1205  /* Generate the excitation for the frame */
1206  memcpy(p->excitation, p->prev_excitation,
1207  PITCH_MAX * sizeof(*p->excitation));
1208  if (!p->erased_frames) {
1209  int16_t *vector_ptr = p->excitation + PITCH_MAX;
1210 
1211  /* Update interpolation gain memory */
1213  p->subframe[3].amp_index) >> 1];
1214  for (i = 0; i < SUBFRAMES; i++) {
1215  gen_fcb_excitation(vector_ptr, &p->subframe[i], p->cur_rate,
1216  p->pitch_lag[i >> 1], i);
1217  gen_acb_excitation(acb_vector, &p->excitation[SUBFRAME_LEN * i],
1218  p->pitch_lag[i >> 1], &p->subframe[i],
1219  p->cur_rate);
1220  /* Get the total excitation */
1221  for (j = 0; j < SUBFRAME_LEN; j++) {
1222  int v = av_clip_int16(vector_ptr[j] << 1);
1223  vector_ptr[j] = av_clip_int16(v + acb_vector[j]);
1224  }
1225  vector_ptr += SUBFRAME_LEN;
1226  }
1227 
1228  vector_ptr = p->excitation + PITCH_MAX;
1229 
1231  &p->sid_gain, &p->cur_gain);
1232 
1233  /* Peform pitch postfiltering */
1234  if (p->postfilter) {
1235  i = PITCH_MAX;
1236  for (j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
1237  comp_ppf_coeff(p, i, p->pitch_lag[j >> 1],
1238  ppf + j, p->cur_rate);
1239 
1240  for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
1242  vector_ptr + i,
1243  vector_ptr + i + ppf[j].index,
1244  ppf[j].sc_gain,
1245  ppf[j].opt_gain,
1246  1 << 14, 15, SUBFRAME_LEN);
1247  } else {
1248  audio = vector_ptr - LPC_ORDER;
1249  }
1250 
1251  /* Save the excitation for the next frame */
1252  memcpy(p->prev_excitation, p->excitation + FRAME_LEN,
1253  PITCH_MAX * sizeof(*p->excitation));
1254  } else {
1255  p->interp_gain = (p->interp_gain * 3 + 2) >> 2;
1256  if (p->erased_frames == 3) {
1257  /* Mute output */
1258  memset(p->excitation, 0,
1259  (FRAME_LEN + PITCH_MAX) * sizeof(*p->excitation));
1260  memset(p->prev_excitation, 0,
1261  PITCH_MAX * sizeof(*p->excitation));
1262  memset(frame->data[0], 0,
1263  (FRAME_LEN + LPC_ORDER) * sizeof(int16_t));
1264  } else {
1265  int16_t *buf = p->audio + LPC_ORDER;
1266 
1267  /* Regenerate frame */
1269  p->interp_gain, &p->random_seed);
1270 
1271  /* Save the excitation for the next frame */
1272  memcpy(p->prev_excitation, buf + (FRAME_LEN - PITCH_MAX),
1273  PITCH_MAX * sizeof(*p->excitation));
1274  }
1275  }
1277  } else {
1278  if (p->cur_frame_type == SID_FRAME) {
1280  inverse_quant(p->sid_lsp, p->prev_lsp, p->lsp_index, 0);
1281  } else if (p->past_frame_type == ACTIVE_FRAME) {
1282  p->sid_gain = estimate_sid_gain(p);
1283  }
1284 
1285  if (p->past_frame_type == ACTIVE_FRAME)
1286  p->cur_gain = p->sid_gain;
1287  else
1288  p->cur_gain = (p->cur_gain * 7 + p->sid_gain) >> 3;
1289  generate_noise(p);
1290  lsp_interpolate(lpc, p->sid_lsp, p->prev_lsp);
1291  /* Save the lsp_vector for the next frame */
1292  memcpy(p->prev_lsp, p->sid_lsp, LPC_ORDER * sizeof(*p->prev_lsp));
1293  }
1294 
1296 
1297  memcpy(p->audio, p->synth_mem, LPC_ORDER * sizeof(*p->audio));
1298  for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
1299  ff_celp_lp_synthesis_filter(p->audio + i, &lpc[j * LPC_ORDER],
1300  audio + i, SUBFRAME_LEN, LPC_ORDER,
1301  0, 1, 1 << 12);
1302  memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio));
1303 
1304  if (p->postfilter) {
1305  formant_postfilter(p, lpc, p->audio, out);
1306  } else { // if output is not postfiltered it should be scaled by 2
1307  for (i = 0; i < FRAME_LEN; i++)
1308  out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1);
1309  }
1310 
1311  *got_frame_ptr = 1;
1312 
1313  return frame_size[dec_mode];
1314 }
1315 
1316 #define OFFSET(x) offsetof(G723_1_Context, x)
1317 #define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1318 
1319 static const AVOption options[] = {
1320  { "postfilter", "postfilter on/off", OFFSET(postfilter), AV_OPT_TYPE_INT,
1321  { .i64 = 1 }, 0, 1, AD },
1322  { NULL }
1323 };
1324 
1325 
1326 static const AVClass g723_1dec_class = {
1327  .class_name = "G.723.1 decoder",
1328  .item_name = av_default_item_name,
1329  .option = options,
1330  .version = LIBAVUTIL_VERSION_INT,
1331 };
1332 
1334  .name = "g723_1",
1335  .type = AVMEDIA_TYPE_AUDIO,
1336  .id = AV_CODEC_ID_G723_1,
1337  .priv_data_size = sizeof(G723_1_Context),
1340  .long_name = NULL_IF_CONFIG_SMALL("G.723.1"),
1341  .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
1342  .priv_class = &g723_1dec_class,
1343 };
1344 
1345 #if CONFIG_G723_1_ENCODER
1346 #define BITSTREAM_WRITER_LE
1347 #include "put_bits.h"
1348 
1349 static av_cold int g723_1_encode_init(AVCodecContext *avctx)
1350 {
1351  G723_1_Context *p = avctx->priv_data;
1352 
1353  if (avctx->sample_rate != 8000) {
1354  av_log(avctx, AV_LOG_ERROR, "Only 8000Hz sample rate supported\n");
1355  return -1;
1356  }
1357 
1358  if (avctx->channels != 1) {
1359  av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
1360  return AVERROR(EINVAL);
1361  }
1362 
1363  if (avctx->bit_rate == 6300) {
1364  p->cur_rate = RATE_6300;
1365  } else if (avctx->bit_rate == 5300) {
1366  av_log(avctx, AV_LOG_ERROR, "Bitrate not supported yet, use 6.3k\n");
1367  return AVERROR_PATCHWELCOME;
1368  } else {
1369  av_log(avctx, AV_LOG_ERROR,
1370  "Bitrate not supported, use 6.3k\n");
1371  return AVERROR(EINVAL);
1372  }
1373  avctx->frame_size = 240;
1374  memcpy(p->prev_lsp, dc_lsp, LPC_ORDER * sizeof(int16_t));
1375 
1376  return 0;
1377 }
1378 
1379 /**
1380  * Remove DC component from the input signal.
1381  *
1382  * @param buf input signal
1383  * @param fir zero memory
1384  * @param iir pole memory
1385  */
1386 static void highpass_filter(int16_t *buf, int16_t *fir, int *iir)
1387 {
1388  int i;
1389  for (i = 0; i < FRAME_LEN; i++) {
1390  *iir = (buf[i] << 15) + ((-*fir) << 15) + MULL2(*iir, 0x7f00);
1391  *fir = buf[i];
1392  buf[i] = av_clipl_int32((int64_t)*iir + (1 << 15)) >> 16;
1393  }
1394 }
1395 
1396 /**
1397  * Estimate autocorrelation of the input vector.
1398  *
1399  * @param buf input buffer
1400  * @param autocorr autocorrelation coefficients vector
1401  */
1402 static void comp_autocorr(int16_t *buf, int16_t *autocorr)
1403 {
1404  int i, scale, temp;
1405  int16_t vector[LPC_FRAME];
1406 
1407  scale_vector(vector, buf, LPC_FRAME);
1408 
1409  /* Apply the Hamming window */
1410  for (i = 0; i < LPC_FRAME; i++)
1411  vector[i] = (vector[i] * hamming_window[i] + (1 << 14)) >> 15;
1412 
1413  /* Compute the first autocorrelation coefficient */
1414  temp = ff_dot_product(vector, vector, LPC_FRAME);
1415 
1416  /* Apply a white noise correlation factor of (1025/1024) */
1417  temp += temp >> 10;
1418 
1419  /* Normalize */
1420  scale = normalize_bits_int32(temp);
1421  autocorr[0] = av_clipl_int32((int64_t)(temp << scale) +
1422  (1 << 15)) >> 16;
1423 
1424  /* Compute the remaining coefficients */
1425  if (!autocorr[0]) {
1426  memset(autocorr + 1, 0, LPC_ORDER * sizeof(int16_t));
1427  } else {
1428  for (i = 1; i <= LPC_ORDER; i++) {
1429  temp = ff_dot_product(vector, vector + i, LPC_FRAME - i);
1430  temp = MULL2((temp << scale), binomial_window[i - 1]);
1431  autocorr[i] = av_clipl_int32((int64_t)temp + (1 << 15)) >> 16;
1432  }
1433  }
1434 }
1435 
1436 /**
1437  * Use Levinson-Durbin recursion to compute LPC coefficients from
1438  * autocorrelation values.
1439  *
1440  * @param lpc LPC coefficients vector
1441  * @param autocorr autocorrelation coefficients vector
1442  * @param error prediction error
1443  */
1444 static void levinson_durbin(int16_t *lpc, int16_t *autocorr, int16_t error)
1445 {
1446  int16_t vector[LPC_ORDER];
1447  int16_t partial_corr;
1448  int i, j, temp;
1449 
1450  memset(lpc, 0, LPC_ORDER * sizeof(int16_t));
1451 
1452  for (i = 0; i < LPC_ORDER; i++) {
1453  /* Compute the partial correlation coefficient */
1454  temp = 0;
1455  for (j = 0; j < i; j++)
1456  temp -= lpc[j] * autocorr[i - j - 1];
1457  temp = ((autocorr[i] << 13) + temp) << 3;
1458 
1459  if (FFABS(temp) >= (error << 16))
1460  break;
1461 
1462  partial_corr = temp / (error << 1);
1463 
1464  lpc[i] = av_clipl_int32((int64_t)(partial_corr << 14) +
1465  (1 << 15)) >> 16;
1466 
1467  /* Update the prediction error */
1468  temp = MULL2(temp, partial_corr);
1469  error = av_clipl_int32((int64_t)(error << 16) - temp +
1470  (1 << 15)) >> 16;
1471 
1472  memcpy(vector, lpc, i * sizeof(int16_t));
1473  for (j = 0; j < i; j++) {
1474  temp = partial_corr * vector[i - j - 1] << 1;
1475  lpc[j] = av_clipl_int32((int64_t)(lpc[j] << 16) - temp +
1476  (1 << 15)) >> 16;
1477  }
1478  }
1479 }
1480 
1481 /**
1482  * Calculate LPC coefficients for the current frame.
1483  *
1484  * @param buf current frame
1485  * @param prev_data 2 trailing subframes of the previous frame
1486  * @param lpc LPC coefficients vector
1487  */
1488 static void comp_lpc_coeff(int16_t *buf, int16_t *lpc)
1489 {
1490  int16_t autocorr[(LPC_ORDER + 1) * SUBFRAMES];
1491  int16_t *autocorr_ptr = autocorr;
1492  int16_t *lpc_ptr = lpc;
1493  int i, j;
1494 
1495  for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) {
1496  comp_autocorr(buf + i, autocorr_ptr);
1497  levinson_durbin(lpc_ptr, autocorr_ptr + 1, autocorr_ptr[0]);
1498 
1499  lpc_ptr += LPC_ORDER;
1500  autocorr_ptr += LPC_ORDER + 1;
1501  }
1502 }
1503 
1504 static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
1505 {
1506  int f[LPC_ORDER + 2]; ///< coefficients of the sum and difference
1507  ///< polynomials (F1, F2) ordered as
1508  ///< f1[0], f2[0], ...., f1[5], f2[5]
1509 
1510  int max, shift, cur_val, prev_val, count, p;
1511  int i, j;
1512  int64_t temp;
1513 
1514  /* Initialize f1[0] and f2[0] to 1 in Q25 */
1515  for (i = 0; i < LPC_ORDER; i++)
1516  lsp[i] = (lpc[i] * bandwidth_expand[i] + (1 << 14)) >> 15;
1517 
1518  /* Apply bandwidth expansion on the LPC coefficients */
1519  f[0] = f[1] = 1 << 25;
1520 
1521  /* Compute the remaining coefficients */
1522  for (i = 0; i < LPC_ORDER / 2; i++) {
1523  /* f1 */
1524  f[2 * i + 2] = -f[2 * i] - ((lsp[i] + lsp[LPC_ORDER - 1 - i]) << 12);
1525  /* f2 */
1526  f[2 * i + 3] = f[2 * i + 1] - ((lsp[i] - lsp[LPC_ORDER - 1 - i]) << 12);
1527  }
1528 
1529  /* Divide f1[5] and f2[5] by 2 for use in polynomial evaluation */
1530  f[LPC_ORDER] >>= 1;
1531  f[LPC_ORDER + 1] >>= 1;
1532 
1533  /* Normalize and shorten */
1534  max = FFABS(f[0]);
1535  for (i = 1; i < LPC_ORDER + 2; i++)
1536  max = FFMAX(max, FFABS(f[i]));
1537 
1538  shift = normalize_bits_int32(max);
1539 
1540  for (i = 0; i < LPC_ORDER + 2; i++)
1541  f[i] = av_clipl_int32((int64_t)(f[i] << shift) + (1 << 15)) >> 16;
1542 
1543  /**
1544  * Evaluate F1 and F2 at uniform intervals of pi/256 along the
1545  * unit circle and check for zero crossings.
1546  */
1547  p = 0;
1548  temp = 0;
1549  for (i = 0; i <= LPC_ORDER / 2; i++)
1550  temp += f[2 * i] * cos_tab[0];
1551  prev_val = av_clipl_int32(temp << 1);
1552  count = 0;
1553  for ( i = 1; i < COS_TBL_SIZE / 2; i++) {
1554  /* Evaluate */
1555  temp = 0;
1556  for (j = 0; j <= LPC_ORDER / 2; j++)
1557  temp += f[LPC_ORDER - 2 * j + p] * cos_tab[i * j % COS_TBL_SIZE];
1558  cur_val = av_clipl_int32(temp << 1);
1559 
1560  /* Check for sign change, indicating a zero crossing */
1561  if ((cur_val ^ prev_val) < 0) {
1562  int abs_cur = FFABS(cur_val);
1563  int abs_prev = FFABS(prev_val);
1564  int sum = abs_cur + abs_prev;
1565 
1566  shift = normalize_bits_int32(sum);
1567  sum <<= shift;
1568  abs_prev = abs_prev << shift >> 8;
1569  lsp[count++] = ((i - 1) << 7) + (abs_prev >> 1) / (sum >> 16);
1570 
1571  if (count == LPC_ORDER)
1572  break;
1573 
1574  /* Switch between sum and difference polynomials */
1575  p ^= 1;
1576 
1577  /* Evaluate */
1578  temp = 0;
1579  for (j = 0; j <= LPC_ORDER / 2; j++){
1580  temp += f[LPC_ORDER - 2 * j + p] *
1581  cos_tab[i * j % COS_TBL_SIZE];
1582  }
1583  cur_val = av_clipl_int32(temp<<1);
1584  }
1585  prev_val = cur_val;
1586  }
1587 
1588  if (count != LPC_ORDER)
1589  memcpy(lsp, prev_lsp, LPC_ORDER * sizeof(int16_t));
1590 }
1591 
1592 /**
1593  * Quantize the current LSP subvector.
1594  *
1595  * @param num band number
1596  * @param offset offset of the current subvector in an LPC_ORDER vector
1597  * @param size size of the current subvector
1598  */
1599 #define get_index(num, offset, size) \
1600 {\
1601  int error, max = -1;\
1602  int16_t temp[4];\
1603  int i, j;\
1604  for (i = 0; i < LSP_CB_SIZE; i++) {\
1605  for (j = 0; j < size; j++){\
1606  temp[j] = (weight[j + (offset)] * lsp_band##num[i][j] +\
1607  (1 << 14)) >> 15;\
1608  }\
1609  error = dot_product(lsp + (offset), temp, size) << 1;\
1610  error -= dot_product(lsp_band##num[i], temp, size);\
1611  if (error > max) {\
1612  max = error;\
1613  lsp_index[num] = i;\
1614  }\
1615  }\
1616 }
1617 
1618 /**
1619  * Vector quantize the LSP frequencies.
1620  *
1621  * @param lsp the current lsp vector
1622  * @param prev_lsp the previous lsp vector
1623  */
1624 static void lsp_quantize(uint8_t *lsp_index, int16_t *lsp, int16_t *prev_lsp)
1625 {
1626  int16_t weight[LPC_ORDER];
1627  int16_t min, max;
1628  int shift, i;
1629 
1630  /* Calculate the VQ weighting vector */
1631  weight[0] = (1 << 20) / (lsp[1] - lsp[0]);
1632  weight[LPC_ORDER - 1] = (1 << 20) /
1633  (lsp[LPC_ORDER - 1] - lsp[LPC_ORDER - 2]);
1634 
1635  for (i = 1; i < LPC_ORDER - 1; i++) {
1636  min = FFMIN(lsp[i] - lsp[i - 1], lsp[i + 1] - lsp[i]);
1637  if (min > 0x20)
1638  weight[i] = (1 << 20) / min;
1639  else
1640  weight[i] = INT16_MAX;
1641  }
1642 
1643  /* Normalize */
1644  max = 0;
1645  for (i = 0; i < LPC_ORDER; i++)
1646  max = FFMAX(weight[i], max);
1647 
1648  shift = normalize_bits_int16(max);
1649  for (i = 0; i < LPC_ORDER; i++) {
1650  weight[i] <<= shift;
1651  }
1652 
1653  /* Compute the VQ target vector */
1654  for (i = 0; i < LPC_ORDER; i++) {
1655  lsp[i] -= dc_lsp[i] +
1656  (((prev_lsp[i] - dc_lsp[i]) * 12288 + (1 << 14)) >> 15);
1657  }
1658 
1659  get_index(0, 0, 3);
1660  get_index(1, 3, 3);
1661  get_index(2, 6, 4);
1662 }
1663 
1664 /**
1665  * Apply the formant perceptual weighting filter.
1666  *
1667  * @param flt_coef filter coefficients
1668  * @param unq_lpc unquantized lpc vector
1669  */
1670 static void perceptual_filter(G723_1_Context *p, int16_t *flt_coef,
1671  int16_t *unq_lpc, int16_t *buf)
1672 {
1673  int16_t vector[FRAME_LEN + LPC_ORDER];
1674  int i, j, k, l = 0;
1675 
1676  memcpy(buf, p->iir_mem, sizeof(int16_t) * LPC_ORDER);
1677  memcpy(vector, p->fir_mem, sizeof(int16_t) * LPC_ORDER);
1678  memcpy(vector + LPC_ORDER, buf + LPC_ORDER, sizeof(int16_t) * FRAME_LEN);
1679 
1680  for (i = LPC_ORDER, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++) {
1681  for (k = 0; k < LPC_ORDER; k++) {
1682  flt_coef[k + 2 * l] = (unq_lpc[k + l] * percept_flt_tbl[0][k] +
1683  (1 << 14)) >> 15;
1684  flt_coef[k + 2 * l + LPC_ORDER] = (unq_lpc[k + l] *
1685  percept_flt_tbl[1][k] +
1686  (1 << 14)) >> 15;
1687  }
1688  iir_filter(flt_coef + 2 * l, flt_coef + 2 * l + LPC_ORDER, vector + i,
1689  buf + i, 0);
1690  l += LPC_ORDER;
1691  }
1692  memcpy(p->iir_mem, buf + FRAME_LEN, sizeof(int16_t) * LPC_ORDER);
1693  memcpy(p->fir_mem, vector + FRAME_LEN, sizeof(int16_t) * LPC_ORDER);
1694 }
1695 
1696 /**
1697  * Estimate the open loop pitch period.
1698  *
1699  * @param buf perceptually weighted speech
1700  * @param start estimation is carried out from this position
1701  */
1702 static int estimate_pitch(int16_t *buf, int start)
1703 {
1704  int max_exp = 32;
1705  int max_ccr = 0x4000;
1706  int max_eng = 0x7fff;
1707  int index = PITCH_MIN;
1708  int offset = start - PITCH_MIN + 1;
1709 
1710  int ccr, eng, orig_eng, ccr_eng, exp;
1711  int diff, temp;
1712 
1713  int i;
1714 
1715  orig_eng = ff_dot_product(buf + offset, buf + offset, HALF_FRAME_LEN);
1716 
1717  for (i = PITCH_MIN; i <= PITCH_MAX - 3; i++) {
1718  offset--;
1719 
1720  /* Update energy and compute correlation */
1721  orig_eng += buf[offset] * buf[offset] -
1722  buf[offset + HALF_FRAME_LEN] * buf[offset + HALF_FRAME_LEN];
1723  ccr = ff_dot_product(buf + start, buf + offset, HALF_FRAME_LEN);
1724  if (ccr <= 0)
1725  continue;
1726 
1727  /* Split into mantissa and exponent to maintain precision */
1728  exp = normalize_bits_int32(ccr);
1729  ccr = av_clipl_int32((int64_t)(ccr << exp) + (1 << 15)) >> 16;
1730  exp <<= 1;
1731  ccr *= ccr;
1732  temp = normalize_bits_int32(ccr);
1733  ccr = ccr << temp >> 16;
1734  exp += temp;
1735 
1736  temp = normalize_bits_int32(orig_eng);
1737  eng = av_clipl_int32((int64_t)(orig_eng << temp) + (1 << 15)) >> 16;
1738  exp -= temp;
1739 
1740  if (ccr >= eng) {
1741  exp--;
1742  ccr >>= 1;
1743  }
1744  if (exp > max_exp)
1745  continue;
1746 
1747  if (exp + 1 < max_exp)
1748  goto update;
1749 
1750  /* Equalize exponents before comparison */
1751  if (exp + 1 == max_exp)
1752  temp = max_ccr >> 1;
1753  else
1754  temp = max_ccr;
1755  ccr_eng = ccr * max_eng;
1756  diff = ccr_eng - eng * temp;
1757  if (diff > 0 && (i - index < PITCH_MIN || diff > ccr_eng >> 2)) {
1758 update:
1759  index = i;
1760  max_exp = exp;
1761  max_ccr = ccr;
1762  max_eng = eng;
1763  }
1764  }
1765  return index;
1766 }
1767 
1768 /**
1769  * Compute harmonic noise filter parameters.
1770  *
1771  * @param buf perceptually weighted speech
1772  * @param pitch_lag open loop pitch period
1773  * @param hf harmonic filter parameters
1774  */
1775 static void comp_harmonic_coeff(int16_t *buf, int16_t pitch_lag, HFParam *hf)
1776 {
1777  int ccr, eng, max_ccr, max_eng;
1778  int exp, max, diff;
1779  int energy[15];
1780  int i, j;
1781 
1782  for (i = 0, j = pitch_lag - 3; j <= pitch_lag + 3; i++, j++) {
1783  /* Compute residual energy */
1784  energy[i << 1] = ff_dot_product(buf - j, buf - j, SUBFRAME_LEN);
1785  /* Compute correlation */
1786  energy[(i << 1) + 1] = ff_dot_product(buf, buf - j, SUBFRAME_LEN);
1787  }
1788 
1789  /* Compute target energy */
1790  energy[14] = ff_dot_product(buf, buf, SUBFRAME_LEN);
1791 
1792  /* Normalize */
1793  max = 0;
1794  for (i = 0; i < 15; i++)
1795  max = FFMAX(max, FFABS(energy[i]));
1796 
1797  exp = normalize_bits_int32(max);
1798  for (i = 0; i < 15; i++) {
1799  energy[i] = av_clipl_int32((int64_t)(energy[i] << exp) +
1800  (1 << 15)) >> 16;
1801  }
1802 
1803  hf->index = -1;
1804  hf->gain = 0;
1805  max_ccr = 1;
1806  max_eng = 0x7fff;
1807 
1808  for (i = 0; i <= 6; i++) {
1809  eng = energy[i << 1];
1810  ccr = energy[(i << 1) + 1];
1811 
1812  if (ccr <= 0)
1813  continue;
1814 
1815  ccr = (ccr * ccr + (1 << 14)) >> 15;
1816  diff = ccr * max_eng - eng * max_ccr;
1817  if (diff > 0) {
1818  max_ccr = ccr;
1819  max_eng = eng;
1820  hf->index = i;
1821  }
1822  }
1823 
1824  if (hf->index == -1) {
1825  hf->index = pitch_lag;
1826  return;
1827  }
1828 
1829  eng = energy[14] * max_eng;
1830  eng = (eng >> 2) + (eng >> 3);
1831  ccr = energy[(hf->index << 1) + 1] * energy[(hf->index << 1) + 1];
1832  if (eng < ccr) {
1833  eng = energy[(hf->index << 1) + 1];
1834 
1835  if (eng >= max_eng)
1836  hf->gain = 0x2800;
1837  else
1838  hf->gain = ((eng << 15) / max_eng * 0x2800 + (1 << 14)) >> 15;
1839  }
1840  hf->index += pitch_lag - 3;
1841 }
1842 
1843 /**
1844  * Apply the harmonic noise shaping filter.
1845  *
1846  * @param hf filter parameters
1847  */
1848 static void harmonic_filter(HFParam *hf, const int16_t *src, int16_t *dest)
1849 {
1850  int i;
1851 
1852  for (i = 0; i < SUBFRAME_LEN; i++) {
1853  int64_t temp = hf->gain * src[i - hf->index] << 1;
1854  dest[i] = av_clipl_int32((src[i] << 16) - temp + (1 << 15)) >> 16;
1855  }
1856 }
1857 
1858 static void harmonic_noise_sub(HFParam *hf, const int16_t *src, int16_t *dest)
1859 {
1860  int i;
1861  for (i = 0; i < SUBFRAME_LEN; i++) {
1862  int64_t temp = hf->gain * src[i - hf->index] << 1;
1863  dest[i] = av_clipl_int32(((dest[i] - src[i]) << 16) + temp +
1864  (1 << 15)) >> 16;
1865 
1866  }
1867 }
1868 
1869 /**
1870  * Combined synthesis and formant perceptual weighting filer.
1871  *
1872  * @param qnt_lpc quantized lpc coefficients
1873  * @param perf_lpc perceptual filter coefficients
1874  * @param perf_fir perceptual filter fir memory
1875  * @param perf_iir perceptual filter iir memory
1876  * @param scale the filter output will be scaled by 2^scale
1877  */
1878 static void synth_percept_filter(int16_t *qnt_lpc, int16_t *perf_lpc,
1879  int16_t *perf_fir, int16_t *perf_iir,
1880  const int16_t *src, int16_t *dest, int scale)
1881 {
1882  int i, j;
1883  int16_t buf_16[SUBFRAME_LEN + LPC_ORDER];
1884  int64_t buf[SUBFRAME_LEN];
1885 
1886  int16_t *bptr_16 = buf_16 + LPC_ORDER;
1887 
1888  memcpy(buf_16, perf_fir, sizeof(int16_t) * LPC_ORDER);
1889  memcpy(dest - LPC_ORDER, perf_iir, sizeof(int16_t) * LPC_ORDER);
1890 
1891  for (i = 0; i < SUBFRAME_LEN; i++) {
1892  int64_t temp = 0;
1893  for (j = 1; j <= LPC_ORDER; j++)
1894  temp -= qnt_lpc[j - 1] * bptr_16[i - j];
1895 
1896  buf[i] = (src[i] << 15) + (temp << 3);
1897  bptr_16[i] = av_clipl_int32(buf[i] + (1 << 15)) >> 16;
1898  }
1899 
1900  for (i = 0; i < SUBFRAME_LEN; i++) {
1901  int64_t fir = 0, iir = 0;
1902  for (j = 1; j <= LPC_ORDER; j++) {
1903  fir -= perf_lpc[j - 1] * bptr_16[i - j];
1904  iir += perf_lpc[j + LPC_ORDER - 1] * dest[i - j];
1905  }
1906  dest[i] = av_clipl_int32(((buf[i] + (fir << 3)) << scale) + (iir << 3) +
1907  (1 << 15)) >> 16;
1908  }
1909  memcpy(perf_fir, buf_16 + SUBFRAME_LEN, sizeof(int16_t) * LPC_ORDER);
1910  memcpy(perf_iir, dest + SUBFRAME_LEN - LPC_ORDER,
1911  sizeof(int16_t) * LPC_ORDER);
1912 }
1913 
1914 /**
1915  * Compute the adaptive codebook contribution.
1916  *
1917  * @param buf input signal
1918  * @param index the current subframe index
1919  */
1920 static void acb_search(G723_1_Context *p, int16_t *residual,
1921  int16_t *impulse_resp, const int16_t *buf,
1922  int index)
1923 {
1924 
1925  int16_t flt_buf[PITCH_ORDER][SUBFRAME_LEN];
1926 
1927  const int16_t *cb_tbl = adaptive_cb_gain85;
1928 
1929  int ccr_buf[PITCH_ORDER * SUBFRAMES << 2];
1930 
1931  int pitch_lag = p->pitch_lag[index >> 1];
1932  int acb_lag = 1;
1933  int acb_gain = 0;
1934  int odd_frame = index & 1;
1935  int iter = 3 + odd_frame;
1936  int count = 0;
1937  int tbl_size = 85;
1938 
1939  int i, j, k, l, max;
1940  int64_t temp;
1941 
1942  if (!odd_frame) {
1943  if (pitch_lag == PITCH_MIN)
1944  pitch_lag++;
1945  else
1946  pitch_lag = FFMIN(pitch_lag, PITCH_MAX - 5);
1947  }
1948 
1949  for (i = 0; i < iter; i++) {
1950  get_residual(residual, p->prev_excitation, pitch_lag + i - 1);
1951 
1952  for (j = 0; j < SUBFRAME_LEN; j++) {
1953  temp = 0;
1954  for (k = 0; k <= j; k++)
1955  temp += residual[PITCH_ORDER - 1 + k] * impulse_resp[j - k];
1956  flt_buf[PITCH_ORDER - 1][j] = av_clipl_int32((temp << 1) +
1957  (1 << 15)) >> 16;
1958  }
1959 
1960  for (j = PITCH_ORDER - 2; j >= 0; j--) {
1961  flt_buf[j][0] = ((residual[j] << 13) + (1 << 14)) >> 15;
1962  for (k = 1; k < SUBFRAME_LEN; k++) {
1963  temp = (flt_buf[j + 1][k - 1] << 15) +
1964  residual[j] * impulse_resp[k];
1965  flt_buf[j][k] = av_clipl_int32((temp << 1) + (1 << 15)) >> 16;
1966  }
1967  }
1968 
1969  /* Compute crosscorrelation with the signal */
1970  for (j = 0; j < PITCH_ORDER; j++) {
1971  temp = ff_dot_product(buf, flt_buf[j], SUBFRAME_LEN);
1972  ccr_buf[count++] = av_clipl_int32(temp << 1);
1973  }
1974 
1975  /* Compute energies */
1976  for (j = 0; j < PITCH_ORDER; j++) {
1977  ccr_buf[count++] = dot_product(flt_buf[j], flt_buf[j],
1978  SUBFRAME_LEN);
1979  }
1980 
1981  for (j = 1; j < PITCH_ORDER; j++) {
1982  for (k = 0; k < j; k++) {
1983  temp = ff_dot_product(flt_buf[j], flt_buf[k], SUBFRAME_LEN);
1984  ccr_buf[count++] = av_clipl_int32(temp<<2);
1985  }
1986  }
1987  }
1988 
1989  /* Normalize and shorten */
1990  max = 0;
1991  for (i = 0; i < 20 * iter; i++)
1992  max = FFMAX(max, FFABS(ccr_buf[i]));
1993 
1994  temp = normalize_bits_int32(max);
1995 
1996  for (i = 0; i < 20 * iter; i++){
1997  ccr_buf[i] = av_clipl_int32((int64_t)(ccr_buf[i] << temp) +
1998  (1 << 15)) >> 16;
1999  }
2000 
2001  max = 0;
2002  for (i = 0; i < iter; i++) {
2003  /* Select quantization table */
2004  if (!odd_frame && pitch_lag + i - 1 >= SUBFRAME_LEN - 2 ||
2005  odd_frame && pitch_lag >= SUBFRAME_LEN - 2) {
2006  cb_tbl = adaptive_cb_gain170;
2007  tbl_size = 170;
2008  }
2009 
2010  for (j = 0, k = 0; j < tbl_size; j++, k += 20) {
2011  temp = 0;
2012  for (l = 0; l < 20; l++)
2013  temp += ccr_buf[20 * i + l] * cb_tbl[k + l];
2014  temp = av_clipl_int32(temp);
2015 
2016  if (temp > max) {
2017  max = temp;
2018  acb_gain = j;
2019  acb_lag = i;
2020  }
2021  }
2022  }
2023 
2024  if (!odd_frame) {
2025  pitch_lag += acb_lag - 1;
2026  acb_lag = 1;
2027  }
2028 
2029  p->pitch_lag[index >> 1] = pitch_lag;
2030  p->subframe[index].ad_cb_lag = acb_lag;
2031  p->subframe[index].ad_cb_gain = acb_gain;
2032 }
2033 
2034 /**
2035  * Subtract the adaptive codebook contribution from the input
2036  * to obtain the residual.
2037  *
2038  * @param buf target vector
2039  */
2040 static void sub_acb_contrib(const int16_t *residual, const int16_t *impulse_resp,
2041  int16_t *buf)
2042 {
2043  int i, j;
2044  /* Subtract adaptive CB contribution to obtain the residual */
2045  for (i = 0; i < SUBFRAME_LEN; i++) {
2046  int64_t temp = buf[i] << 14;
2047  for (j = 0; j <= i; j++)
2048  temp -= residual[j] * impulse_resp[i - j];
2049 
2050  buf[i] = av_clipl_int32((temp << 2) + (1 << 15)) >> 16;
2051  }
2052 }
2053 
2054 /**
2055  * Quantize the residual signal using the fixed codebook (MP-MLQ).
2056  *
2057  * @param optim optimized fixed codebook parameters
2058  * @param buf excitation vector
2059  */
2060 static void get_fcb_param(FCBParam *optim, int16_t *impulse_resp,
2061  int16_t *buf, int pulse_cnt, int pitch_lag)
2062 {
2063  FCBParam param;
2064  int16_t impulse_r[SUBFRAME_LEN];
2065  int16_t temp_corr[SUBFRAME_LEN];
2066  int16_t impulse_corr[SUBFRAME_LEN];
2067 
2068  int ccr1[SUBFRAME_LEN];
2069  int ccr2[SUBFRAME_LEN];
2070  int amp, err, max, max_amp_index, min, scale, i, j, k, l;
2071 
2072  int64_t temp;
2073 
2074  /* Update impulse response */
2075  memcpy(impulse_r, impulse_resp, sizeof(int16_t) * SUBFRAME_LEN);
2076  param.dirac_train = 0;
2077  if (pitch_lag < SUBFRAME_LEN - 2) {
2078  param.dirac_train = 1;
2079  gen_dirac_train(impulse_r, pitch_lag);
2080  }
2081 
2082  for (i = 0; i < SUBFRAME_LEN; i++)
2083  temp_corr[i] = impulse_r[i] >> 1;
2084 
2085  /* Compute impulse response autocorrelation */
2086  temp = dot_product(temp_corr, temp_corr, SUBFRAME_LEN);
2087 
2088  scale = normalize_bits_int32(temp);
2089  impulse_corr[0] = av_clipl_int32((temp << scale) + (1 << 15)) >> 16;
2090 
2091  for (i = 1; i < SUBFRAME_LEN; i++) {
2092  temp = dot_product(temp_corr + i, temp_corr, SUBFRAME_LEN - i);
2093  impulse_corr[i] = av_clipl_int32((temp << scale) + (1 << 15)) >> 16;
2094  }
2095 
2096  /* Compute crosscorrelation of impulse response with residual signal */
2097  scale -= 4;
2098  for (i = 0; i < SUBFRAME_LEN; i++){
2099  temp = dot_product(buf + i, impulse_r, SUBFRAME_LEN - i);
2100  if (scale < 0)
2101  ccr1[i] = temp >> -scale;
2102  else
2103  ccr1[i] = av_clipl_int32(temp << scale);
2104  }
2105 
2106  /* Search loop */
2107  for (i = 0; i < GRID_SIZE; i++) {
2108  /* Maximize the crosscorrelation */
2109  max = 0;
2110  for (j = i; j < SUBFRAME_LEN; j += GRID_SIZE) {
2111  temp = FFABS(ccr1[j]);
2112  if (temp >= max) {
2113  max = temp;
2114  param.pulse_pos[0] = j;
2115  }
2116  }
2117 
2118  /* Quantize the gain (max crosscorrelation/impulse_corr[0]) */
2119  amp = max;
2120  min = 1 << 30;
2121  max_amp_index = GAIN_LEVELS - 2;
2122  for (j = max_amp_index; j >= 2; j--) {
2123  temp = av_clipl_int32((int64_t)fixed_cb_gain[j] *
2124  impulse_corr[0] << 1);
2125  temp = FFABS(temp - amp);
2126  if (temp < min) {
2127  min = temp;
2128  max_amp_index = j;
2129  }
2130  }
2131 
2132  max_amp_index--;
2133  /* Select additional gain values */
2134  for (j = 1; j < 5; j++) {
2135  for (k = i; k < SUBFRAME_LEN; k += GRID_SIZE) {
2136  temp_corr[k] = 0;
2137  ccr2[k] = ccr1[k];
2138  }
2139  param.amp_index = max_amp_index + j - 2;
2140  amp = fixed_cb_gain[param.amp_index];
2141 
2142  param.pulse_sign[0] = (ccr2[param.pulse_pos[0]] < 0) ? -amp : amp;
2143  temp_corr[param.pulse_pos[0]] = 1;
2144 
2145  for (k = 1; k < pulse_cnt; k++) {
2146  max = -1 << 30;
2147  for (l = i; l < SUBFRAME_LEN; l += GRID_SIZE) {
2148  if (temp_corr[l])
2149  continue;
2150  temp = impulse_corr[FFABS(l - param.pulse_pos[k - 1])];
2151  temp = av_clipl_int32((int64_t)temp *
2152  param.pulse_sign[k - 1] << 1);
2153  ccr2[l] -= temp;
2154  temp = FFABS(ccr2[l]);
2155  if (temp > max) {
2156  max = temp;
2157  param.pulse_pos[k] = l;
2158  }
2159  }
2160 
2161  param.pulse_sign[k] = (ccr2[param.pulse_pos[k]] < 0) ?
2162  -amp : amp;
2163  temp_corr[param.pulse_pos[k]] = 1;
2164  }
2165 
2166  /* Create the error vector */
2167  memset(temp_corr, 0, sizeof(int16_t) * SUBFRAME_LEN);
2168 
2169  for (k = 0; k < pulse_cnt; k++)
2170  temp_corr[param.pulse_pos[k]] = param.pulse_sign[k];
2171 
2172  for (k = SUBFRAME_LEN - 1; k >= 0; k--) {
2173  temp = 0;
2174  for (l = 0; l <= k; l++) {
2175  int prod = av_clipl_int32((int64_t)temp_corr[l] *
2176  impulse_r[k - l] << 1);
2177  temp = av_clipl_int32(temp + prod);
2178  }
2179  temp_corr[k] = temp << 2 >> 16;
2180  }
2181 
2182  /* Compute square of error */
2183  err = 0;
2184  for (k = 0; k < SUBFRAME_LEN; k++) {
2185  int64_t prod;
2186  prod = av_clipl_int32((int64_t)buf[k] * temp_corr[k] << 1);
2187  err = av_clipl_int32(err - prod);
2188  prod = av_clipl_int32((int64_t)temp_corr[k] * temp_corr[k]);
2189  err = av_clipl_int32(err + prod);
2190  }
2191 
2192  /* Minimize */
2193  if (err < optim->min_err) {
2194  optim->min_err = err;
2195  optim->grid_index = i;
2196  optim->amp_index = param.amp_index;
2197  optim->dirac_train = param.dirac_train;
2198 
2199  for (k = 0; k < pulse_cnt; k++) {
2200  optim->pulse_sign[k] = param.pulse_sign[k];
2201  optim->pulse_pos[k] = param.pulse_pos[k];
2202  }
2203  }
2204  }
2205  }
2206 }
2207 
2208 /**
2209  * Encode the pulse position and gain of the current subframe.
2210  *
2211  * @param optim optimized fixed CB parameters
2212  * @param buf excitation vector
2213  */
2214 static void pack_fcb_param(G723_1_Subframe *subfrm, FCBParam *optim,
2215  int16_t *buf, int pulse_cnt)
2216 {
2217  int i, j;
2218 
2219  j = PULSE_MAX - pulse_cnt;
2220 
2221  subfrm->pulse_sign = 0;
2222  subfrm->pulse_pos = 0;
2223 
2224  for (i = 0; i < SUBFRAME_LEN >> 1; i++) {
2225  int val = buf[optim->grid_index + (i << 1)];
2226  if (!val) {
2227  subfrm->pulse_pos += combinatorial_table[j][i];
2228  } else {
2229  subfrm->pulse_sign <<= 1;
2230  if (val < 0) subfrm->pulse_sign++;
2231  j++;
2232 
2233  if (j == PULSE_MAX) break;
2234  }
2235  }
2236  subfrm->amp_index = optim->amp_index;
2237  subfrm->grid_index = optim->grid_index;
2238  subfrm->dirac_train = optim->dirac_train;
2239 }
2240 
2241 /**
2242  * Compute the fixed codebook excitation.
2243  *
2244  * @param buf target vector
2245  * @param impulse_resp impulse response of the combined filter
2246  */
2247 static void fcb_search(G723_1_Context *p, int16_t *impulse_resp,
2248  int16_t *buf, int index)
2249 {
2250  FCBParam optim;
2251  int pulse_cnt = pulses[index];
2252  int i;
2253 
2254  optim.min_err = 1 << 30;
2255  get_fcb_param(&optim, impulse_resp, buf, pulse_cnt, SUBFRAME_LEN);
2256 
2257  if (p->pitch_lag[index >> 1] < SUBFRAME_LEN - 2) {
2258  get_fcb_param(&optim, impulse_resp, buf, pulse_cnt,
2259  p->pitch_lag[index >> 1]);
2260  }
2261 
2262  /* Reconstruct the excitation */
2263  memset(buf, 0, sizeof(int16_t) * SUBFRAME_LEN);
2264  for (i = 0; i < pulse_cnt; i++)
2265  buf[optim.pulse_pos[i]] = optim.pulse_sign[i];
2266 
2267  pack_fcb_param(&p->subframe[index], &optim, buf, pulse_cnt);
2268 
2269  if (optim.dirac_train)
2270  gen_dirac_train(buf, p->pitch_lag[index >> 1]);
2271 }
2272 
2273 /**
2274  * Pack the frame parameters into output bitstream.
2275  *
2276  * @param frame output buffer
2277  * @param size size of the buffer
2278  */
2279 static int pack_bitstream(G723_1_Context *p, unsigned char *frame, int size)
2280 {
2281  PutBitContext pb;
2282  int info_bits, i, temp;
2283 
2284  init_put_bits(&pb, frame, size);
2285 
2286  if (p->cur_rate == RATE_6300) {
2287  info_bits = 0;
2288  put_bits(&pb, 2, info_bits);
2289  }
2290 
2291  put_bits(&pb, 8, p->lsp_index[2]);
2292  put_bits(&pb, 8, p->lsp_index[1]);
2293  put_bits(&pb, 8, p->lsp_index[0]);
2294 
2295  put_bits(&pb, 7, p->pitch_lag[0] - PITCH_MIN);
2296  put_bits(&pb, 2, p->subframe[1].ad_cb_lag);
2297  put_bits(&pb, 7, p->pitch_lag[1] - PITCH_MIN);
2298  put_bits(&pb, 2, p->subframe[3].ad_cb_lag);
2299 
2300  /* Write 12 bit combined gain */
2301  for (i = 0; i < SUBFRAMES; i++) {
2302  temp = p->subframe[i].ad_cb_gain * GAIN_LEVELS +
2303  p->subframe[i].amp_index;
2304  if (p->cur_rate == RATE_6300)
2305  temp += p->subframe[i].dirac_train << 11;
2306  put_bits(&pb, 12, temp);
2307  }
2308 
2309  put_bits(&pb, 1, p->subframe[0].grid_index);
2310  put_bits(&pb, 1, p->subframe[1].grid_index);
2311  put_bits(&pb, 1, p->subframe[2].grid_index);
2312  put_bits(&pb, 1, p->subframe[3].grid_index);
2313 
2314  if (p->cur_rate == RATE_6300) {
2315  skip_put_bits(&pb, 1); /* reserved bit */
2316 
2317  /* Write 13 bit combined position index */
2318  temp = (p->subframe[0].pulse_pos >> 16) * 810 +
2319  (p->subframe[1].pulse_pos >> 14) * 90 +
2320  (p->subframe[2].pulse_pos >> 16) * 9 +
2321  (p->subframe[3].pulse_pos >> 14);
2322  put_bits(&pb, 13, temp);
2323 
2324  put_bits(&pb, 16, p->subframe[0].pulse_pos & 0xffff);
2325  put_bits(&pb, 14, p->subframe[1].pulse_pos & 0x3fff);
2326  put_bits(&pb, 16, p->subframe[2].pulse_pos & 0xffff);
2327  put_bits(&pb, 14, p->subframe[3].pulse_pos & 0x3fff);
2328 
2329  put_bits(&pb, 6, p->subframe[0].pulse_sign);
2330  put_bits(&pb, 5, p->subframe[1].pulse_sign);
2331  put_bits(&pb, 6, p->subframe[2].pulse_sign);
2332  put_bits(&pb, 5, p->subframe[3].pulse_sign);
2333  }
2334 
2335  flush_put_bits(&pb);
2336  return frame_size[info_bits];
2337 }
2338 
2339 static int g723_1_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
2340  const AVFrame *frame, int *got_packet_ptr)
2341 {
2342  G723_1_Context *p = avctx->priv_data;
2343  int16_t unq_lpc[LPC_ORDER * SUBFRAMES];
2344  int16_t qnt_lpc[LPC_ORDER * SUBFRAMES];
2345  int16_t cur_lsp[LPC_ORDER];
2346  int16_t weighted_lpc[LPC_ORDER * SUBFRAMES << 1];
2347  int16_t vector[FRAME_LEN + PITCH_MAX];
2348  int offset, ret;
2349  int16_t *in = (const int16_t *)frame->data[0];
2350 
2351  HFParam hf[4];
2352  int i, j;
2353 
2354  highpass_filter(in, &p->hpf_fir_mem, &p->hpf_iir_mem);
2355 
2356  memcpy(vector, p->prev_data, HALF_FRAME_LEN * sizeof(int16_t));
2357  memcpy(vector + HALF_FRAME_LEN, in, FRAME_LEN * sizeof(int16_t));
2358 
2359  comp_lpc_coeff(vector, unq_lpc);
2360  lpc2lsp(&unq_lpc[LPC_ORDER * 3], p->prev_lsp, cur_lsp);
2361  lsp_quantize(p->lsp_index, cur_lsp, p->prev_lsp);
2362 
2363  /* Update memory */
2364  memcpy(vector + LPC_ORDER, p->prev_data + SUBFRAME_LEN,
2365  sizeof(int16_t) * SUBFRAME_LEN);
2366  memcpy(vector + LPC_ORDER + SUBFRAME_LEN, in,
2367  sizeof(int16_t) * (HALF_FRAME_LEN + SUBFRAME_LEN));
2368  memcpy(p->prev_data, in + HALF_FRAME_LEN,
2369  sizeof(int16_t) * HALF_FRAME_LEN);
2370  memcpy(in, vector + LPC_ORDER, sizeof(int16_t) * FRAME_LEN);
2371 
2372  perceptual_filter(p, weighted_lpc, unq_lpc, vector);
2373 
2374  memcpy(in, vector + LPC_ORDER, sizeof(int16_t) * FRAME_LEN);
2375  memcpy(vector, p->prev_weight_sig, sizeof(int16_t) * PITCH_MAX);
2376  memcpy(vector + PITCH_MAX, in, sizeof(int16_t) * FRAME_LEN);
2377 
2378  scale_vector(vector, vector, FRAME_LEN + PITCH_MAX);
2379 
2380  p->pitch_lag[0] = estimate_pitch(vector, PITCH_MAX);
2381  p->pitch_lag[1] = estimate_pitch(vector, PITCH_MAX + HALF_FRAME_LEN);
2382 
2383  for (i = PITCH_MAX, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
2384  comp_harmonic_coeff(vector + i, p->pitch_lag[j >> 1], hf + j);
2385 
2386  memcpy(vector, p->prev_weight_sig, sizeof(int16_t) * PITCH_MAX);
2387  memcpy(vector + PITCH_MAX, in, sizeof(int16_t) * FRAME_LEN);
2388  memcpy(p->prev_weight_sig, vector + FRAME_LEN, sizeof(int16_t) * PITCH_MAX);
2389 
2390  for (i = 0, j = 0; j < SUBFRAMES; i += SUBFRAME_LEN, j++)
2391  harmonic_filter(hf + j, vector + PITCH_MAX + i, in + i);
2392 
2393  inverse_quant(cur_lsp, p->prev_lsp, p->lsp_index, 0);
2394  lsp_interpolate(qnt_lpc, cur_lsp, p->prev_lsp);
2395 
2396  memcpy(p->prev_lsp, cur_lsp, sizeof(int16_t) * LPC_ORDER);
2397 
2398  offset = 0;
2399  for (i = 0; i < SUBFRAMES; i++) {
2400  int16_t impulse_resp[SUBFRAME_LEN];
2401  int16_t residual[SUBFRAME_LEN + PITCH_ORDER - 1];
2402  int16_t flt_in[SUBFRAME_LEN];
2403  int16_t zero[LPC_ORDER], fir[LPC_ORDER], iir[LPC_ORDER];
2404 
2405  /**
2406  * Compute the combined impulse response of the synthesis filter,
2407  * formant perceptual weighting filter and harmonic noise shaping filter
2408  */
2409  memset(zero, 0, sizeof(int16_t) * LPC_ORDER);
2410  memset(vector, 0, sizeof(int16_t) * PITCH_MAX);
2411  memset(flt_in, 0, sizeof(int16_t) * SUBFRAME_LEN);
2412 
2413  flt_in[0] = 1 << 13; /* Unit impulse */
2414  synth_percept_filter(qnt_lpc + offset, weighted_lpc + (offset << 1),
2415  zero, zero, flt_in, vector + PITCH_MAX, 1);
2416  harmonic_filter(hf + i, vector + PITCH_MAX, impulse_resp);
2417 
2418  /* Compute the combined zero input response */
2419  flt_in[0] = 0;
2420  memcpy(fir, p->perf_fir_mem, sizeof(int16_t) * LPC_ORDER);
2421  memcpy(iir, p->perf_iir_mem, sizeof(int16_t) * LPC_ORDER);
2422 
2423  synth_percept_filter(qnt_lpc + offset, weighted_lpc + (offset << 1),
2424  fir, iir, flt_in, vector + PITCH_MAX, 0);
2425  memcpy(vector, p->harmonic_mem, sizeof(int16_t) * PITCH_MAX);
2426  harmonic_noise_sub(hf + i, vector + PITCH_MAX, in);
2427 
2428  acb_search(p, residual, impulse_resp, in, i);
2429  gen_acb_excitation(residual, p->prev_excitation,p->pitch_lag[i >> 1],
2430  &p->subframe[i], p->cur_rate);
2431  sub_acb_contrib(residual, impulse_resp, in);
2432 
2433  fcb_search(p, impulse_resp, in, i);
2434 
2435  /* Reconstruct the excitation */
2436  gen_acb_excitation(impulse_resp, p->prev_excitation, p->pitch_lag[i >> 1],
2437  &p->subframe[i], RATE_6300);
2438 
2439  memmove(p->prev_excitation, p->prev_excitation + SUBFRAME_LEN,
2440  sizeof(int16_t) * (PITCH_MAX - SUBFRAME_LEN));
2441  for (j = 0; j < SUBFRAME_LEN; j++)
2442  in[j] = av_clip_int16((in[j] << 1) + impulse_resp[j]);
2443  memcpy(p->prev_excitation + PITCH_MAX - SUBFRAME_LEN, in,
2444  sizeof(int16_t) * SUBFRAME_LEN);
2445 
2446  /* Update filter memories */
2447  synth_percept_filter(qnt_lpc + offset, weighted_lpc + (offset << 1),
2448  p->perf_fir_mem, p->perf_iir_mem,
2449  in, vector + PITCH_MAX, 0);
2450  memmove(p->harmonic_mem, p->harmonic_mem + SUBFRAME_LEN,
2451  sizeof(int16_t) * (PITCH_MAX - SUBFRAME_LEN));
2452  memcpy(p->harmonic_mem + PITCH_MAX - SUBFRAME_LEN, vector + PITCH_MAX,
2453  sizeof(int16_t) * SUBFRAME_LEN);
2454 
2455  in += SUBFRAME_LEN;
2456  offset += LPC_ORDER;
2457  }
2458 
2459  if ((ret = ff_alloc_packet2(avctx, avpkt, 24)) < 0)
2460  return ret;
2461 
2462  *got_packet_ptr = 1;
2463  avpkt->size = pack_bitstream(p, avpkt->data, avpkt->size);
2464  return 0;
2465 }
2466 
2467 AVCodec ff_g723_1_encoder = {
2468  .name = "g723_1",
2469  .type = AVMEDIA_TYPE_AUDIO,
2470  .id = AV_CODEC_ID_G723_1,
2471  .priv_data_size = sizeof(G723_1_Context),
2472  .init = g723_1_encode_init,
2473  .encode2 = g723_1_encode_frame,
2474  .long_name = NULL_IF_CONFIG_SMALL("G.723.1"),
2475  .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,
2477 };
2478 #endif
static void lsp2lpc(int16_t *lpc)
Convert LSP frequencies to LPC coefficients.
int16_t hpf_fir_mem
highpass filter fir
Definition: start.py:1
float v
static int shift(int a, int b)
Definition: sonic.c:86
int grid_index
Definition: g723_1_data.h:101
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static const int16_t lsp_band0[LSP_CB_SIZE][3]
LSP VQ tables.
Definition: g723_1_data.h:202
static const int cng_bseg[3]
Definition: g723_1_data.h:1327
Rate
Definition: g723_1_data.h:60
AVOption.
Definition: opt.h:251
av_default_item_name
#define COS_TBL_SIZE
Definition: g723_1_data.h:47
int amp_index
Definition: g723_1_data.h:100
Silence Insertion Descriptor frame.
Definition: g723_1_data.h:54
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
#define normalize_bits_int32(num)
static const int16_t lsp_band2[LSP_CB_SIZE][4]
Definition: g723_1_data.h:380
memory handling functions
else temp
Definition: vf_mcdeint.c:148
if max(w)>1 w=0.9 *w/max(w)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
G723.1 unpacked data subframe.
Definition: g723_1_data.h:68
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int buffer_length, int filter_length, int stop_on_overflow, int shift, int rounder)
LP synthesis filter.
Definition: celp_filters.c:60
static int scale_vector(int16_t *dst, const int16_t *vector, int length)
Scale vector contents based on the largest of their absolutes.
static const int cng_filt[4]
Definition: g723_1_data.h:1325
uint8_t lsp_index[LSP_BANDS]
static int normalize_bits(int num, int width)
Calculate the number of left-shifts required for normalizing the input.
static void skip_put_bits(PutBitContext *s, int n)
Skip the given number of bits.
Definition: put_bits.h:220
static int autocorr_max(const int16_t *buf, int offset, int *ccr_max, int pitch_lag, int length, int dir)
Estimate maximum auto-correlation around pitch lag.
Sinusoidal phase f
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
#define PITCH_MAX
Definition: g723_1_data.h:42
int min_err
Definition: g723_1_data.h:99
static int comp_interp_index(G723_1_Context *p, int pitch_lag, int *exc_eng, int *scale)
Classify frames as voiced/unvoiced.
int index
Definition: g723_1_data.h:91
static const AVOption options[]
static void gen_dirac_train(int16_t *buf, int pitch_lag)
Generate a train of dirac functions with period as pitch lag.
static const AVClass g723_1dec_class
int16_t perf_fir_mem[LPC_ORDER]
perceptual filter fir
static void comp_ppf_coeff(G723_1_Context *p, int offset, int pitch_lag, PPFParam *ppf, enum Rate cur_rate)
Calculate pitch postfilter parameters.
signed 16 bits
Definition: samplefmt.h:52
#define LSP_BANDS
Definition: g723_1_data.h:39
static const int16_t percept_flt_tbl[2][LPC_ORDER]
0.5^i scaled by 2^15
Definition: g723_1_data.h:1316
static int16_t square_root(unsigned val)
Bitexact implementation of sqrt(val/2).
#define GRID_SIZE
Definition: g723_1_data.h:44
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
int pulse_pos[PULSE_MAX]
Definition: g723_1_data.h:103
int16_t prev_lsp[LPC_ORDER]
int dirac_train
Definition: g723_1_data.h:102
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
static int g723_1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
int16_t prev_excitation[PITCH_MAX]
#define SUBFRAME_LEN
Definition: g723_1_data.h:34
uint8_t bits
Definition: crc.c:216
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
#define av_cold
Definition: attributes.h:78
Optimized fixed codebook excitation parameters.
Definition: g723_1_data.h:98
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:63
float delta
AVOptions.
static const int16_t lsp_band1[LSP_CB_SIZE][3]
Definition: g723_1_data.h:291
static void residual_interp(int16_t *buf, int16_t *out, int lag, int gain, int *rseed)
Peform residual interpolation based on frame classification.
#define b
Definition: input.c:42
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf, int16_t *dst)
Perform formant filtering.
uint8_t * data
static const uint8_t bits2[81]
Definition: aactab.c:118
bitstream reader API header.
Active speech.
Definition: g723_1_data.h:53
static const int16_t cos_tab[COS_TBL_SIZE+1]
Cosine table scaled by 2^14.
Definition: g723_1_data.h:131
frame
Definition: stft.m:14
f2
Definition: genspecsines3.m:4
static const uint8_t frame_size[4]
Definition: g723_1_data.h:58
#define CNG_RANDOM_SEED
Discrete Time axis x
static void get_residual(int16_t *residual, int16_t *prev_excitation, int lag)
Get delayed contribution from the previous excitation vector.
int16_t perf_iir_mem[LPC_ORDER]
and iir memories
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
enum FrameType cur_frame_type
Spectrum Plot time data
#define iir_filter(fir_coef, iir_coef, src, dest, width)
Perform IIR filtering.
int pulse_sign[PULSE_MAX]
Definition: g723_1_data.h:104
#define zero
Definition: regdef.h:64
static const int16_t postfilter_tbl[2][LPC_ORDER]
0.65^i (Zero part) and 0.75^i (Pole part) scaled by 2^15
Definition: g723_1_data.h:1268
FrameType
G723.1 frame types.
Definition: g723_1_data.h:52
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static void lsp_interpolate(int16_t *lpc, int16_t *cur_lsp, int16_t *prev_lsp)
Quantize LSP frequencies by interpolation and convert them to the corresponding LPC coefficients...
int64_t ff_dot_product(const int16_t *a, const int16_t *b, int length)
returns the dot product of 2 int16_t vectors.
Definition: celp_math.c:98
G723.1 compatible decoder data tables.
static av_cold int g723_1_decode_init(AVCodecContext *avctx)
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
#define FFMAX(a, b)
Definition: common.h:56
external API header
int size
static void comp_ppf_gains(int lag, PPFParam *ppf, enum Rate cur_rate, int tgt_eng, int ccr, int res_eng)
Calculate pitch postfilter optimal and scaling gains.
uint64_t channel_layout
Audio channel layout.
static int estimate_sid_gain(G723_1_Context *p)
int hpf_iir_mem
and iir memories
static const int16_t fixed_cb_gain[GAIN_LEVELS]
Definition: g723_1_data.h:615
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
int bit_rate
the average bitrate
audio channel layout utility functions
int16_t prev_data[HALF_FRAME_LEN]
#define FFMIN(a, b)
Definition: common.h:58
#define normalize_bits_int16(num)
ret
Definition: avfilter.c:821
G723_1_Subframe subframe[4]
struct g723_1_context G723_1_Context
t
Definition: genspecsines3.m:6
enum FrameType past_frame_type
static const int16_t ppf_gain_weight[2]
Postfilter gain weighting factors scaled by 2^15.
Definition: g723_1_data.h:110
#define PITCH_MIN
Definition: g723_1_data.h:41
#define FFABS(a)
Definition: common.h:53
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
int index
postfilter backward/forward lag
Definition: g723_1_data.h:82
#define OFFSET(x)
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
static const int16_t adaptive_cb_gain85[85 *20]
Definition: g723_1_data.h:621
static const float pred[4]
Definition: siprdata.h:259
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
int pf_gain
formant postfilter gain scaling unit memory
static const int16_t adaptive_cb_gain170[170 *20]
Definition: g723_1_data.h:837
int16_t opt_gain
optimal gain
Definition: g723_1_data.h:83
for k
int frame_size
Number of samples per channel in an audio frame.
static const int16_t binomial_window[LPC_ORDER]
Binomial window coefficients scaled by 2^15.
Definition: g723_1_data.h:1302
1i.*Xphase exp()
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
dest
Definition: start.py:60
AVS_Value src
Definition: avisynth_c.h:523
static av_const unsigned int ff_sqrt(unsigned int a)
Definition: mathops.h:198
#define PITCH_ORDER
Definition: g723_1_data.h:43
int sample_rate
samples per second
int16_t sid_lsp[LPC_ORDER]
#define AD
main external API structure.
int16_t prev_weight_sig[PITCH_MAX]
#define FASTDIV(a, b)
Definition: mathops.h:195
#define PULSE_MAX
Definition: g723_1_data.h:45
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
static void gen_acb_excitation(int16_t *vector, int16_t *prev_excitation, int pitch_lag, G723_1_Subframe *subfrm, enum Rate cur_rate)
Generate adaptive codebook excitation.
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
static void skip_bits1(GetBitContext *s)
Definition: get_bits.h:298
#define MULL2(a, b)
Bitexact implementation of 2ab scaled by 1/2^16.
Describe the class of an AVClass context structure.
Definition: log.h:50
for lag
int16_t sc_gain
scaling gain
Definition: g723_1_data.h:84
int index
Definition: gxfenc.c:89
synthesis window for stochastic i
static const int16_t bandwidth_expand[LPC_ORDER]
0.994^i scaled by 2^15
Definition: g723_1_data.h:1309
static const int16_t pitch_contrib[340]
Definition: g723_1_data.h:559
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
static void gen_fcb_excitation(int16_t *vector, G723_1_Subframe *subfrm, enum Rate cur_rate, int pitch_lag, int index)
Generate fixed codebook excitation vector.
static int dot_product(const int16_t *a, const int16_t *b, int length)
static int sid_gain_to_lsp_index(int gain)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static const int cng_adaptive_cb_lag[4]
Definition: g723_1_data.h:1323
static int weight(int i, int blen, int offset)
static uint32_t state
Definition: trasher.c:27
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
#define LPC_ORDER
Definition: g723_1_data.h:38
#define SUBFRAMES
Definition: dcaenc.c:43
#define CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
int16_t harmonic_mem[PITCH_MAX]
#define LPC_FRAME
Definition: g723_1_data.h:37
AVCodec ff_g723_1_decoder
common internal api header.
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
Pitch postfilter parameters.
Definition: g723_1_data.h:81
static int unpack_bitstream(G723_1_Context *p, const uint8_t *buf, int buf_size)
Unpack the frame into parameters.
static double c[64]
#define FRAME_LEN
Definition: g723_1_data.h:35
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
int iir_mem[LPC_ORDER]
static const int32_t max_pos[4]
Size of the MP-MLQ fixed excitation codebooks.
Definition: g723_1_data.h:613
Same thing on a dB scale
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
function y
Definition: D.m:1
int16_t fir_mem[LPC_ORDER]
static const int16_t dc_lsp[LPC_ORDER]
LSP DC component.
Definition: g723_1_data.h:115
static void gain_scale(G723_1_Context *p, int16_t *buf, int energy)
Adjust gain of postfiltered signal.
static void inverse_quant(int16_t *cur_lsp, int16_t *prev_lsp, uint8_t *lsp_index, int bad_frame)
Perform inverse quantization of LSP frequencies.
Harmonic filter parameters.
Definition: g723_1_data.h:90
int16_t excitation[PITCH_MAX+FRAME_LEN+4]
static int cng_rand(int *state, int base)
int16_t audio[FRAME_LEN+LPC_ORDER+PITCH_MAX+4]
#define av_log2_16bit
Definition: intmath.h:90
int channels
number of audio channels
#define av_log2
Definition: intmath.h:89
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
static const int16_t hamming_window[LPC_FRAME]
Hamming window coefficients scaled by 2^15.
Definition: g723_1_data.h:1278
int16_t synth_mem[LPC_ORDER]
#define GAIN_LEVELS
Definition: g723_1_data.h:46
static void generate_noise(G723_1_Context *p)
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
Definition: g723_1_data.h:608
void INT64 INT64 count
Definition: avisynth_c.h:594
void av_memcpy_backptr(uint8_t *dst, int back, int cnt)
deliberately overlapping memcpy implementation
Definition: mem.c:327
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
const char int length
Definition: avisynth_c.h:668
#define AV_CH_LAYOUT_MONO
float min
This structure stores compressed data.
#define HALF_FRAME_LEN
Definition: g723_1_data.h:36
f1
Definition: genspecsines3.m:3
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
for(j=16;j >0;--j)
static const uint8_t bits1[81]
Definition: aactab.c:95
int ad_cb_lag
adaptive codebook lag
Definition: g723_1_data.h:69
static const int32_t combinatorial_table[PULSE_MAX][SUBFRAME_LEN/GRID_SIZE]
Used for the coding/decoding of the pulses positions for the MP-MLQ codebook.
Definition: g723_1_data.h:515
int gain
Definition: g723_1_data.h:92
bitstream writer API