FFmpeg
sipr.c
Go to the documentation of this file.
1 /*
2  * SIPR / ACELP.NET decoder
3  *
4  * Copyright (c) 2008 Vladimir Voroshilov
5  * Copyright (c) 2009 Vitor Sessak
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include <math.h>
25 #include <stdint.h>
26 #include <string.h>
27 
29 #include "libavutil/float_dsp.h"
30 #include "libavutil/mathematics.h"
31 
32 #define BITSTREAM_READER_LE
33 #include "avcodec.h"
34 #include "get_bits.h"
35 #include "internal.h"
36 #include "lsp.h"
37 #include "acelp_vectors.h"
38 #include "acelp_pitch_delay.h"
39 #include "acelp_filters.h"
40 #include "celp_filters.h"
41 
42 #define MAX_SUBFRAME_COUNT 5
43 
44 #include "sipr.h"
45 #include "siprdata.h"
46 
47 typedef struct SiprModeParam {
48  const char *mode_name;
49  uint16_t bits_per_frame;
53 
54  /* bitstream parameters */
56  uint8_t ma_predictor_bits; ///< size in bits of the switched MA predictor
57 
58  /** size in bits of the i-th stage vector of quantizer */
60 
61  /** size in bits of the adaptive-codebook index for every subframe */
63 
65  uint8_t fc_index_bits[10]; ///< size in bits of the fixed codebook indexes
66  uint8_t gc_index_bits; ///< size in bits of the gain codebook indexes
68 
69 static const SiprModeParam modes[MODE_COUNT] = {
70  [MODE_16k] = {
71  .mode_name = "16k",
72  .bits_per_frame = 160,
73  .subframe_count = SUBFRAME_COUNT_16k,
74  .frames_per_packet = 1,
75  .pitch_sharp_factor = 0.00,
76 
77  .number_of_fc_indexes = 10,
78  .ma_predictor_bits = 1,
79  .vq_indexes_bits = {7, 8, 7, 7, 7},
80  .pitch_delay_bits = {9, 6},
81  .gp_index_bits = 4,
82  .fc_index_bits = {4, 5, 4, 5, 4, 5, 4, 5, 4, 5},
83  .gc_index_bits = 5
84  },
85 
86  [MODE_8k5] = {
87  .mode_name = "8k5",
88  .bits_per_frame = 152,
89  .subframe_count = 3,
90  .frames_per_packet = 1,
91  .pitch_sharp_factor = 0.8,
92 
93  .number_of_fc_indexes = 3,
94  .ma_predictor_bits = 0,
95  .vq_indexes_bits = {6, 7, 7, 7, 5},
96  .pitch_delay_bits = {8, 5, 5},
97  .gp_index_bits = 0,
98  .fc_index_bits = {9, 9, 9},
99  .gc_index_bits = 7
100  },
101 
102  [MODE_6k5] = {
103  .mode_name = "6k5",
104  .bits_per_frame = 232,
105  .subframe_count = 3,
106  .frames_per_packet = 2,
107  .pitch_sharp_factor = 0.8,
108 
109  .number_of_fc_indexes = 3,
110  .ma_predictor_bits = 0,
111  .vq_indexes_bits = {6, 7, 7, 7, 5},
112  .pitch_delay_bits = {8, 5, 5},
113  .gp_index_bits = 0,
114  .fc_index_bits = {5, 5, 5},
115  .gc_index_bits = 7
116  },
117 
118  [MODE_5k0] = {
119  .mode_name = "5k0",
120  .bits_per_frame = 296,
121  .subframe_count = 5,
122  .frames_per_packet = 2,
123  .pitch_sharp_factor = 0.85,
124 
125  .number_of_fc_indexes = 1,
126  .ma_predictor_bits = 0,
127  .vq_indexes_bits = {6, 7, 7, 7, 5},
128  .pitch_delay_bits = {8, 5, 8, 5, 5},
129  .gp_index_bits = 0,
130  .fc_index_bits = {10},
131  .gc_index_bits = 7
132  }
133 };
134 
135 const float ff_pow_0_5[] = {
136  1.0/(1 << 1), 1.0/(1 << 2), 1.0/(1 << 3), 1.0/(1 << 4),
137  1.0/(1 << 5), 1.0/(1 << 6), 1.0/(1 << 7), 1.0/(1 << 8),
138  1.0/(1 << 9), 1.0/(1 << 10), 1.0/(1 << 11), 1.0/(1 << 12),
139  1.0/(1 << 13), 1.0/(1 << 14), 1.0/(1 << 15), 1.0/(1 << 16)
140 };
141 
142 static void dequant(float *out, const int *idx, const float * const cbs[])
143 {
144  int i;
145  int stride = 2;
146  int num_vec = 5;
147 
148  for (i = 0; i < num_vec; i++)
149  memcpy(out + stride*i, cbs[i] + stride*idx[i], stride*sizeof(float));
150 
151 }
152 
153 static void lsf_decode_fp(float *lsfnew, float *lsf_history,
154  const SiprParameters *parm)
155 {
156  int i;
157  float lsf_tmp[LP_FILTER_ORDER];
158 
159  dequant(lsf_tmp, parm->vq_indexes, lsf_codebooks);
160 
161  for (i = 0; i < LP_FILTER_ORDER; i++)
162  lsfnew[i] = lsf_history[i] * 0.33 + lsf_tmp[i] + mean_lsf[i];
163 
165 
166  /* Note that a minimum distance is not enforced between the last value and
167  the previous one, contrary to what is done in ff_acelp_reorder_lsf() */
169  lsfnew[9] = FFMIN(lsfnew[LP_FILTER_ORDER - 1], 1.3 * M_PI);
170 
171  memcpy(lsf_history, lsf_tmp, LP_FILTER_ORDER * sizeof(*lsf_history));
172 
173  for (i = 0; i < LP_FILTER_ORDER - 1; i++)
174  lsfnew[i] = cos(lsfnew[i]);
175  lsfnew[LP_FILTER_ORDER - 1] *= 6.153848 / M_PI;
176 }
177 
178 /** Apply pitch lag to the fixed vector (AMR section 6.1.2). */
179 static void pitch_sharpening(int pitch_lag_int, float beta,
180  float *fixed_vector)
181 {
182  int i;
183 
184  for (i = pitch_lag_int; i < SUBFR_SIZE; i++)
185  fixed_vector[i] += beta * fixed_vector[i - pitch_lag_int];
186 }
187 
188 /**
189  * Extract decoding parameters from the input bitstream.
190  * @param parms parameters structure
191  * @param pgb pointer to initialized GetBitContext structure
192  */
194  const SiprModeParam *p)
195 {
196  int i, j;
197 
198  if (p->ma_predictor_bits)
199  parms->ma_pred_switch = get_bits(pgb, p->ma_predictor_bits);
200 
201  for (i = 0; i < 5; i++)
202  parms->vq_indexes[i] = get_bits(pgb, p->vq_indexes_bits[i]);
203 
204  for (i = 0; i < p->subframe_count; i++) {
205  parms->pitch_delay[i] = get_bits(pgb, p->pitch_delay_bits[i]);
206  if (p->gp_index_bits)
207  parms->gp_index[i] = get_bits(pgb, p->gp_index_bits);
208 
209  for (j = 0; j < p->number_of_fc_indexes; j++)
210  parms->fc_indexes[i][j] = get_bits(pgb, p->fc_index_bits[j]);
211 
212  parms->gc_index[i] = get_bits(pgb, p->gc_index_bits);
213  }
214 }
215 
216 static void sipr_decode_lp(float *lsfnew, const float *lsfold, float *Az,
217  int num_subfr)
218 {
219  double lsfint[LP_FILTER_ORDER];
220  int i,j;
221  float t, t0 = 1.0 / num_subfr;
222 
223  t = t0 * 0.5;
224  for (i = 0; i < num_subfr; i++) {
225  for (j = 0; j < LP_FILTER_ORDER; j++)
226  lsfint[j] = lsfold[j] * (1 - t) + t * lsfnew[j];
227 
228  ff_amrwb_lsp2lpc(lsfint, Az, LP_FILTER_ORDER);
229  Az += LP_FILTER_ORDER;
230  t += t0;
231  }
232 }
233 
234 /**
235  * Evaluate the adaptive impulse response.
236  */
237 static void eval_ir(const float *Az, int pitch_lag, float *freq,
238  float pitch_sharp_factor)
239 {
240  float tmp1[SUBFR_SIZE+1], tmp2[LP_FILTER_ORDER+1];
241  int i;
242 
243  tmp1[0] = 1.0;
244  for (i = 0; i < LP_FILTER_ORDER; i++) {
245  tmp1[i+1] = Az[i] * ff_pow_0_55[i];
246  tmp2[i ] = Az[i] * ff_pow_0_7 [i];
247  }
248  memset(tmp1 + 11, 0, 37 * sizeof(float));
249 
250  ff_celp_lp_synthesis_filterf(freq, tmp2, tmp1, SUBFR_SIZE,
252 
253  pitch_sharpening(pitch_lag, pitch_sharp_factor, freq);
254 }
255 
256 /**
257  * Evaluate the convolution of a vector with a sparse vector.
258  */
259 static void convolute_with_sparse(float *out, const AMRFixed *pulses,
260  const float *shape, int length)
261 {
262  int i, j;
263 
264  memset(out, 0, length*sizeof(float));
265  for (i = 0; i < pulses->n; i++)
266  for (j = pulses->x[i]; j < length; j++)
267  out[j] += pulses->y[i] * shape[j - pulses->x[i]];
268 }
269 
270 /**
271  * Apply postfilter, very similar to AMR one.
272  */
273 static void postfilter_5k0(SiprContext *ctx, const float *lpc, float *samples)
274 {
275  float buf[SUBFR_SIZE + LP_FILTER_ORDER];
276  float *pole_out = buf + LP_FILTER_ORDER;
277  float lpc_n[LP_FILTER_ORDER];
278  float lpc_d[LP_FILTER_ORDER];
279  int i;
280 
281  for (i = 0; i < LP_FILTER_ORDER; i++) {
282  lpc_d[i] = lpc[i] * ff_pow_0_75[i];
283  lpc_n[i] = lpc[i] * ff_pow_0_5 [i];
284  };
285 
286  memcpy(pole_out - LP_FILTER_ORDER, ctx->postfilter_mem,
287  LP_FILTER_ORDER*sizeof(float));
288 
291 
292  memcpy(ctx->postfilter_mem, pole_out + SUBFR_SIZE - LP_FILTER_ORDER,
293  LP_FILTER_ORDER*sizeof(float));
294 
295  ff_tilt_compensation(&ctx->tilt_mem, 0.4, pole_out, SUBFR_SIZE);
296 
297  memcpy(pole_out - LP_FILTER_ORDER, ctx->postfilter_mem5k0,
298  LP_FILTER_ORDER*sizeof(*pole_out));
299 
300  memcpy(ctx->postfilter_mem5k0, pole_out + SUBFR_SIZE - LP_FILTER_ORDER,
301  LP_FILTER_ORDER*sizeof(*pole_out));
302 
305 
306 }
307 
308 static void decode_fixed_sparse(AMRFixed *fixed_sparse, const int16_t *pulses,
309  SiprMode mode, int low_gain)
310 {
311  int i;
312 
313  switch (mode) {
314  case MODE_6k5:
315  for (i = 0; i < 3; i++) {
316  fixed_sparse->x[i] = 3 * (pulses[i] & 0xf) + i;
317  fixed_sparse->y[i] = pulses[i] & 0x10 ? -1 : 1;
318  }
319  fixed_sparse->n = 3;
320  break;
321  case MODE_8k5:
322  for (i = 0; i < 3; i++) {
323  fixed_sparse->x[2*i ] = 3 * ((pulses[i] >> 4) & 0xf) + i;
324  fixed_sparse->x[2*i + 1] = 3 * ( pulses[i] & 0xf) + i;
325 
326  fixed_sparse->y[2*i ] = (pulses[i] & 0x100) ? -1.0: 1.0;
327 
328  fixed_sparse->y[2*i + 1] =
329  (fixed_sparse->x[2*i + 1] < fixed_sparse->x[2*i]) ?
330  -fixed_sparse->y[2*i ] : fixed_sparse->y[2*i];
331  }
332 
333  fixed_sparse->n = 6;
334  break;
335  case MODE_5k0:
336  default:
337  if (low_gain) {
338  int offset = (pulses[0] & 0x200) ? 2 : 0;
339  int val = pulses[0];
340 
341  for (i = 0; i < 3; i++) {
342  int index = (val & 0x7) * 6 + 4 - i*2;
343 
344  fixed_sparse->y[i] = (offset + index) & 0x3 ? -1 : 1;
345  fixed_sparse->x[i] = index;
346 
347  val >>= 3;
348  }
349  fixed_sparse->n = 3;
350  } else {
351  int pulse_subset = (pulses[0] >> 8) & 1;
352 
353  fixed_sparse->x[0] = ((pulses[0] >> 4) & 15) * 3 + pulse_subset;
354  fixed_sparse->x[1] = ( pulses[0] & 15) * 3 + pulse_subset + 1;
355 
356  fixed_sparse->y[0] = pulses[0] & 0x200 ? -1 : 1;
357  fixed_sparse->y[1] = -fixed_sparse->y[0];
358  fixed_sparse->n = 2;
359  }
360  break;
361  }
362 }
363 
365  float *out_data)
366 {
367  int i, j;
368  int subframe_count = modes[ctx->mode].subframe_count;
369  int frame_size = subframe_count * SUBFR_SIZE;
371  float *excitation;
372  float ir_buf[SUBFR_SIZE + LP_FILTER_ORDER];
373  float lsf_new[LP_FILTER_ORDER];
374  float *impulse_response = ir_buf + LP_FILTER_ORDER;
375  float *synth = ctx->synth_buf + 16; // 16 instead of LP_FILTER_ORDER for
376  // memory alignment
377  int t0_first = 0;
378  AMRFixed fixed_cb;
379 
380  memset(ir_buf, 0, LP_FILTER_ORDER * sizeof(float));
381  lsf_decode_fp(lsf_new, ctx->lsf_history, params);
382 
383  sipr_decode_lp(lsf_new, ctx->lsp_history, Az, subframe_count);
384 
385  memcpy(ctx->lsp_history, lsf_new, LP_FILTER_ORDER * sizeof(float));
386 
387  excitation = ctx->excitation + PITCH_DELAY_MAX + L_INTERPOL;
388 
389  for (i = 0; i < subframe_count; i++) {
390  float *pAz = Az + i*LP_FILTER_ORDER;
391  float fixed_vector[SUBFR_SIZE];
392  int T0,T0_frac;
393  float pitch_gain, gain_code, avg_energy;
394 
395  ff_decode_pitch_lag(&T0, &T0_frac, params->pitch_delay[i], t0_first, i,
396  ctx->mode == MODE_5k0, 6);
397 
398  if (i == 0 || (i == 2 && ctx->mode == MODE_5k0))
399  t0_first = T0;
400 
401  ff_acelp_interpolatef(excitation, excitation - T0 + (T0_frac <= 0),
402  ff_b60_sinc, 6,
403  2 * ((2 + T0_frac)%3 + 1), LP_FILTER_ORDER,
404  SUBFR_SIZE);
405 
406  decode_fixed_sparse(&fixed_cb, params->fc_indexes[i], ctx->mode,
407  ctx->past_pitch_gain < 0.8);
408 
409  eval_ir(pAz, T0, impulse_response, modes[ctx->mode].pitch_sharp_factor);
410 
411  convolute_with_sparse(fixed_vector, &fixed_cb, impulse_response,
412  SUBFR_SIZE);
413 
414  avg_energy = (0.01 + avpriv_scalarproduct_float_c(fixed_vector,
415  fixed_vector,
416  SUBFR_SIZE)) /
417  SUBFR_SIZE;
418 
419  ctx->past_pitch_gain = pitch_gain = gain_cb[params->gc_index[i]][0];
420 
421  gain_code = ff_amr_set_fixed_gain(gain_cb[params->gc_index[i]][1],
422  avg_energy, ctx->energy_history,
423  34 - 15.0/(0.05*M_LN10/M_LN2),
424  pred);
425 
426  ff_weighted_vector_sumf(excitation, excitation, fixed_vector,
427  pitch_gain, gain_code, SUBFR_SIZE);
428 
429  pitch_gain *= 0.5 * pitch_gain;
430  pitch_gain = FFMIN(pitch_gain, 0.4);
431 
432  ctx->gain_mem = 0.7 * ctx->gain_mem + 0.3 * pitch_gain;
433  ctx->gain_mem = FFMIN(ctx->gain_mem, pitch_gain);
434  gain_code *= ctx->gain_mem;
435 
436  for (j = 0; j < SUBFR_SIZE; j++)
437  fixed_vector[j] = excitation[j] - gain_code * fixed_vector[j];
438 
439  if (ctx->mode == MODE_5k0) {
440  postfilter_5k0(ctx, pAz, fixed_vector);
441 
443  pAz, excitation, SUBFR_SIZE,
445  }
446 
447  ff_celp_lp_synthesis_filterf(synth + i*SUBFR_SIZE, pAz, fixed_vector,
449 
450  excitation += SUBFR_SIZE;
451  }
452 
453  memcpy(synth - LP_FILTER_ORDER, synth + frame_size - LP_FILTER_ORDER,
454  LP_FILTER_ORDER * sizeof(float));
455 
456  if (ctx->mode == MODE_5k0) {
457  for (i = 0; i < subframe_count; i++) {
458  float energy = avpriv_scalarproduct_float_c(ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i * SUBFR_SIZE,
459  ctx->postfilter_syn5k0 + LP_FILTER_ORDER + i * SUBFR_SIZE,
460  SUBFR_SIZE);
462  &synth[i * SUBFR_SIZE], energy,
463  SUBFR_SIZE, 0.9, &ctx->postfilter_agc);
464  }
465 
466  memcpy(ctx->postfilter_syn5k0, ctx->postfilter_syn5k0 + frame_size,
467  LP_FILTER_ORDER*sizeof(float));
468  }
469  memmove(ctx->excitation, excitation - PITCH_DELAY_MAX - L_INTERPOL,
470  (PITCH_DELAY_MAX + L_INTERPOL) * sizeof(float));
471 
473  (const float[2]) {-1.99997 , 1.000000000},
474  (const float[2]) {-1.93307352, 0.935891986},
475  0.939805806,
476  ctx->highpass_filt_mem,
477  frame_size);
478 }
479 
481 {
482  SiprContext *ctx = avctx->priv_data;
483  int i;
484 
485  switch (avctx->block_align) {
486  case 20: ctx->mode = MODE_16k; break;
487  case 19: ctx->mode = MODE_8k5; break;
488  case 29: ctx->mode = MODE_6k5; break;
489  case 37: ctx->mode = MODE_5k0; break;
490  default:
491  if (avctx->bit_rate > 12200) ctx->mode = MODE_16k;
492  else if (avctx->bit_rate > 7500 ) ctx->mode = MODE_8k5;
493  else if (avctx->bit_rate > 5750 ) ctx->mode = MODE_6k5;
494  else ctx->mode = MODE_5k0;
495  av_log(avctx, AV_LOG_WARNING,
496  "Invalid block_align: %d. Mode %s guessed based on bitrate: %"PRId64"\n",
497  avctx->block_align, modes[ctx->mode].mode_name, avctx->bit_rate);
498  }
499 
500  av_log(avctx, AV_LOG_DEBUG, "Mode: %s\n", modes[ctx->mode].mode_name);
501 
502  if (ctx->mode == MODE_16k) {
504  ctx->decode_frame = ff_sipr_decode_frame_16k;
505  } else {
506  ctx->decode_frame = decode_frame;
507  }
508 
509  for (i = 0; i < LP_FILTER_ORDER; i++)
510  ctx->lsp_history[i] = cos((i+1) * M_PI / (LP_FILTER_ORDER + 1));
511 
512  for (i = 0; i < 4; i++)
513  ctx->energy_history[i] = -14;
514 
515  avctx->channels = 1;
517  avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
518 
519  return 0;
520 }
521 
522 static int sipr_decode_frame(AVCodecContext *avctx, void *data,
523  int *got_frame_ptr, AVPacket *avpkt)
524 {
525  SiprContext *ctx = avctx->priv_data;
526  AVFrame *frame = data;
527  const uint8_t *buf=avpkt->data;
528  SiprParameters parm;
529  const SiprModeParam *mode_par = &modes[ctx->mode];
530  GetBitContext gb;
531  float *samples;
532  int subframe_size = ctx->mode == MODE_16k ? L_SUBFR_16k : SUBFR_SIZE;
533  int i, ret;
534 
535  ctx->avctx = avctx;
536  if (avpkt->size < (mode_par->bits_per_frame >> 3)) {
537  av_log(avctx, AV_LOG_ERROR,
538  "Error processing packet: packet size (%d) too small\n",
539  avpkt->size);
540  return AVERROR_INVALIDDATA;
541  }
542 
543  /* get output buffer */
544  frame->nb_samples = mode_par->frames_per_packet * subframe_size *
545  mode_par->subframe_count;
546  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
547  return ret;
548  samples = (float *)frame->data[0];
549 
550  init_get_bits(&gb, buf, mode_par->bits_per_frame);
551 
552  for (i = 0; i < mode_par->frames_per_packet; i++) {
553  decode_parameters(&parm, &gb, mode_par);
554 
555  ctx->decode_frame(ctx, &parm, samples);
556 
557  samples += subframe_size * mode_par->subframe_count;
558  }
559 
560  *got_frame_ptr = 1;
561 
562  return mode_par->bits_per_frame >> 3;
563 }
564 
566  .name = "sipr",
567  .long_name = NULL_IF_CONFIG_SMALL("RealAudio SIPR / ACELP.NET"),
568  .type = AVMEDIA_TYPE_AUDIO,
569  .id = AV_CODEC_ID_SIPR,
570  .priv_data_size = sizeof(SiprContext),
574  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
575 };
AVCodec
AVCodec.
Definition: codec.h:197
stride
int stride
Definition: mace.c:144
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
AMRFixed::x
int x[10]
Definition: acelp_vectors.h:55
FF_CODEC_CAP_INIT_THREADSAFE
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:41
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:31
acelp_vectors.h
eval_ir
static void eval_ir(const float *Az, int pitch_lag, float *freq, float pitch_sharp_factor)
Evaluate the adaptive impulse response.
Definition: sipr.c:237
SiprModeParam::gp_index_bits
uint8_t gp_index_bits
Definition: sipr.c:64
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:1247
ff_amr_set_fixed_gain
float ff_amr_set_fixed_gain(float fixed_gain_factor, float fixed_mean_energy, float *prediction_error, float energy_mean, const float *pred_table)
Calculate fixed gain (part of section 6.1.3 of AMR spec)
Definition: acelp_pitch_delay.c:86
SiprModeParam::mode_name
const char * mode_name
Definition: sipr.c:48
out
FILE * out
Definition: movenc.c:54
ff_decode_pitch_lag
void ff_decode_pitch_lag(int *lag_int, int *lag_frac, int pitch_index, const int prev_lag_int, const int subframe, int third_as_first, int resolution)
Decode the adaptive codebook index to the integer and fractional parts of the pitch lag for one subfr...
Definition: acelp_pitch_delay.c:107
postfilter_5k0
static void postfilter_5k0(SiprContext *ctx, const float *lpc, float *samples)
Apply postfilter, very similar to AMR one.
Definition: sipr.c:273
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:90
ff_amrwb_lsp2lpc
void ff_amrwb_lsp2lpc(const double *lsp, float *lp, int lp_order)
LSP to LP conversion (5.2.4 of AMR-WB)
Definition: lsp.c:145
ff_b60_sinc
const float ff_b60_sinc[61]
b60 hamming windowed sinc function coefficients
Definition: acelp_vectors.c:103
siprdata.h
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:324
MODE_5k0
@ MODE_5k0
Definition: sipr.h:52
index
fg index
Definition: ffmpeg_filter.c:170
ff_acelp_apply_order_2_transfer_function
void ff_acelp_apply_order_2_transfer_function(float *out, const float *in, const float zero_coeffs[2], const float pole_coeffs[2], float gain, float mem[2], int n)
Apply an order 2 rational transfer function in-place.
Definition: acelp_filters.c:119
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:369
ff_sipr_decode_frame_16k
void ff_sipr_decode_frame_16k(SiprContext *ctx, SiprParameters *params, float *out_data)
Definition: sipr16k.c:176
t0
#define t0
Definition: regdef.h:28
data
const char data[16]
Definition: mxf.c:142
mathematics.h
ff_sort_nearly_sorted_floats
void ff_sort_nearly_sorted_floats(float *vals, int len)
Sort values in ascending order.
Definition: lsp.c:228
LP_FILTER_ORDER
#define LP_FILTER_ORDER
linear predictive coding filter order
Definition: amrnbdata.h:53
MAX_SUBFRAME_COUNT
#define MAX_SUBFRAME_COUNT
Definition: sipr.c:42
ff_celp_lp_synthesis_filterf
void ff_celp_lp_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP synthesis filter.
Definition: celp_filters.c:84
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:659
LSFQ_DIFF_MIN
#define LSFQ_DIFF_MIN
minimum LSF distance (3.2.4) 0.0391 in Q13
Definition: g729dec.c:58
MODE_8k5
@ MODE_8k5
Definition: sipr.h:50
M_LN2
#define M_LN2
Definition: mathematics.h:40
SiprModeParam::frames_per_packet
uint8_t frames_per_packet
Definition: sipr.c:51
SUBFR_SIZE
#define SUBFR_SIZE
Subframe size for all modes except 16k.
Definition: sipr.h:44
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
PITCH_DELAY_MAX
#define PITCH_DELAY_MAX
Definition: acelp_pitch_delay.h:31
ff_pow_0_55
const float ff_pow_0_55[10]
Table of pow(0.55,n)
Definition: acelp_vectors.c:98
lsf_decode_fp
static void lsf_decode_fp(float *lsfnew, float *lsf_history, const SiprParameters *parm)
Definition: sipr.c:153
convolute_with_sparse
static void convolute_with_sparse(float *out, const AMRFixed *pulses, const float *shape, int length)
Evaluate the convolution of a vector with a sparse vector.
Definition: sipr.c:259
SiprModeParam::number_of_fc_indexes
uint8_t number_of_fc_indexes
Definition: sipr.c:55
GetBitContext
Definition: get_bits.h:61
SiprParameters
Definition: sipr.h:56
val
static double val(void *priv, double ch)
Definition: aeval.c:76
SiprParameters::gc_index
int gc_index[5]
fixed-codebook gain indexes
Definition: sipr.h:62
SiprModeParam::pitch_sharp_factor
float pitch_sharp_factor
Definition: sipr.c:52
ff_adaptive_gain_control
void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem)
Adaptive gain control (as used in AMR postfiltering)
Definition: acelp_vectors.c:192
decode_parameters
static void decode_parameters(SiprParameters *parms, GetBitContext *pgb, const SiprModeParam *p)
Extract decoding parameters from the input bitstream.
Definition: sipr.c:193
AV_CODEC_ID_SIPR
@ AV_CODEC_ID_SIPR
Definition: codec_id.h:465
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
av_cold
#define av_cold
Definition: attributes.h:90
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
ff_sipr_decoder
AVCodec ff_sipr_decoder
Definition: sipr.c:565
frame_size
int frame_size
Definition: mxfenc.c:2206
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
dequant
static void dequant(float *out, const int *idx, const float *const cbs[])
Definition: sipr.c:142
AMRFixed
Sparse representation for the algebraic codebook (fixed) vector.
Definition: acelp_vectors.h:53
sipr_decode_lp
static void sipr_decode_lp(float *lsfnew, const float *lsfold, float *Az, int num_subfr)
Definition: sipr.c:216
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
ctx
AVFormatContext * ctx
Definition: movenc.c:48
get_bits.h
sipr_decode_frame
static int sipr_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: sipr.c:522
AMRFixed::y
float y[10]
Definition: acelp_vectors.h:56
decode_fixed_sparse
static void decode_fixed_sparse(AMRFixed *fixed_sparse, const int16_t *pulses, SiprMode mode, int low_gain)
Definition: sipr.c:308
SiprMode
SiprMode
Definition: sipr.h:48
SiprParameters::ma_pred_switch
int ma_pred_switch
switched moving average predictor
Definition: sipr.h:57
L_INTERPOL
#define L_INTERPOL
Number of past samples needed for excitation interpolation.
Definition: sipr.h:41
SiprModeParam::vq_indexes_bits
uint8_t vq_indexes_bits[5]
size in bits of the i-th stage vector of quantizer
Definition: sipr.c:59
MODE_16k
@ MODE_16k
Definition: sipr.h:49
AVCodecContext::bit_rate
int64_t bit_rate
the average bitrate
Definition: avcodec.h:586
SiprParameters::fc_indexes
int16_t fc_indexes[5][10]
fixed-codebook indexes
Definition: sipr.h:61
SiprParameters::pitch_delay
int pitch_delay[5]
pitch delay
Definition: sipr.h:59
celp_filters.h
float_dsp.h
AV_CODEC_CAP_CHANNEL_CONF
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: codec.h:104
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1893
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:370
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1204
ff_pow_0_7
const float ff_pow_0_7[10]
Table of pow(0.7,n)
Definition: acelp_vectors.c:88
FFMIN
#define FFMIN(a, b)
Definition: common.h:105
SiprModeParam::bits_per_frame
uint16_t bits_per_frame
Definition: sipr.c:49
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
ff_pow_0_5
const float ff_pow_0_5[]
Definition: sipr.c:135
lsf_codebooks
static const float *const lsf_codebooks[]
Definition: siprdata.h:209
M_PI
#define M_PI
Definition: mathematics.h:52
ff_tilt_compensation
void ff_tilt_compensation(float *mem, float tilt, float *samples, int size)
Apply tilt compensation filter, 1 - tilt * z-1.
Definition: acelp_filters.c:136
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:1197
pitch_sharpening
static void pitch_sharpening(int pitch_lag_int, float beta, float *fixed_vector)
Apply pitch lag to the fixed vector (AMR section 6.1.2).
Definition: sipr.c:179
sipr.h
i
int i
Definition: input.c:407
SiprParameters::vq_indexes
int vq_indexes[5]
Definition: sipr.h:58
SiprContext
Definition: sipr.h:65
ff_sipr_init_16k
void ff_sipr_init_16k(SiprContext *ctx)
Definition: sipr16k.c:271
modes
static const SiprModeParam modes[MODE_COUNT]
Definition: sipr.c:69
decode_frame
static void decode_frame(SiprContext *ctx, SiprParameters *params, float *out_data)
Definition: sipr.c:364
xf
#define xf(width, name, var, range_min, range_max, subs,...)
Definition: cbs_av1.c:664
SiprModeParam::gc_index_bits
uint8_t gc_index_bits
size in bits of the gain codebook indexes
Definition: sipr.c:66
ff_pow_0_75
const float ff_pow_0_75[10]
Table of pow(0.75,n)
Definition: acelp_vectors.c:93
uint8_t
uint8_t
Definition: audio_convert.c:194
acelp_filters.h
ff_weighted_vector_sumf
void ff_weighted_vector_sumf(float *out, const float *in_a, const float *in_b, float weight_coeff_a, float weight_coeff_b, int length)
float implementation of weighted sum of two vectors.
Definition: acelp_vectors.c:182
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:204
gain_cb
static const float gain_cb[128][2]
Definition: siprdata.h:213
MODE_6k5
@ MODE_6k5
Definition: sipr.h:51
avcodec.h
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
AVCodecContext::block_align
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs.
Definition: avcodec.h:1233
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
lsp.h
ff_celp_lp_zero_synthesis_filterf
void ff_celp_lp_zero_synthesis_filterf(float *out, const float *filter_coeffs, const float *in, int buffer_length, int filter_length)
LP zero synthesis filter.
Definition: celp_filters.c:199
AMRFixed::n
int n
Definition: acelp_vectors.h:54
SiprModeParam::pitch_delay_bits
uint8_t pitch_delay_bits[5]
size in bits of the adaptive-codebook index for every subframe
Definition: sipr.c:62
AVCodecContext
main external API structure.
Definition: avcodec.h:536
channel_layout.h
mode
mode
Definition: ebur128.h:83
SiprModeParam
Definition: sipr.c:47
L_SUBFR_16k
#define L_SUBFR_16k
Definition: sipr.h:32
mean_lsf
static const float mean_lsf[10]
Definition: siprdata.h:27
samples
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
SUBFRAME_COUNT_16k
#define SUBFRAME_COUNT_16k
Definition: sipr.h:46
SiprModeParam::subframe_count
uint8_t subframe_count
Definition: sipr.c:50
avpriv_scalarproduct_float_c
float avpriv_scalarproduct_float_c(const float *v1, const float *v2, int len)
Return the scalar product of two vectors.
Definition: float_dsp.c:124
M_LN10
#define M_LN10
Definition: mathematics.h:43
SiprModeParam::fc_index_bits
uint8_t fc_index_bits[10]
size in bits of the fixed codebook indexes
Definition: sipr.c:65
AVPacket
This structure stores compressed data.
Definition: packet.h:346
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:563
sipr_decoder_init
static av_cold int sipr_decoder_init(AVCodecContext *avctx)
Definition: sipr.c:480
SiprParameters::gp_index
int gp_index[5]
adaptive-codebook gain indexes
Definition: sipr.h:60
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
MODE_COUNT
@ MODE_COUNT
Definition: cinepakenc.c:76
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
pulses
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
Definition: g723_1.h:260
ff_acelp_interpolatef
void ff_acelp_interpolatef(float *out, const float *in, const float *filter_coeffs, int precision, int frac_pos, int filter_length, int length)
Floating point version of ff_acelp_interpolate()
Definition: acelp_filters.c:78
AV_SAMPLE_FMT_FLT
@ AV_SAMPLE_FMT_FLT
float
Definition: samplefmt.h:63
SiprModeParam::ma_predictor_bits
uint8_t ma_predictor_bits
size in bits of the switched MA predictor
Definition: sipr.c:56
ff_set_min_dist_lsf
void ff_set_min_dist_lsf(float *lsf, double min_spacing, int size)
Adjust the quantized LSFs so they are increasing and not too close.
Definition: lsp.c:51
acelp_pitch_delay.h