63#define AMR_BLOCK_SIZE 160
64#define AMR_SAMPLE_BOUND 32768.0
75#define AMR_SAMPLE_SCALE (2.0 / 32768.0)
78#define PRED_FAC_MODE_12k2 0.65
80#define LSF_R_FAC (8000.0 / 32768.0)
81#define MIN_LSF_SPACING (50.0488 / 8000.0)
82#define PITCH_LAG_MIN_MODE_12k2 18
92#define LSF_ALPHA (29491.0f / 32768.0f)
93#define LSF_ONE_ALPHA ( 3277.0f / 32768.0f)
94#define LSF_ALPHA_5 (31128.0f / 32768.0f)
95#define LSF_ONE_ALPHA_5 ( 1639.0f / 32768.0f)
98#define MIN_ENERGY -14.0
105#define SHARP_MAX 0.79449462890625
108#define AMR_TILT_RESPONSE 22
110#define AMR_TILT_GAMMA_T 0.8
112#define AMR_AGC_ALPHA 0.9
118#define CN_LEVEL_SCALE (1.0f / 8.0f)
222 const double *in_b,
double weight_coeff_a,
223 double weight_coeff_b,
int length)
227 for (
i = 0;
i < length;
i++)
228 out[
i] = weight_coeff_a * in_a[
i]
229 + weight_coeff_b * in_b[
i];
241 p->no_data_seed = 21845;
246 for (
i = 0;
i < 5;
i++) {
247 p->ec_gain_pbuf[
i] = 1640.0f / 16384.0f;
248 p->ec_gain_gbuf[
i] = 1.0f;
250 p->ec_gain_past_pit = 0.0f;
251 p->ec_gain_prev_pit = 1.0f;
252 p->ec_gain_past_code = 0.0f;
253 p->ec_gain_prev_code = 1.0f;
284 for (
i = 0;
i < 4;
i++)
289 p->sid_period_inv = 0.25f;
290 p->cn_log_en = 3500.0f / 2048.0f;
291 p->cn_log_en_old = p->cn_log_en;
294 p->dec_ana_elapsed = 32767;
304 p->lsf_hist[
i][j] =
lsf_3_mean[j] * (1.0 / 8000.0);
305 memset(p->lsf_hist_mean[
i], 0,
sizeof(p->lsf_hist_mean[
i]));
306 p->log_en_hist[
i] = p->cn_log_en;
336 mode = buf[0] >> 3 & 0x0F;
337 p->bad_frame_indicator = (buf[0] & 0x4) != 0x4;
366 for (
i = 0;
i < 4;
i++)
367 ctx->weighted_vector_sumf(lsf_q[
i], lsf_q[3], lsf_new,
368 0.25 * (3 -
i), 0.25 * (
i + 1),
385 const int16_t *lsf_quantizer[5],
386 const int quantizer_offset,
387 const int sign,
const int update)
394 memcpy(&lsf_r[
i << 1], &lsf_quantizer[
i][quantizer_offset],
406 lsf_q[
i] = lsf_r[
i] * (
LSF_R_FAC / 8000.0) + lsf_no_r[
i] * (1.0 / 8000.0);
424 const uint16_t *lsf_param = p->frame.lsf;
426 const int16_t *lsf_quantizer[5];
441 (lsf_q[
i] * 8000.0f -
450 memcpy(p->lsp[1], p->lsp[3],
sizeof(p->lsp[1]));
458 lsf_quantizer[0] =
lsf_5_1[lsf_param[0]];
459 lsf_quantizer[1] =
lsf_5_2[lsf_param[1]];
460 lsf_quantizer[2] =
lsf_5_3[lsf_param[2] >> 1];
461 lsf_quantizer[3] =
lsf_5_4[lsf_param[3]];
462 lsf_quantizer[4] =
lsf_5_5[lsf_param[4]];
483 const uint16_t *lsf_param = p->frame.lsf;
498 (lsf_q[
i] * 8000.0f -
507 for (
i = 1;
i <= 3;
i++)
509 p->lsp[
i-1][j] = p->prev_lsp_sub4[j] +
510 (p->lsp[3][j] - p->prev_lsp_sub4[j]) * 0.25 *
i;
515 const int16_t *lsf_quantizer;
518 memcpy(lsf_r, lsf_quantizer, 3 *
sizeof(*lsf_r));
521 memcpy(lsf_r + 3, lsf_quantizer, 3 *
sizeof(*lsf_r));
524 memcpy(lsf_r + 6, lsf_quantizer, 4 *
sizeof(*lsf_r));
539 for (
i = 1;
i <= 3;
i++)
541 p->lsp[
i-1][j] = p->prev_lsp_sub4[j] +
542 (p->lsp[3][j] - p->prev_lsp_sub4[j]) * 0.25 *
i;
555 const int prev_lag_int,
const int subframe)
557 if (subframe == 0 || subframe == 2) {
558 if (pitch_index < 463) {
559 *lag_int = (pitch_index + 107) * 10923 >> 16;
560 *lag_frac = pitch_index - *lag_int * 6 + 105;
562 *lag_int = pitch_index - 368;
566 *lag_int = ((pitch_index + 5) * 10923 >> 16) - 1;
567 *lag_frac = pitch_index - *lag_int * 6 - 3;
575 const int subframe,
const int bfi)
577 int pitch_lag_int, pitch_lag_frac;
588 pitch_lag_int = p->pitch_lag_int;
590 }
else if (p->cur_frame_mode ==
MODE_12k2) {
592 amr_subframe->
p_lag, p->pitch_lag_int,
597 p->pitch_lag_int, subframe,
603 p->pitch_lag_int = pitch_lag_int;
605 pitch_lag_int += pitch_lag_frac > 0;
609 p->acelpf_ctx.acelp_interpolatef(p->excitation,
610 p->excitation + 1 - pitch_lag_int,
612 pitch_lag_frac + 6 - 6*(pitch_lag_frac > 0),
628 int i1,
int i2,
int i3)
634 pulse_position[i2] = (
positions[1] << 1) + ((
code >> 1) & 1);
635 pulse_position[i3] = (
positions[0] << 1) + ((
code >> 2) & 1);
648 int pulse_position[8];
656 temp = ((fixed_index[6] >> 2) * 25 + 12) >> 5;
657 pulse_position[3] =
temp % 5;
658 pulse_position[7] =
temp / 5;
659 if (pulse_position[7] & 1)
660 pulse_position[3] = 4 - pulse_position[3];
661 pulse_position[3] = (pulse_position[3] << 1) + ( fixed_index[6] & 1);
662 pulse_position[7] = (pulse_position[7] << 1) + ((fixed_index[6] >> 1) & 1);
665 for (
i = 0;
i < 4;
i++) {
666 const int pos1 = (pulse_position[
i] << 2) +
i;
667 const int pos2 = (pulse_position[
i + 4] << 2) +
i;
668 const float sign = fixed_index[
i] ? -1.0 : 1.0;
669 fixed_sparse->
x[
i ] = pos1;
670 fixed_sparse->
x[
i + 4] = pos2;
671 fixed_sparse->
y[
i ] = sign;
672 fixed_sparse->
y[
i + 4] = pos2 < pos1 ? -sign : sign;
692 const enum Mode mode,
const int subframe)
701 int *pulse_position = fixed_sparse->
x;
703 const int fixed_index =
pulses[0];
706 pulse_subset = ((fixed_index >> 3) & 8) + (subframe << 1);
707 pulse_position[0] = ( fixed_index & 7) * 5 +
track_position[pulse_subset];
708 pulse_position[1] = ((fixed_index >> 3) & 7) * 5 +
track_position[pulse_subset + 1];
711 pulse_subset = ((fixed_index & 1) << 1) + 1;
712 pulse_position[0] = ((fixed_index >> 1) & 7) * 5 + pulse_subset;
713 pulse_subset = (fixed_index >> 4) & 3;
714 pulse_position[1] = ((fixed_index >> 6) & 7) * 5 + pulse_subset + (pulse_subset == 3 ? 1 : 0);
715 fixed_sparse->
n = pulse_position[0] == pulse_position[1] ? 1 : 2;
717 pulse_position[0] = (fixed_index & 7) * 5;
718 pulse_subset = (fixed_index >> 2) & 2;
719 pulse_position[1] = ((fixed_index >> 4) & 7) * 5 + pulse_subset + 1;
720 pulse_subset = (fixed_index >> 6) & 2;
721 pulse_position[2] = ((fixed_index >> 8) & 7) * 5 + pulse_subset + 2;
725 pulse_position[1] =
gray_decode[(fixed_index >> 3) & 7] + 1;
726 pulse_position[2] =
gray_decode[(fixed_index >> 6) & 7] + 2;
727 pulse_subset = (fixed_index >> 9) & 1;
728 pulse_position[3] =
gray_decode[(fixed_index >> 10) & 7] + pulse_subset + 3;
731 for (
i = 0;
i < fixed_sparse->
n;
i++)
732 fixed_sparse->
y[
i] = (
pulses[1] >>
i) & 1 ? 1.0 : -1.0;
751 p->beta =
FFMIN(p->pitch_gain[4], 1.0);
753 fixed_sparse->
pitch_lag = p->pitch_lag_int;
781 const float *lsf_avg,
const enum Mode mode)
795 if (p->diff_count > 10) {
800 if (p->hang_count < 40) {
803 const float smoothing_factor =
av_clipf(4.0 *
diff - 1.6, 0.0, 1.0);
804 const float fixed_gain_mean = (p->fixed_gain[0] + p->fixed_gain[1] +
805 p->fixed_gain[2] + p->fixed_gain[3] +
806 p->fixed_gain[4]) * 0.2;
807 return smoothing_factor * p->fixed_gain[4] +
808 (1.0 - smoothing_factor) * fixed_gain_mean;
810 return p->fixed_gain[4];
823 const enum Mode mode,
const int subframe,
824 float *fixed_gain_factor)
832 const uint16_t *gains;
840 gains =
gains_MODE_4k75[(p->frame.subframe[subframe & 2].p_gain << 1) + (subframe & 1)];
843 p->pitch_gain[4] = gains[0] * (1.0 / 16384.0);
844 *fixed_gain_factor = gains[1] * (1.0 / 4096.0);
863 memcpy(
tmp, buf,
sizeof(
tmp));
865 for (
i = 1;
i < 5;
i++) {
868 for (j =
i - 1; j >= 0 &&
tmp[j] > v; j--)
886 static const float pdown[7] = {
887 32767.0f / 32768.0f, 32112.0f / 32768.0f, 32112.0f / 32768.0f,
888 26214.0f / 32768.0f, 9830.0f / 32768.0f, 6553.0f / 32768.0f,
893 if (gain > p->ec_gain_past_pit)
894 gain = p->ec_gain_past_pit;
895 p->pitch_gain[4] = gain * pdown[
state];
912 if (p->prev_bf && p->pitch_gain[4] > p->ec_gain_prev_pit)
913 p->pitch_gain[4] = p->ec_gain_prev_pit;
914 p->ec_gain_prev_pit = p->pitch_gain[4];
917 p->ec_gain_past_pit =
FFMIN(p->pitch_gain[4], 1.0f);
919 for (
i = 1;
i < 5;
i++)
920 p->ec_gain_pbuf[
i - 1] = p->ec_gain_pbuf[
i];
921 p->ec_gain_pbuf[4] = p->ec_gain_past_pit;
936 for (
i = 0;
i < 4;
i++)
937 avg += p->prediction_error[
i];
940 memmove(&p->prediction_error[0], &p->prediction_error[1],
941 3 *
sizeof(p->prediction_error[0]));
942 p->prediction_error[3] =
avg;
955 static const float cdown[7] = {
956 32767.0f / 32768.0f, 32112.0f / 32768.0f, 32112.0f / 32768.0f,
957 32112.0f / 32768.0f, 32112.0f / 32768.0f, 32112.0f / 32768.0f,
962 if (gain > p->ec_gain_past_code)
963 gain = p->ec_gain_past_code;
964 p->fixed_gain[4] = gain * cdown[
state];
979 if (p->prev_bf && p->fixed_gain[4] > p->ec_gain_prev_code)
980 p->fixed_gain[4] = p->ec_gain_prev_code;
981 p->ec_gain_prev_code = p->fixed_gain[4];
984 p->ec_gain_past_code = p->fixed_gain[4];
986 for (
i = 1;
i < 5;
i++)
987 p->ec_gain_gbuf[
i - 1] = p->ec_gain_gbuf[
i];
988 p->ec_gain_gbuf[4] = p->fixed_gain[4];
1020 if (lag < AMR_SUBFRAME_SIZE >> 1)
1026 for (
i = 0;
i < in->
n;
i++) {
1029 const float *filterp;
1055 const float *fixed_vector,
1056 float fixed_gain,
float *
out)
1060 if (p->pitch_gain[4] < 0.6) {
1062 }
else if (p->pitch_gain[4] < 0.9) {
1068 if (fixed_gain > 2.0 * p->prev_sparse_fixed_gain) {
1069 p->ir_filter_onset = 2;
1070 }
else if (p->ir_filter_onset)
1071 p->ir_filter_onset--;
1073 if (!p->ir_filter_onset) {
1076 for (
i = 0;
i < 5;
i++)
1077 if (p->pitch_gain[
i] < 0.6)
1082 if (ir_filter_nr > p->prev_ir_filter_nr + 1)
1084 }
else if (ir_filter_nr < 2)
1090 if (fixed_gain < 5.0)
1094 && ir_filter_nr < 2) {
1103 p->prev_ir_filter_nr = ir_filter_nr;
1104 p->prev_sparse_fixed_gain = fixed_gain;
1106 return fixed_vector;
1126 float fixed_gain,
const float *fixed_vector,
1127 float *samples, uint8_t overflow)
1136 p->pitch_vector[
i] *= 0.25;
1138 p->acelpv_ctx.weighted_vector_sumf(excitation, p->pitch_vector, fixed_vector,
1142 if (p->pitch_gain[4] > 0.5 && !overflow) {
1143 float energy = p->celpm_ctx.dot_productf(excitation, excitation,
1145 float pitch_factor =
1148 0.25 *
FFMIN(p->pitch_gain[4], 1.0) :
1152 excitation[
i] += pitch_factor * p->pitch_vector[
i];
1158 p->celpf_ctx.celp_lp_synthesis_filterf(samples, lpc, excitation,
1184 memcpy(p->prev_lsp_sub4, p->lsp[3],
LP_FILTER_ORDER *
sizeof(p->lsp[3][0]));
1189 memmove(&p->pitch_gain[0], &p->pitch_gain[1], 4 *
sizeof(
float));
1190 memmove(&p->fixed_gain[0], &p->fixed_gain[1], 4 *
sizeof(
float));
1219 p->celpf_ctx.celp_lp_synthesis_filterf(
hf, lpc_d,
hf,
1244 float speech_gain = p->celpm_ctx.dot_productf(samples, samples,
1248 const float *gamma_n, *gamma_d;
1260 lpc_n[
i] = lpc[
i] * gamma_n[
i];
1261 lpc_d[
i] = lpc[
i] * gamma_d[
i];
1265 p->celpf_ctx.celp_lp_synthesis_filterf(pole_out +
LP_FILTER_ORDER, lpc_d, samples,
1270 p->celpf_ctx.celp_lp_zero_synthesis_filterf(buf_out, lpc_n,
1301 int noise_bits = 0,
i;
1303 for (
i = 0;
i < no_bits;
i++) {
1304 int Sn = (*shift_reg & 1) ^ ((*shift_reg >> 28) & 1);
1306 noise_bits = (noise_bits << 1) | (*shift_reg & 1);
1309 *shift_reg |= 0x40000000u;
1377 for (
i = 0;
i < 3;
i++)
1380 for (
i = 0;
i < 3;
i++)
1383 for (
i = 0;
i < 4;
i++)
1404 float energy = 0.0f;
1408 memcpy(p->lsf_hist[p->lsf_hist_ptr], p->lsf_q[3],
sizeof(p->lsf_q[3]));
1410 p->log_en_hist_ptr = (p->log_en_hist_ptr + 1) %
DTX_HIST_SIZE;
1413 energy += synth[
i] * synth[
i];
1419 p->log_en_hist[p->log_en_hist_ptr] =
1442 for (
i = 1;
i < m;
i++)
1443 b[
i] = (
a[
i] - k *
a[m -
i]) / (1.0f - k * k);
1444 for (
i = 1;
i < m;
i++)
1459 int new_state, enc_state;
1463 ((p->dtx_state ==
DTX || p->dtx_state ==
DTX_MUTE) &&
1474 p->since_last_sid =
FFMIN(p->since_last_sid + 1, 32767);
1482 p->since_last_sid = 0;
1486 p->dec_ana_elapsed = 0;
1488 p->dec_ana_elapsed =
FFMIN(p->dec_ana_elapsed + 1, 32767);
1489 p->hangover_added = 0;
1506 p->hangover_added = 1;
1507 p->dec_ana_elapsed = 0;
1508 p->hangover_count = 0;
1509 }
else if (!p->hangover_count) {
1510 p->dec_ana_elapsed = 0;
1512 p->hangover_count--;
1526 p->hangover_added = 0;
1548 pred_err *= 1.0f - refl[
i] * refl[
i];
1552 return -0.5f *
log2f(
FFMAX(pred_err, 1e-6f));
1569 memcpy(p->lsf_hist[ptr], p->lsf_hist[p->lsf_hist_ptr],
1570 sizeof(p->lsf_hist[0]));
1572 p->log_en_hist[ptr] = p->log_en_hist[p->log_en_hist_ptr];
1576 memset(lsf, 0,
sizeof(lsf));
1577 p->cn_log_en = 0.0f;
1579 p->cn_log_en += p->log_en_hist[
i];
1581 lsf[j] += p->lsf_hist[
i][j];
1588 p->cn_log_en -= p->log_en_adjust;
1597 mean += p->lsf_hist[
i][j];
1601 float dev = (p->lsf_hist[
i][j] -
mean) *
1603 float sign = dev < 0.0f ? -1.0f : 1.0f;
1607 if (dev > 655.0f / 32768.0f)
1608 dev = 655.0f / 32768.0f +
1609 (dev - 655.0f / 32768.0f) * 0.25f;
1610 dev =
FFMIN(dev, 1310.0f / 32768.0f);
1611 p->lsf_hist_mean[
i][j] = dev * sign;
1618 p->cn_lsp[
i] = lsp[
i];
1635 memcpy(p->cn_lsp_old, p->cn_lsp,
sizeof(p->cn_lsp));
1636 p->cn_log_en_old = p->cn_log_en;
1638 if (p->valid_data) {
1639 period = p->since_last_sid;
1640 p->since_last_sid = 0;
1641 period =
FFMIN(period, 32);
1642 p->sid_period_inv = period >= 2 ? 1.0f / period : 0.5f;
1647 p->cn_lsp[
i] = lsp[
i];
1650 p->cn_log_en = ind[4] ? (ind[4] / 4.0f) - 2.5f : -16.0f;
1652 if (!p->data_updated || p->dtx_state ==
DTX_SPEECH) {
1653 memcpy(p->cn_lsp_old, p->cn_lsp,
sizeof(p->cn_lsp));
1654 p->cn_log_en_old = p->cn_log_en;
1664 pred_init =
FFMIN(p->cn_log_en - 9000.0f / 1024.0f, 0.0f);
1666 for (
i = 0;
i < 4;
i++)
1667 p->prediction_error[
i] = pred_init;
1680 int new_state,
float *buf_out)
1690 memcpy(synth_mem, p->samples_in,
LP_FILTER_ORDER *
sizeof(*synth_mem));
1698 sizeof(*p->excitation_buf));
1699 memset(p->prev_lsf_r, 0,
sizeof(p->prev_lsf_r));
1705 p->pitch_lag_int = 40;
1714 p->prev_bf = new_state ==
DTX_MUTE;
1720 memset(p->fixed_gain, 0,
sizeof(p->fixed_gain));
1721 memset(p->pitch_gain, 0,
sizeof(p->pitch_gain));
1724 p->prev_ir_filter_nr = 0;
1725 p->ir_filter_onset = 0;
1726 p->prev_sparse_fixed_gain = 0.0f;
1728 for (sub = 0; sub < 4; sub++) {
1733 p->celpf_ctx.celp_lp_synthesis_filterf(
1759 float variab_fac, log_en, int_fac,
level, log_pg;
1760 int i, sub, period, variab_index;
1764 if (p->hangover_added && p->sid_frame)
1773 p->log_en_adjust = 0.9f * p->log_en_adjust +
1777 int_fac =
FFMIN((1 + p->since_last_sid) * p->sid_period_inv, 1.0f);
1779 log_en = int_fac * p->cn_log_en + (1.0f - int_fac) * p->cn_log_en_old;
1781 lsp[
i] = int_fac * p->cn_lsp[
i] + (1.0f - int_fac) * p->cn_lsp_old[
i];
1787 variab_fac = 1.0f - (p->log_pg_mean - 0.6f) * 0.3f;
1788 variab_fac =
av_clipf(variab_fac, 0.0f, 1.0f);
1792 memcpy(lsf_variab, lsf,
sizeof(lsf_variab));
1794 lsf_variab[
i] += variab_fac * p->lsf_hist_mean[variab_index][
i];
1806 memcpy(p->lsf_q[3], lsf,
sizeof(p->lsf_q[3]));
1807 memcpy(p->prev_lsp_sub4, lsp,
sizeof(p->prev_lsp_sub4));
1808 p->acelpv_ctx.weighted_vector_sumf(p->lsf_avg, p->lsf_avg, lsf,
1816 for (sub = 0; sub < 4; sub++)
1823 p->log_pg_mean = 0.9f * p->log_pg_mean + 0.1f * log_pg;
1825 level =
exp2f(log_en + 4.0f - log_pg + p->log_en_adjust) *
1832 period = p->since_last_sid;
1837 p->sid_period_inv = 1.0f / period;
1838 p->since_last_sid = 0;
1842 memcpy(p->cn_lsp_old, p->cn_lsp,
sizeof(p->cn_lsp));
1843 p->cn_log_en_old = p->cn_log_en;
1844 p->cn_log_en -= 0.125f;
1848 (p->valid_data || (!p->valid_data && p->hangover_added))) {
1849 p->since_last_sid = 0;
1850 p->data_updated = 1;
1853 p->dtx_state = new_state;
1875 *
seed = (*
seed * 31821U + 13849U) & 0xFFFFU;
1879 int field_size = *ord++;
1882 ((uint16_t *)&p->frame)[field >> 1] =
1883 *
win++ & ((1 << field_size) - 1);
1890 int *got_frame_ptr,
AVPacket *avpkt)
1894 const uint8_t *buf = avpkt->
data;
1895 int buf_size = avpkt->
size;
1905 float fixed_gain_factor;
1908 float synth_fixed_gain;
1909 const float *synth_fixed_vector;
1910 float *buf_out = (
float *)
frame->extended_data[ch];
1916 int mode = buf[0] >> 3 & 0x0F;
1917 int channel_size, rx_type, new_state, bfi;
1918 int prev_dtx_state = p->dtx_state;
1919 int sid_ind[5] = { 0 };
1932 if (channel_size > buf_size) {
1938 p->bad_frame_indicator = (buf[0] & 0x4) != 0x4;
1948 p->cur_frame_mode = sid_mode;
1950 if (p->bad_frame_indicator)
1952 else if (sid_update)
1956 }
else if (p->bad_frame_indicator) {
1964 if (p->cur_frame_mode ==
NO_DATA) {
1978 cn_frame(p, new_state, sid_ind, p->cur_frame_mode, synth);
1979 for (subframe = 0; subframe < 4; subframe++) {
1987 p->acelpf_ctx.acelp_apply_order_2_transfer_function(
1992 buf += channel_size;
1993 buf_size -= channel_size;
2006 p->bfh_state =
FFMIN(p->bfh_state + 1, 6);
2008 p->bfh_state = p->bfh_state == 6 ? 5 : 0;
2013 if (prev_dtx_state ==
DTX) {
2016 }
else if (prev_dtx_state ==
DTX_MUTE) {
2026 p->dtx_state = new_state;
2033 for (
i = 0;
i < 4;
i++)
2036 for (subframe = 0; subframe < 4; subframe++) {
2037 const AMRNBSubframe *amr_subframe = &p->frame.subframe[subframe];
2042 p->cur_frame_mode, subframe);
2051 decode_gains(p, amr_subframe, p->cur_frame_mode, subframe,
2052 &fixed_gain_factor);
2062 av_log(avctx,
AV_LOG_ERROR,
"The file is corrupted, pitch_lag = 0 is not allowed\n");
2074 p->celpm_ctx.dot_productf(p->fixed_vector,
2078 p->prediction_error,
2086 p->excitation[
i] *= p->pitch_gain[4];
2096 p->excitation[
i] =
truncf(p->excitation[
i]);
2102 p->lsf_avg, p->cur_frame_mode);
2104 synth_fixed_vector =
anti_sparseness(p, &fixed_sparse, p->fixed_vector,
2105 synth_fixed_gain, spare_vector);
2107 if (
synthesis(p, p->lpc[subframe], synth_fixed_gain,
2112 synthesis(p, p->lpc[subframe], synth_fixed_gain,
2126 p->acelpf_ctx.acelp_apply_order_2_transfer_function(buf_out,
2143 p->acelpv_ctx.weighted_vector_sumf(p->lsf_avg, p->lsf_avg, p->lsf_q[3],
2145 buf += channel_size;
2146 buf_size -= channel_size;
2151 return buf - avpkt->
data;
uint8_t ptrdiff_t const uint8_t ptrdiff_t int const int8_t * hf
void ff_tilt_compensation(float *mem, float tilt, float *samples, int size)
Apply tilt compensation filter, 1 - tilt * z-1.
av_cold void ff_acelp_filter_init(ACELPFContext *c)
Initialize ACELPFContext.
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)
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...
const float ff_pow_0_7[10]
Table of pow(0.7,n)
av_cold void ff_acelp_vectors_init(ACELPVContext *c)
Initialize ACELPVContext.
void ff_decode_10_pulses_35bits(const int16_t *fixed_index, AMRFixed *fixed_sparse, const uint8_t *gray_decode, int half_pulse_count, int bits)
Decode the algebraic codebook index to pulse positions and signs and construct the algebraic codebook...
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)
void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n)
Set the sum of squares of a signal by scaling.
const float ff_b60_sinc[61]
b60 hamming windowed sinc function coefficients
const float ff_pow_0_55[10]
Table of pow(0.55,n)
const float ff_pow_0_75[10]
Table of pow(0.75,n)
void ff_set_fixed_vector(float *out, const AMRFixed *in, float scale, int size)
Add fixed vector to an array from a sparse representation.
void ff_clear_fixed_vector(float *out, const AMRFixed *in, int size)
Clear array values set by set_fixed_vector.
static av_always_inline void update(AVFilterContext *ctx, AVFrame *insamples, int is_silence, int current_sample, int64_t nb_samples_notify, AVRational time_base)
static float win(SuperEqualizerContext *s, float n, int N)
const FFCodec ff_amrnb_decoder
static void ff_amr_bit_reorder(uint16_t *out, int size, const uint8_t *data, const R_TABLE_TYPE *ord_table)
Fill the frame structure variables from bitstream by parsing the given reordering table that uses the...
AMR narrowband data and definitions.
static const float *const ir_filters_lookup[2]
static const float dtx_log_en_adjust[9]
Speech mode dependent adjustment of the comfort noise level.
#define DTX_MAX_EMPTY_THRESH
static const int16_t window_200_40[240]
static const float cn_lsp_init[LP_FILTER_ORDER]
Initial LSP vector of the comfort noise decoder.
static const uint16_t gains_low[64][2]
gain table for 5.15 and 5.90 kbps modes
static const uint16_t qua_gain_pit[16]
scalar quantized pitch gain table for 7.95 and 12.2 kbps modes
static const uint8_t frame_sizes_nb[N_MODES]
number of bytes for each mode
static const float highpass_zeros[2]
static const uint16_t qua_gain_code[32]
scalar quantized fixed gain table for 7.95 and 12.2 kbps modes
static const float pred_fac[LP_FILTER_ORDER]
Prediction factor table for modes other than 12.2kbit/s.
static const int16_t lsf_3_3_MODE_5k15[128][4]
static const int16_t lsp_avg_init[LP_FILTER_ORDER]
Mean lsp values.
static const int16_t lsf_3_1_MODE_7k95[512][3]
Mode
Frame type (Table 1a in 3GPP TS 26.101)
static const uint8_t track_position[16]
track start positions for algebraic code book routines
#define DTX_ELAPSED_FRAMES_THRESH
static const float highpass_gain
static const int16_t lsf_5_4[256][4]
static const int8_t lsp_sub4_init[LP_FILTER_ORDER]
Values for the lsp vector from the 4th subframe of the previous subframe values.
static const int16_t lsf_5_5[64][4]
static const uint8_t gray_decode[8]
3-bit Gray code to binary lookup table
static const int16_t lsf_5_2[256][4]
static const int16_t lsf_5_1[128][4]
static const float *const ir_filters_lookup_MODE_7k95[2]
static const float lsf_hist_mean_scale[LP_FILTER_ORDER]
Scale factors applied to the deviation from the mean LSF vector.
static const int16_t lsf_3_1[256][3]
static const int16_t lsf_3_3[512][4]
static const float lsf_3_mean[LP_FILTER_ORDER]
#define AMR_SUBFRAME_SIZE
samples per subframe
static const uint16_t gains_MODE_4k75[512][2]
gain table for 4.75 kbps mode
#define LP_FILTER_ORDER
linear predictive coding filter order
static const float energy_pred_fac[4]
4-tap moving average prediction coefficients in reverse order
static const float lsf_5_mean[LP_FILTER_ORDER]
static const int16_t lsf_5_3[256][4]
static const float highpass_poles[2]
static const int16_t past_rq_init[8][LP_FILTER_ORDER]
Initial prediction residual vectors of the comfort noise LSF decoder, indexed by the first SID parame...
static const float energy_mean[8]
desired mean innovation energy, indexed by active mode
static const uint16_t gains_high[128][2]
gain table for 6.70, 7.40 and 10.2 kbps modes
static const uint8_t base_five_table[128][3]
Base-5 representation for values 0-124.
static const int16_t lsf_3_2[512][3]
static const uint8_t *const amr_unpacking_bitmaps_per_mode[N_MODES]
position of the bitmapping data for each packet type in the AMRNBFrame
#define CN_LEVEL_SCALE
Scaling of the comfort noise excitation level, the pulses of the fixed codebook of the reference have...
static int decode_sid_frame(const uint8_t *buf, int *ind, int *mode)
Decode the comfort noise parameters of a SID frame.
static void ec_gain_pitch_update(AMRContext *p, int bfi)
Update the pitch gain concealment state, ec_gain_pitch_update() in 3GPP TS 26.073 (ec_gains....
static void postfilter(AMRContext *p, float *lpc, float *buf_out)
Perform adaptive post-filtering to enhance the quality of the speech.
static void decode_pitch_vector(AMRContext *p, const AMRNBSubframe *amr_subframe, const int subframe, const int bfi)
static void update_state(AMRContext *p)
Update buffers and history at the end of decoding a subframe.
static const float * anti_sparseness(AMRContext *p, AMRFixed *fixed_sparse, const float *fixed_vector, float fixed_gain, float *out)
Reduce fixed vector sparseness by smoothing with one of three IR filters.
RXFrameType
Received frame types used by the comfort noise (DTX) state machine.
static void cn_synthesize(AMRContext *p, const float *lpc_variab, float level, int new_state, float *buf_out)
Synthesize one frame of comfort noise into the output buffer.
static void interpolate_lsf(ACELPVContext *ctx, float lsf_q[4][LP_FILTER_ORDER], float *lsf_new)
Interpolate the LSF vector (used for fixed gain smoothing).
static void lsf2lsp_for_mode12k2(AMRContext *p, double lsp[LP_FILTER_ORDER], const float lsf_no_r[LP_FILTER_ORDER], const int16_t *lsf_quantizer[5], const int quantizer_offset, const int sign, const int update)
Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
#define AMR_AGC_ALPHA
Adaptive gain control factor used in post-filter.
static void decode_pitch_lag_1_6(int *lag_int, int *lag_frac, int pitch_index, const int prev_lag_int, const int subframe)
Like ff_decode_pitch_lag(), but with 1/6 resolution.
static void build_cn_code(uint32_t *seed, float *cod)
Build the comfort noise excitation, a vector of sparse pulses.
static void decode_10bit_pulse(int code, int pulse_position[8], int i1, int i2, int i3)
Decode a 10-bit algebraic codebook index from a 10.2 kbit/s frame.
static void decode_gains(AMRContext *p, const AMRNBSubframe *amr_subframe, const enum Mode mode, const int subframe, float *fixed_gain_factor)
Decode pitch gain and fixed gain factor (part of section 6.1.3).
static void ec_gain_pitch(AMRContext *p, int state)
Conceal the pitch gain of a lost subframe, ec_gain_pitch() in 3GPP TS 26.073 (ec_gains....
static void ec_gain_code(AMRContext *p, int state)
Conceal the codebook gain of a lost subframe, ec_gain_code() in 3GPP TS 26.073 (ec_gains....
static void lpc2refl(const float *lpc, float *refl)
Compute the reflection coefficients of an LP filter with the backward Levinson recursion,...
#define PITCH_LAG_MIN_MODE_12k2
Lower bound on decoded lag search in 12.2kbit/s mode.
static int dtx_handler(AMRContext *p, int frame_type)
Update the comfort noise state machine for a received frame.
static void decode_lsf_noise(const int *ind, float *lsf_q)
Decode the LSF vector of a SID frame, the comfort noise quantizer does not use the prediction of the ...
static void lsf2lsp_3(AMRContext *p, int bfi)
Decode a set of 3 split-matrix quantized lsf indexes into an lsp vector.
static int synthesis(AMRContext *p, float *lpc, float fixed_gain, const float *fixed_vector, float *samples, uint8_t overflow)
Conduct 10th order linear predictive coding synthesis.
static int amrnb_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
static float pred_gain_log(const float *lpc)
Compute the logarithm of the prediction gain of an LP filter, it is used to normalize the level of th...
static void apply_ir_filter(float *out, const AMRFixed *in, const float *filter)
Circularly convolve a sparse fixed vector with a phase dispersion impulse response filter (D....
static float tilt_factor(AMRContext *p, float *lpc_n, float *lpc_d)
Get the tilt factor of a formant filter from its transfer function.
#define AMR_SAMPLE_BOUND
threshold for synthesis overflow
static void cn_reuse_speech_history(AMRContext *p, int mode)
Reuse the noise parameters of the speech frames preceding a silent period, they are the average of th...
static void ec_gain_code_update(AMRContext *p, int bfi)
Update the codebook gain concealment state, ec_gain_code_update() in 3GPP TS 26.073 (ec_gains....
#define LSF_ALPHA
Weights of the past LSFs and of their mean when concealing a lost frame, ALPHA and ONE_ALPHA of 3GPP ...
#define PRED_FAC_MODE_12k2
Prediction factor for 12.2kbit/s mode.
static void decode_fixed_sparse(AMRFixed *fixed_sparse, const uint16_t *pulses, const enum Mode mode, const int subframe)
Decode the algebraic codebook index to pulse positions and signs, then construct the algebraic codebo...
#define AMR_BLOCK_SIZE
samples per frame
#define AMR_TILT_GAMMA_T
Tilt factor = 1st reflection coefficient * gamma_t.
static void weighted_vector_sumd(double *out, const double *in_a, const double *in_b, double weight_coeff_a, double weight_coeff_b, int length)
Double version of ff_weighted_vector_sumf()
#define MIN_LSF_SPACING
Ensures stability of LPC filter.
static void cn_frame(AMRContext *p, int new_state, const int *ind, int mode, float *buf_out)
Decode one frame of comfort noise into the output buffer.
static enum Mode unpack_bitstream(AMRContext *p, const uint8_t *buf, int buf_size)
Unpack an RFC4867 speech frame into the AMR frame mode and parameters.
static void pitch_sharpening(AMRContext *p, int subframe, enum Mode mode, AMRFixed *fixed_sparse)
Apply pitch lag to obtain the sharpened fixed vector (section 6.1.2)
static float fixed_gain_smooth(AMRContext *p, const float *lsf, const float *lsf_avg, const enum Mode mode)
fixed gain smoothing Note that where the spec specifies the "spectrum in the q domain" in section 6....
static void build_bad_frame_params(AMRContext *p, uint32_t *seed, enum Mode mode)
Fill the frame parameters of a lost speech frame with pseudo-random values, see build_CN_param() in 3...
static void cn_update_from_sid(AMRContext *p, const int *ind)
Update the comfort noise parameters with the ones carried by a SID frame and reset the state the spee...
static float ec_gain_median(const float *buf)
Median of the last five gain values, equivalent to gmed_n() in 3GPP TS 26.073 (gmed_n....
static void ec_reset(AMRContext *p)
Reset the bad frame handling and gain concealment states, matching Decoder_amr_reset() and ec_gain_*_...
static void ec_gain_code_predictor_update(AMRContext *p)
Advance the gain predictor with the average of the four past energies, gc_pred_average_limited() foll...
#define AMR_SAMPLE_SCALE
Scale from constructed speech to [-1,1].
#define MIN_ENERGY
Initial energy in dB.
#define SHARP_MAX
Maximum sharpening factor.
DTXState
States of the comfort noise (DTX) state machine.
static void decode_8_pulses_31bits(const int16_t *fixed_index, AMRFixed *fixed_sparse)
Decode the algebraic codebook index to pulse positions and signs and construct the algebraic codebook...
static int pseudonoise(uint32_t *shift_reg, int no_bits)
Comfort noise (DTX) generation, see 3GPP TS 26.092.
static av_cold int amrnb_decode_init(AVCodecContext *avctx)
#define LSF_R_FAC
LSF residual tables to Hertz.
static void lsf2lsp_5(AMRContext *p, int bfi)
Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors.
static void dtx_activity_update(AMRContext *p, const float *synth)
Store the LSF vector and the energy of a speech frame so that the first SID frame of a silent period ...
#define AMR_TILT_RESPONSE
Number of impulse response coefficients used for tilt factor.
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Libavcodec external API header.
#define i(width, name, range_min, range_max)
void ff_celp_circ_addf(float *out, const float *in, const float *lagged, int lag, float fac, int n)
Add an array to a rotated array.
void av_cold ff_celp_filter_init(CELPFContext *c)
Initialize CELPFContext.
av_cold void ff_celp_math_init(CELPMContext *c)
Initialize CELPMContext.
Public libavutil channel layout APIs header.
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
common internal and external API header
static __device__ float truncf(float a)
static __device__ float fabsf(float a)
static __device__ float fabs(float a)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
static const int8_t pulses[4]
Number of non-zero pulses in the MP-MLQ excitation.
bitstream reader API header.
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
#define AV_CHANNEL_LAYOUT_MONO
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_SAMPLE_FMT_FLTP
float, planar
static void filter1(SUINT32 *dst, const int32_t *src, int32_t coeff, ptrdiff_t len)
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
void ff_acelp_lspd2lpc(const double *lsp, float *lpc, int lp_half_order)
Reconstruct LPC coefficients from the line spectral pair frequencies.
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.
void ff_acelp_lsf2lspd(double *lsp, const float *lsf, int lp_order)
Floating point version of ff_acelp_lsf2lsp()
CELPFContext celpf_ctx
context for filters for CELP-based codecs
uint32_t cn_seed
comfort noise generator shift register
double lsp[4][LP_FILTER_ORDER]
lsp vectors from current frame
float prev_sparse_fixed_gain
previous fixed gain; used by anti-sparseness processing to determine "onset"
uint8_t hang_count
the number of subframes since a hangover period started
float lsf_hist[DTX_HIST_SIZE][LP_FILTER_ORDER]
LSF history used when a SID frame starts DTX.
int hangover_added
a DTX hangover was assumed for this frame
uint8_t pitch_lag_int
integer part of pitch lag from current subframe
float pitch_vector[AMR_SUBFRAME_SIZE]
adaptive code book (pitch) vector
int valid_data
the CN parameters of this frame may be used
ACELPFContext acelpf_ctx
context for filters for ACELP-based codecs
float excitation_buf[PITCH_DELAY_MAX+LP_FILTER_ORDER+1+AMR_SUBFRAME_SIZE]
current excitation and all necessary excitation history
float fixed_gain[5]
quantified fixed gains for the current and previous four subframes
float cn_lsp[LP_FILTER_ORDER]
comfort noise LSP vector of the last SID
float lsf_q[4][LP_FILTER_ORDER]
Interpolated LSF vector for fixed gain smoothing.
uint8_t bad_frame_indicator
bad frame ? 1 : 0
float tilt_mem
previous input to tilt compensation filter
int data_updated
CN parameters have been renewed at least once.
float sid_period_inv
inverse of the SID update period
float log_en_hist[DTX_HIST_SIZE]
energy history used when a SID frame starts DTX
uint32_t no_data_seed
pseudo-random source for lost frames
float cn_log_en
comfort noise log2 energy of the last SID
ACELPVContext acelpv_ctx
context for vector operations for ACELP-based codecs
int prev_bf
the previous frame could not be used
float lpc[4][LP_FILTER_ORDER]
lpc coefficient vectors for 4 subframes
float beta
previous pitch_gain, bounded by [0.0,SHARP_MAX]
int bfh_state
bad frame handling state (0..6)
float cn_lsp_old[LP_FILTER_ORDER]
comfort noise LSP vector before the last SID
float lsf_avg[LP_FILTER_ORDER]
vector of averaged lsf vector
float postfilter_mem[10]
previous intermediate values in the formant filter
int lsf_hist_ptr
next position to write in the LSF history
int16_t prev_lsf_r[LP_FILTER_ORDER]
residual LSF vector from previous subframe
uint8_t prev_ir_filter_nr
previous impulse response filter "impNr": 0 - strong, 1 - medium, 2 - none
float lsf_hist_mean[DTX_HIST_SIZE][LP_FILTER_ORDER]
deviation from the mean of the LSF history
uint8_t ir_filter_onset
flag for impulse response filter strength
float high_pass_mem[2]
previous intermediate values in the high-pass filter
float prediction_error[4]
quantified prediction errors {20log10(^gamma_gc)} for previous four subframes
float cn_log_en_old
comfort noise log2 energy before the last SID
float * excitation
pointer to the current excitation vector in excitation_buf
float log_en_adjust
speech mode dependent level adjustment
float log_pg_mean
smoothed logarithm of the prediction gain
float pitch_gain[5]
quantified pitch gains for the current and previous four subframes
float samples_in[LP_FILTER_ORDER+AMR_SUBFRAME_SIZE]
floating point samples
double prev_lsp_sub4[LP_FILTER_ORDER]
lsp vector for the 4th subframe of the previous frame
float postfilter_agc
previous factor used for adaptive gain control
int hangover_count
remaining DTX hangover frames
int dec_ana_elapsed
frames since the last DTX hangover
CELPMContext celpm_ctx
context for fixed point math operations
int since_last_sid
frames since the last SID update
int log_en_hist_ptr
next position to write in the energy history
uint8_t diff_count
the number of subframes for which diff has been above 0.65
float fixed_vector[AMR_SUBFRAME_SIZE]
algebraic codebook (fixed) vector (must be kept zero between frames)
int sid_frame
the current frame carries CN parameters
int dtx_state
current DTX state (SPEECH, DTX or DTX_MUTE)
AMRNBFrame frame
decoded AMR parameters (lsf coefficients, codebook indexes, etc)
Sparse representation for the algebraic codebook (fixed) vector.
AMRNB unpacked data frame.
AMRNB unpacked data subframe.
uint16_t pulses[10]
pulses: 10 for MODE_12k2, 7 for MODE_10k2, and index and sign for others
uint16_t p_gain
index to decode the pitch gain
uint16_t fixed_gain
index to decode the fixed gain factor, for MODE_12k2 and MODE_7k95
uint16_t p_lag
index to decode the pitch lag
An AVChannelLayout holds information about the channel layout of audio data.
int nb_channels
Number of channels in this layout.
main external API structure.
AVChannelLayout ch_layout
Audio channel layout.
enum AVSampleFormat sample_fmt
audio sample format
int sample_rate
samples per second
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
static struct @232240247175332074307271266321204261331170211232 state
static float mean(const float *input, int size)
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static const uint16_t positions[][14][3]