annotate libtwamr/dec_amr.c @ 581:e2d5cad04cbf

libgsmhr1 RxFE: store CN R0+LPC separately from speech In the original GSM 06.06 code the ECU for speech mode is entirely separate from the CN generator, maintaining separate state. (The main intertie between them is the speech vs CN state variable, distinguishing between speech and CN BFIs, in addition to the CN-specific function of distinguishing between initial and update SIDs.) In the present RxFE implementation I initially thought that we could use the same saved_frame buffer for both ECU and CN, overwriting just the first 4 params (R0 and LPC) when a valid SID comes in. However, I now realize it was a bad idea: the original code has a corner case (long sequence of speech-mode BFIs to put the ECU in state 6, then SID and CN-mode BFIs, then a good speech frame) that would be broken by that buffer reuse approach. We could eliminate this corner case by resetting the ECU state when passing through a CN insertion period, but doing so would needlessly increase the behavioral diffs between GSM 06.06 and our version. Solution: use a separate CN-specific buffer for CN R0+LPC parameters, and match the behavior of GSM 06.06 code in this regard.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 10:02:45 +0000
parents 7bef001cd8b8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
426
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * R99 Version 3.3.0
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * REL-4 Version 4.1.0
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 * File : dec_amr.c
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * Purpose : Decoding of one speech frame using given codec mode
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 /*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * MODULE INCLUDE FILE AND VERSION ID
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 #include "namespace.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 #include "dec_amr.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 #include "typedef.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 #include "basic_op.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 #include "no_count.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 #include "cnst.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 #include "memops.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 #include "syn_filt.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include "d_plsf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include "agc.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "int_lpc.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "dec_gain.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "dec_lag3.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "dec_lag6.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "d2_9pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 #include "d2_11pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 #include "d3_14pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 #include "d4_17pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 #include "d8_31pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 #include "d1035pf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 #include "pred_lt.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 #include "d_gain_p.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 #include "d_gain_c.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 #include "dec_gain.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 #include "ec_gains.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 #include "ph_disp.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 #include "c_g_aver.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 #include "int_lsf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 #include "lsp_lsf.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 #include "lsp_avg.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 #include "bgnscd.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 #include "ex_ctrl.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 #include "sqrt_l.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 #include "lsp_tab.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 #include "bitno.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 #include "b_cn_cod.h"
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 /*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 * LOCAL VARIABLES AND TABLES
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 /*-----------------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * Decoder constant parameters (defined in "cnst.h") *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 *-----------------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 * L_FRAME : Frame size. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 * L_FRAME_BY2 : Half the frame size. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 * L_SUBFR : Sub-frame size. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 * M : LPC order. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 * MP1 : LPC order+1 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 * PIT_MIN : Minimum pitch lag. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 * PIT_MIN_MR122 : Minimum pitch lag for the MR122 mode. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 * PIT_MAX : Maximum pitch lag. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 * L_INTERPOL : Length of filter for interpolation *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 * PRM_SIZE : size of vector containing analysis parameters *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 *-----------------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 /*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 * PUBLIC PROGRAM CODE
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 *****************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 /*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 **************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 * Function : Decoder_amr_reset
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 * Purpose : Resets state memory
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 **************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 void Decoder_amr_reset (Decoder_amrState *state, Flag dtx_partial_reset)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 Word16 i;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 /* Initialize static pointer */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 /* Static vectors to zero */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 Set_zero (state->old_exc, PIT_MAX + L_INTERPOL);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 if (!dtx_partial_reset)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 Set_zero (state->mem_syn, M);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 /* initialize pitch sharpening */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 state->sharp = SHARPMIN;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 state->old_T0 = 40;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 /* Initialize state->lsp_old [] */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 if (!dtx_partial_reset) {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 Copy(lsp_init_data, &state->lsp_old[0], M);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 /* Initialize memories of bad frame handling */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 state->prev_bf = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 state->prev_pdf = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 state->state = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 state->T0_lagBuff = 40;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 state->inBackgroundNoise = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 state->voicedHangover = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 if (!dtx_partial_reset) {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 for (i=0;i<9;i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 state->excEnergyHist[i] = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 for (i = 0; i < 9; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 state->ltpGainHistory[i] = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 Cb_gain_average_reset(&state->Cb_gain_averState);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 if (!dtx_partial_reset)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 lsp_avg_reset(&state->lsp_avg_st);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 D_plsf_reset(&state->lsfState);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 ec_gain_pitch_reset(&state->ec_gain_p_st);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 ec_gain_code_reset(&state->ec_gain_c_st);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 if (!dtx_partial_reset)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 gc_pred_reset(&state->pred_state);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 Bgn_scd_reset(&state->background_state);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 state->nodataSeed = 21845;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 ph_disp_reset(&state->ph_disp_st);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 if (!dtx_partial_reset)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 dtx_dec_reset(&state->dtxDecoderState);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 /*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 **************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * Function : Decoder_amr
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * Purpose : Speech decoder routine.
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 **************************************************************************
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 int Decoder_amr (
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 Decoder_amrState *st, /* i/o : State variables */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 enum Mode mode, /* i : AMR mode */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 Word16 parm[], /* i : vector of synthesis parameters
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 (PRM_SIZE) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 enum RXFrameType frame_type, /* i : received frame type */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 Word16 synth[], /* o : synthesis speech (L_FRAME) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 Word16 A_t[] /* o : decoded LP filter in 4 subframes
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 (AZ_SIZE) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 /* LPC coefficients */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 Word16 *Az; /* Pointer on A_t */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 /* LSPs */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 Word16 lsp_new[M];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 Word16 lsp_mid[M];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 /* LSFs */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 Word16 prev_lsf[M];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 Word16 lsf_i[M];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 /* Algebraic codevector */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 Word16 code[L_SUBFR];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 /* excitation */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 Word16 excp[L_SUBFR];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 Word16 exc_enhanced[L_SUBFR];
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 /* Scalars */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 Word16 i, i_subfr;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 Word16 T0, T0_frac, index, index_mr475 = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 Word16 t0_min, t0_max;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 Word16 delta_frc_low, delta_frc_range;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 Word16 tmp_shift;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 Word16 temp;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 Word32 L_temp;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 Word16 flag4;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 Word16 carefulFlag;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 Word16 excEnergy;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 Word16 subfrNr;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 Word16 evenSubfr = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 Word16 bfi = 0; /* bad frame indication flag */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 Word16 pdfi = 0; /* potential degraded bad frame flag */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 enum DTXStateType newDTXState; /* SPEECH , DTX, DTX_MUTE */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 /* find the new DTX state SPEECH OR DTX */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 newDTXState = rx_dtx_handler(&st->dtxDecoderState, frame_type);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 /* DTX actions */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 if (sub(newDTXState, SPEECH) != 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 Decoder_amr_reset (st, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 dtx_dec(&st->dtxDecoderState,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 st->mem_syn,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 &st->lsfState,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 &st->pred_state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 &st->Cb_gain_averState,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 newDTXState,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 mode,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 parm, synth, A_t);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 /* update average lsp */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 Lsf_lsp(st->lsfState.past_lsf_q, st->lsp_old, M);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 lsp_avg(&st->lsp_avg_st, st->lsfState.past_lsf_q);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 goto the_end;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 /* SPEECH action state machine */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 if ((sub(frame_type, RX_SPEECH_BAD) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 (sub(frame_type, RX_NO_DATA) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 (sub(frame_type, RX_ONSET) == 0))
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 bfi = 1;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 if ((sub(frame_type, RX_NO_DATA) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 (sub(frame_type, RX_ONSET) == 0))
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 build_CN_param(&st->nodataSeed,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 prmno[mode],
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 bitno[mode],
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 parm);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 pdfi = 1;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 if (bfi != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 st->state = add (st->state, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 else if (sub (st->state, 6) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 st->state = 5; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 st->state = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 if (sub (st->state, 6) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 st->state = 6; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 /* If this frame is the first speech frame after CNI period, */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 /* set the BFH state machine to an appropriate state depending */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 /* on whether there was DTX muting before start of speech or not */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 /* If there was DTX muting, the first speech frame is muted. */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 /* If there was no DTX muting, the first speech frame is not */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 /* muted. The BFH state machine starts from state 5, however, to */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 /* keep the audible noise resulting from a SID frame which is */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 /* erroneously interpreted as a good speech frame as small as */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 /* possible (the decoder output in this case is quickly muted) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 if (sub(st->dtxDecoderState.dtxGlobalState, DTX) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 st->state = 5;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 st->prev_bf = 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 else if (test (), sub(st->dtxDecoderState.dtxGlobalState, DTX_MUTE) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 st->state = 5;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 st->prev_bf = 1;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 /* save old LSFs for CB gain smoothing */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 Copy (st->lsfState.past_lsf_q, prev_lsf, M);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 /* decode LSF parameters and generate interpolated lpc coefficients
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 for the 4 subframes */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 if (sub (mode, MR122) != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 D_plsf_3(&st->lsfState, mode, bfi, parm, lsp_new);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 /* Advance synthesis parameters pointer */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 parm += 3; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 Int_lpc_1to3(st->lsp_old, lsp_new, A_t);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 D_plsf_5(&st->lsfState, bfi, parm, lsp_mid, lsp_new);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 /* Advance synthesis parameters pointer */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 parm += 5; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 Int_lpc_1and3(st->lsp_old, lsp_mid, lsp_new, A_t);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 /* update the LSPs for the next frame */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 for (i = 0; i < M; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 st->lsp_old[i] = lsp_new[i]; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 /*------------------------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 * Loop for every subframe in the analysis frame *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 *------------------------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 * times *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 * - decode the pitch delay *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 * - decode algebraic code *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 * - decode pitch and codebook gains *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 * - find the excitation and compute synthesis speech *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 *------------------------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /* pointer to interpolated LPC parameters */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 Az = A_t; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 evenSubfr = 0; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 subfrNr = -1; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 subfrNr = add(subfrNr, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 evenSubfr = sub(1, evenSubfr);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 /* flag for first and 3th subframe */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 pit_flag = i_subfr; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 if (sub (i_subfr, L_FRAME_BY2) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 test(); test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 pit_flag = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 /* pitch index */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 index = *parm++; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 * - decode pitch lag and find adaptive codebook vector. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 if (sub(mode, MR122) != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 /* flag4 indicates encoding with 4 bit resolution; */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 /* this is needed for mode MR475, MR515, MR59 and MR67 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 flag4 = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 if ((sub (mode, MR475) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 (sub (mode, MR515) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 (sub (mode, MR59) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 (sub (mode, MR67) == 0) ) {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 flag4 = 1; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381 * - get ranges for the t0_min and t0_max *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 * - only needed in delta decoding *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 delta_frc_low = 5; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 delta_frc_range = 9; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 if ( sub(mode, MR795) == 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 delta_frc_low = 10; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 delta_frc_range = 19; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 t0_min = sub(st->old_T0, delta_frc_low);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 if (sub(t0_min, PIT_MIN) < 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 t0_min = PIT_MIN; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 t0_max = add(t0_min, delta_frc_range);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 if (sub(t0_max, PIT_MAX) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405 t0_max = PIT_MAX; move16();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 t0_min = sub(t0_max, delta_frc_range);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410 &T0, &T0_frac, flag4);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 st->T0_lagBuff = T0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 if (bfi != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 if (sub (st->old_T0, PIT_MAX) < 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 { /* Graceful pitch */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 st->old_T0 = add(st->old_T0, 1); /* degradation */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 T0 = st->old_T0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 T0_frac = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 test (); test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 if ( st->inBackgroundNoise != 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 sub(st->voicedHangover, 4) > 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 ((sub(mode, MR475) == 0 ) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 (sub(mode, MR515) == 0 ) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 (sub(mode, MR59) == 0) )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 T0 = st->T0_lagBuff; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 Dec_lag6 (index, PIT_MIN_MR122,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 PIT_MAX, pit_flag, &T0, &T0_frac);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0))
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 st->T0_lagBuff = T0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 T0 = st->old_T0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 T0_frac = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 * - (MR122 only: Decode pitch gain.) *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 * - Decode innovative codebook. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 * - set pitch sharpening factor *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464 if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 { /* MR475, MR515 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 index = *parm++; /* index of position */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 i = *parm++; /* signs */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 decode_2i40_9bits (subfrNr, i, index, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 pit_sharp = shl (st->sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 else if (sub (mode, MR59) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 { /* MR59 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 index = *parm++; /* index of position */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 i = *parm++; /* signs */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 decode_2i40_11bits (i, index, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 pit_sharp = shl (st->sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483 else if (sub (mode, MR67) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 { /* MR67 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 index = *parm++; /* index of position */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487 i = *parm++; /* signs */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 decode_3i40_14bits (i, index, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
491 pit_sharp = shl (st->sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
492 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 else if (sub (mode, MR795) <= 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 { /* MR74, MR795 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495 test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496 index = *parm++; /* index of position */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 i = *parm++; /* signs */ move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499 decode_4i40_17bits (i, index, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 pit_sharp = shl (st->sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
502 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 else if (sub (mode, MR102) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
504 { /* MR102 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
505 test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
506
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507 dec_8i40_31bits (parm, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 parm += 7; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
509
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
510 pit_sharp = shl (st->sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
511 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
512 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513 { /* MR122 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514 test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
515 index = *parm++; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
516 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 if (bfi != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523 gain_pit = d_gain_pitch (mode, index); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 dec_10i40_35bits (parm, code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 parm += 10; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
530
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
531 /* pit_sharp = gain_pit; */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 /* if (pit_sharp > 1.0) pit_sharp = 1.0; */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
533
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534 pit_sharp = shl (gain_pit, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 * - Add the pitch contribution to code[]. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
539 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
540 for (i = T0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
541 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542 temp = mult (code[i - T0], pit_sharp);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543 code[i] = add (code[i], temp);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544 move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
546
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
547 /*------------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 * - Decode codebook gain (MR122) or both pitch *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
549 * gain and codebook gain (all others) *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 * - Update pitch sharpening "sharp" with quantized gain_pit *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 *------------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 if (test(), sub (mode, MR475) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
555 /* read and decode pitch and code gain */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
556 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 if (evenSubfr != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
558 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559 index_mr475 = *parm++; move16 (); /* index of gain(s) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 if (bfi == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 Dec_gain(&st->pred_state, mode, index_mr475, code,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 evenSubfr, &gain_pit, &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
569 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
576 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
579 pit_sharp = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
580 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581 if (sub (pit_sharp, SHARPMAX) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 pit_sharp = SHARPMAX; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
587 else if (test(), test(), (sub (mode, MR74) <= 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
588 (sub (mode, MR102) == 0))
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 /* read and decode pitch and code gain */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591 index = *parm++; move16 (); /* index of gain(s) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
592
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
593 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594 if (bfi == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
595 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
596 Dec_gain(&st->pred_state, mode, index, code,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597 evenSubfr, &gain_pit, &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
605 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
606 &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
607 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
608 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 pit_sharp = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612 if (sub (pit_sharp, SHARPMAX) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 pit_sharp = SHARPMAX; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
615 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 if (sub (mode, MR102) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 if (sub (st->old_T0, add(L_SUBFR, 5)) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621 pit_sharp = shr(pit_sharp, 2);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
627 /* read and decode pitch gain */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
628 index = *parm++; move16 (); /* index of gain(s) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
629
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631 if (sub (mode, MR795) == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 /* decode pitch gain */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635 if (bfi != 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
637 ec_gain_pitch (&st->ec_gain_p_st, st->state, &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
638 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 gain_pit = d_gain_pitch (mode, index); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 ec_gain_pitch_update (&st->ec_gain_p_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 &gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
645
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
646 /* read and decode code gain */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647 index = *parm++; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
649 if (bfi == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651 d_gain_code (&st->pred_state, mode, index, code, &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
653 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
654 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
655 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
658 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661 pit_sharp = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
663 if (sub (pit_sharp, SHARPMAX) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
664 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
665 pit_sharp = SHARPMAX; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669 { /* MR122 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 if (bfi == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673 d_gain_code (&st->pred_state, mode, index, code, &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
674 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
675 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677 ec_gain_code (&st->ec_gain_c_st, &st->pred_state, st->state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 ec_gain_code_update (&st->ec_gain_c_st, bfi, st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681 &gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
682
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683 pit_sharp = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
686
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
687 /* store pitch sharpening for next subframe */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 /* (for modes which use the previous pitch gain for
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689 pitch sharpening in the search phase) */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690 /* do not update sharpening in even subframes for MR475 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 test(); test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 if (sub(mode, MR475) != 0 || evenSubfr == 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 st->sharp = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 if (sub (st->sharp, SHARPMAX) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
698 st->sharp = SHARPMAX; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
699 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
700 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
701
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 pit_sharp = shl (pit_sharp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704 if (sub (pit_sharp, 16384) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706 for (i = 0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 temp = mult (st->exc[i], pit_sharp);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 L_temp = L_mult (temp, gain_pit);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
711 if (sub(mode, MR122)==0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
712 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713 L_temp = L_shr (L_temp, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
714 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715 excp[i] = round (L_temp); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 * - Store list of LTP gains needed in the source *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 * characteristic detector (SCD) *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 if ( bfi == 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 for (i = 0; i < 8; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
727 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
728 st->ltpGainHistory[i] = st->ltpGainHistory[i+1]; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 st->ltpGainHistory[8] = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 * - Limit gain_pit if in background noise and BFI *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735 * for MR475, MR515, MR59 *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 test (); test (); test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740 ((sub(mode, MR475) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 (sub(mode, MR515) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 (sub(mode, MR59) == 0))
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746 if ( sub (gain_pit, 12288) > 0) /* if (gain_pit > 0.75) in Q14*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 );
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 if ( sub (gain_pit, 14745) > 0) /* if (gain_pit > 0.90) in Q14*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 gain_pit = 14745; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 * Calculate CB mixed gain *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 Int_lsf(prev_lsf, st->lsfState.past_lsf_q, i_subfr, lsf_i);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 gain_code_mix = Cb_gain_average(
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 &st->Cb_gain_averState, mode, gain_code,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 lsf_i, st->lsp_avg_st.lsp_meanSave, bfi,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764 st->prev_bf, pdfi, st->prev_pdf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765 st->inBackgroundNoise, st->voicedHangover); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 /* make sure that MR74, MR795, MR122 have original code_gain*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
768 test();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
770 /* MR74, MR795, MR122 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
771 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
772 gain_code_mix = gain_code; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
775 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
776 * - Find the total excitation. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 * - Find synthesis speech corresponding to st->exc[]. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
779 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780 if (sub(mode, MR102) <= 0) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 pitch_fac = gain_pit; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
783 tmp_shift = 1; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
784 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 else /* MR122 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
786 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
787 pitch_fac = shr (gain_pit, 1); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 tmp_shift = 2; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 /* copy unscaled LTP excitation to exc_enhanced (used in phase
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792 * dispersion below) and compute total excitation for LTP feedback
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 for (i = 0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 exc_enhanced[i] = st->exc[i]; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
797
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
798 /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
799 L_temp = L_mult (st->exc[i], pitch_fac);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800 /* 12.2: Q0 * Q13 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 /* 7.4: Q0 * Q14 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802 L_temp = L_mac (L_temp, code[i], gain_code);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803 /* 12.2: Q12 * Q1 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804 /* 7.4: Q13 * Q1 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 L_temp = L_shl (L_temp, tmp_shift); /* Q16 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806 st->exc[i] = round (L_temp); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 * - Adaptive phase dispersion *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
812 ph_disp_release(&st->ph_disp_st); /* free phase dispersion adaption */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
813
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 test (); test (); test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815 if ( ((sub(mode, MR475) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816 (sub(mode, MR515) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
817 (sub(mode, MR59) == 0)) &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
818 sub(st->voicedHangover, 3) > 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819 st->inBackgroundNoise != 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 bfi != 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
822 ph_disp_lock(&st->ph_disp_st); /* Always Use full Phase Disp. */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
823 } /* if error in bg noise */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825 /* apply phase dispersion to innovation (if enabled) and
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 compute total excitation for synthesis part */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 ph_disp(&st->ph_disp_st, mode,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828 exc_enhanced, gain_code_mix, gain_pit, code,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 pitch_fac, tmp_shift);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832 * - The Excitation control module are active during BFI.*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 * - Conceal drops in signal energy if in bg noise. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836 L_temp = 0; move32 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837 for (i = 0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839 L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] );
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
841
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
842 L_temp = L_shr (L_temp, 1); /* excEnergy = sqrt(L_temp) in Q0 */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
843 L_temp = sqrt_l_exp(L_temp, &temp); move32 (); /* function result */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
844 L_temp = L_shr(L_temp, add( shr(temp, 1), 15));
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
845 L_temp = L_shr(L_temp, 2); /* To cope with 16-bit and */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
846 excEnergy = extract_l(L_temp); /* scaling in ex_ctrl() */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
847
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
848 test (); test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
849 test (); test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
850 if ( ((sub (mode, MR475) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
851 (sub (mode, MR515) == 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
852 (sub (mode, MR59) == 0)) &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
853 sub(st->voicedHangover, 5) > 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854 st->inBackgroundNoise != 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855 sub(st->state, 4) < 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 ( (pdfi != 0 && st->prev_pdf != 0) ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857 bfi != 0 ||
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858 st->prev_bf != 0) )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
859 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
860 carefulFlag = 0; move32 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
861 test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
862 if ( pdfi != 0 && bfi == 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 carefulFlag = 1; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
865 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
866
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 Ex_ctrl(exc_enhanced,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868 excEnergy,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869 st->excEnergyHist,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 st->voicedHangover,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 st->prev_bf,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872 carefulFlag);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
873 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
874
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875 test (); test (); test (); test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876 if ( st->inBackgroundNoise != 0 &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
877 ( bfi != 0 || st->prev_bf != 0 ) &&
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
878 sub(st->state, 4) < 0 )
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
879 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
880 ; /* do nothing! */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
881 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
882 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
883 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
884 /* Update energy history for all modes */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
885 for (i = 0; i < 8; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
886 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
887 st->excEnergyHist[i] = st->excEnergyHist[i+1]; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
888 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
889 st->excEnergyHist[8] = excEnergy; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
890 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
891 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
892 * Excitation control module end. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
896 if (sub (pit_sharp, 16384) > 0)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
897 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
898 for (i = 0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
899 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900 excp[i] = add (excp[i], exc_enhanced[i]);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
902 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 agc2 (exc_enhanced, excp, L_SUBFR);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904 Overflow = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 st->mem_syn, 0);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
907 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
908 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
910 Overflow = 0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
911 Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
912 st->mem_syn, 0);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
913 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 test ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 if (Overflow != 0) /* Test for overflow */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
918 for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
919 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 st->old_exc[i] = shr(st->old_exc[i], 2); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
922 for (i = 0; i < L_SUBFR; i++)
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
923 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
924 exc_enhanced[i] = shr(exc_enhanced[i], 2); move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
925 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
928 else
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
929 {
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
930 Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
931 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
932
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
933 /*--------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 * Update signal for next frame. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 * -> shift to the left by L_SUBFR st->exc[] *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
936 *--------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
937
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
938 Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
939
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
940 /* interpolated LPC parameters for next subframe */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
941 Az += MP1; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
942
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
943 /* store T0 for next subframe */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
944 st->old_T0 = T0; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
945 }
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
946
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
947 /*-------------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948 * Call the Source Characteristic Detector which updates *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 * st->inBackgroundNoise and st->voicedHangover. *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
950 *-------------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
951
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
952 st->inBackgroundNoise = Bgn_scd(&st->background_state,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
953 &(st->ltpGainHistory[0]),
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
954 &(synth[0]),
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
955 &(st->voicedHangover) );
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
956
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
957 dtx_dec_activity_update(&st->dtxDecoderState,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 st->lsfState.past_lsf_q,
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
959 synth);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
960
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
961 /* store bfi for next subframe */
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
962 st->prev_bf = bfi; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
963 st->prev_pdf = pdfi; move16 ();
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
964
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
965 /*--------------------------------------------------*
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
966 * Calculate the LSF averages on the eight *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
967 * previous frames *
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968 *--------------------------------------------------*/
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
969
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 lsp_avg(&st->lsp_avg_st, st->lsfState.past_lsf_q);
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
971
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
972 the_end:
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
973 st->dtxDecoderState.dtxGlobalState = newDTXState;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
974
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
975 return 0;
7bef001cd8b8 libtwamr: integrate dec_amr.c
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 }