Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * AMR wideband decoder | ||
3 | * Copyright (c) 2010 Marcelo Galvao Povoa | ||
4 | * | ||
5 | * This file is part of FFmpeg. | ||
6 | * | ||
7 | * FFmpeg is free software; you can redistribute it and/or | ||
8 | * modify it under the terms of the GNU Lesser General Public | ||
9 | * License as published by the Free Software Foundation; either | ||
10 | * version 2.1 of the License, or (at your option) any later version. | ||
11 | * | ||
12 | * FFmpeg is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A particular PURPOSE. See the GNU | ||
15 | * Lesser General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU Lesser General Public | ||
18 | * License along with FFmpeg; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
20 | */ | ||
21 | |||
22 | /** | ||
23 | * @file | ||
24 | * AMR wideband decoder | ||
25 | */ | ||
26 | |||
27 | #include "config.h" | ||
28 | |||
29 | #include "libavutil/avassert.h" | ||
30 | #include "libavutil/channel_layout.h" | ||
31 | #include "libavutil/common.h" | ||
32 | #include "libavutil/lfg.h" | ||
33 | |||
34 | #include "avcodec.h" | ||
35 | #include "lsp.h" | ||
36 | #include "celp_filters.h" | ||
37 | #include "celp_math.h" | ||
38 | #include "acelp_filters.h" | ||
39 | #include "acelp_vectors.h" | ||
40 | #include "acelp_pitch_delay.h" | ||
41 | #include "codec_internal.h" | ||
42 | #include "decode.h" | ||
43 | |||
44 | #define AMR_USE_16BIT_TABLES | ||
45 | #include "amr.h" | ||
46 | |||
47 | #include "amrwbdata.h" | ||
48 | #if ARCH_MIPS | ||
49 | #include "mips/amrwbdec_mips.h" | ||
50 | #endif /* ARCH_MIPS */ | ||
51 | |||
52 | typedef struct AMRWBContext { | ||
53 | AMRWBFrame frame; ///< AMRWB parameters decoded from bitstream | ||
54 | enum Mode fr_cur_mode; ///< mode index of current frame | ||
55 | uint8_t fr_quality; ///< frame quality index (FQI) | ||
56 | float isf_cur[LP_ORDER]; ///< working ISF vector from current frame | ||
57 | float isf_q_past[LP_ORDER]; ///< quantized ISF vector of the previous frame | ||
58 | float isf_past_final[LP_ORDER]; ///< final processed ISF vector of the previous frame | ||
59 | double isp[4][LP_ORDER]; ///< ISP vectors from current frame | ||
60 | double isp_sub4_past[LP_ORDER]; ///< ISP vector for the 4th subframe of the previous frame | ||
61 | |||
62 | float lp_coef[4][LP_ORDER]; ///< Linear Prediction Coefficients from ISP vector | ||
63 | |||
64 | uint8_t base_pitch_lag; ///< integer part of pitch lag for the next relative subframe | ||
65 | uint8_t pitch_lag_int; ///< integer part of pitch lag of the previous subframe | ||
66 | |||
67 | float excitation_buf[AMRWB_P_DELAY_MAX + LP_ORDER + 2 + AMRWB_SFR_SIZE]; ///< current excitation and all necessary excitation history | ||
68 | float *excitation; ///< points to current excitation in excitation_buf[] | ||
69 | |||
70 | float pitch_vector[AMRWB_SFR_SIZE]; ///< adaptive codebook (pitch) vector for current subframe | ||
71 | float fixed_vector[AMRWB_SFR_SIZE]; ///< algebraic codebook (fixed) vector for current subframe | ||
72 | |||
73 | float prediction_error[4]; ///< quantified prediction errors {20log10(^gamma_gc)} for previous four subframes | ||
74 | float pitch_gain[6]; ///< quantified pitch gains for the current and previous five subframes | ||
75 | float fixed_gain[2]; ///< quantified fixed gains for the current and previous subframes | ||
76 | |||
77 | float tilt_coef; ///< {beta_1} related to the voicing of the previous subframe | ||
78 | |||
79 | float prev_sparse_fixed_gain; ///< previous fixed gain; used by anti-sparseness to determine "onset" | ||
80 | uint8_t prev_ir_filter_nr; ///< previous impulse response filter "impNr": 0 - strong, 1 - medium, 2 - none | ||
81 | float prev_tr_gain; ///< previous initial gain used by noise enhancer for threshold | ||
82 | |||
83 | float samples_az[LP_ORDER + AMRWB_SFR_SIZE]; ///< low-band samples and memory from synthesis at 12.8kHz | ||
84 | float samples_up[UPS_MEM_SIZE + AMRWB_SFR_SIZE]; ///< low-band samples and memory processed for upsampling | ||
85 | float samples_hb[LP_ORDER_16k + AMRWB_SFR_SIZE_16k]; ///< high-band samples and memory from synthesis at 16kHz | ||
86 | |||
87 | float hpf_31_mem[2], hpf_400_mem[2]; ///< previous values in the high pass filters | ||
88 | float demph_mem[1]; ///< previous value in the de-emphasis filter | ||
89 | float bpf_6_7_mem[HB_FIR_SIZE]; ///< previous values in the high-band band pass filter | ||
90 | float lpf_7_mem[HB_FIR_SIZE]; ///< previous values in the high-band low pass filter | ||
91 | |||
92 | AVLFG prng; ///< random number generator for white noise excitation | ||
93 | uint8_t first_frame; ///< flag active during decoding of the first frame | ||
94 | ACELPFContext acelpf_ctx; ///< context for filters for ACELP-based codecs | ||
95 | ACELPVContext acelpv_ctx; ///< context for vector operations for ACELP-based codecs | ||
96 | CELPFContext celpf_ctx; ///< context for filters for CELP-based codecs | ||
97 | CELPMContext celpm_ctx; ///< context for fixed point math operations | ||
98 | |||
99 | } AMRWBContext; | ||
100 | |||
101 | typedef struct AMRWBChannelsContext { | ||
102 | AMRWBContext ch[2]; | ||
103 | } AMRWBChannelsContext; | ||
104 | |||
105 | 22 | static av_cold int amrwb_decode_init(AVCodecContext *avctx) | |
106 | { | ||
107 | 22 | AMRWBChannelsContext *s = avctx->priv_data; | |
108 | int i; | ||
109 | |||
110 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
|
22 | if (avctx->ch_layout.nb_channels > 2) { |
111 | ✗ | avpriv_report_missing_feature(avctx, ">2 channel AMR"); | |
112 | ✗ | return AVERROR_PATCHWELCOME; | |
113 | } | ||
114 | |||
115 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
|
22 | if (!avctx->ch_layout.nb_channels) { |
116 | ✗ | av_channel_layout_uninit(&avctx->ch_layout); | |
117 | ✗ | avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; | |
118 | } | ||
119 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
|
22 | if (!avctx->sample_rate) |
120 | ✗ | avctx->sample_rate = 16000; | |
121 | 22 | avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; | |
122 | |||
123 |
2/2✓ Branch 0 taken 22 times.
✓ Branch 1 taken 22 times.
|
44 | for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { |
124 | 22 | AMRWBContext *ctx = &s->ch[ch]; | |
125 | |||
126 | 22 | av_lfg_init(&ctx->prng, 1); | |
127 | |||
128 | 22 | ctx->excitation = &ctx->excitation_buf[AMRWB_P_DELAY_MAX + LP_ORDER + 1]; | |
129 | 22 | ctx->first_frame = 1; | |
130 | |||
131 |
2/2✓ Branch 0 taken 352 times.
✓ Branch 1 taken 22 times.
|
374 | for (i = 0; i < LP_ORDER; i++) |
132 | 352 | ctx->isf_past_final[i] = isf_init[i] * (1.0f / (1 << 15)); | |
133 | |||
134 |
2/2✓ Branch 0 taken 88 times.
✓ Branch 1 taken 22 times.
|
110 | for (i = 0; i < 4; i++) |
135 | 88 | ctx->prediction_error[i] = MIN_ENERGY; | |
136 | |||
137 | 22 | ff_acelp_filter_init(&ctx->acelpf_ctx); | |
138 | 22 | ff_acelp_vectors_init(&ctx->acelpv_ctx); | |
139 | 22 | ff_celp_filter_init(&ctx->celpf_ctx); | |
140 | 22 | ff_celp_math_init(&ctx->celpm_ctx); | |
141 | } | ||
142 | |||
143 | 22 | return 0; | |
144 | } | ||
145 | |||
146 | /** | ||
147 | * Decode the frame header in the "MIME/storage" format. This format | ||
148 | * is simpler and does not carry the auxiliary frame information. | ||
149 | * | ||
150 | * @param[in] ctx The Context | ||
151 | * @param[in] buf Pointer to the input buffer | ||
152 | * | ||
153 | * @return The decoded header length in bytes | ||
154 | */ | ||
155 | 6268 | static int decode_mime_header(AMRWBContext *ctx, const uint8_t *buf) | |
156 | { | ||
157 | /* Decode frame header (1st octet) */ | ||
158 | 6268 | ctx->fr_cur_mode = buf[0] >> 3 & 0x0F; | |
159 | 6268 | ctx->fr_quality = (buf[0] & 0x4) == 0x4; | |
160 | |||
161 | 6268 | return 1; | |
162 | } | ||
163 | |||
164 | /** | ||
165 | * Decode quantized ISF vectors using 36-bit indexes (6K60 mode only). | ||
166 | * | ||
167 | * @param[in] ind Array of 5 indexes | ||
168 | * @param[out] isf_q Buffer for isf_q[LP_ORDER] | ||
169 | */ | ||
170 | 513 | static void decode_isf_indices_36b(uint16_t *ind, float *isf_q) | |
171 | { | ||
172 | int i; | ||
173 | |||
174 |
2/2✓ Branch 0 taken 4617 times.
✓ Branch 1 taken 513 times.
|
5130 | for (i = 0; i < 9; i++) |
175 | 4617 | isf_q[i] = dico1_isf[ind[0]][i] * (1.0f / (1 << 15)); | |
176 | |||
177 |
2/2✓ Branch 0 taken 3591 times.
✓ Branch 1 taken 513 times.
|
4104 | for (i = 0; i < 7; i++) |
178 | 3591 | isf_q[i + 9] = dico2_isf[ind[1]][i] * (1.0f / (1 << 15)); | |
179 | |||
180 |
2/2✓ Branch 0 taken 2565 times.
✓ Branch 1 taken 513 times.
|
3078 | for (i = 0; i < 5; i++) |
181 | 2565 | isf_q[i] += dico21_isf_36b[ind[2]][i] * (1.0f / (1 << 15)); | |
182 | |||
183 |
2/2✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 513 times.
|
2565 | for (i = 0; i < 4; i++) |
184 | 2052 | isf_q[i + 5] += dico22_isf_36b[ind[3]][i] * (1.0f / (1 << 15)); | |
185 | |||
186 |
2/2✓ Branch 0 taken 3591 times.
✓ Branch 1 taken 513 times.
|
4104 | for (i = 0; i < 7; i++) |
187 | 3591 | isf_q[i + 9] += dico23_isf_36b[ind[4]][i] * (1.0f / (1 << 15)); | |
188 | 513 | } | |
189 | |||
190 | /** | ||
191 | * Decode quantized ISF vectors using 46-bit indexes (except 6K60 mode). | ||
192 | * | ||
193 | * @param[in] ind Array of 7 indexes | ||
194 | * @param[out] isf_q Buffer for isf_q[LP_ORDER] | ||
195 | */ | ||
196 | 5755 | static void decode_isf_indices_46b(uint16_t *ind, float *isf_q) | |
197 | { | ||
198 | int i; | ||
199 | |||
200 |
2/2✓ Branch 0 taken 51795 times.
✓ Branch 1 taken 5755 times.
|
57550 | for (i = 0; i < 9; i++) |
201 | 51795 | isf_q[i] = dico1_isf[ind[0]][i] * (1.0f / (1 << 15)); | |
202 | |||
203 |
2/2✓ Branch 0 taken 40285 times.
✓ Branch 1 taken 5755 times.
|
46040 | for (i = 0; i < 7; i++) |
204 | 40285 | isf_q[i + 9] = dico2_isf[ind[1]][i] * (1.0f / (1 << 15)); | |
205 | |||
206 |
2/2✓ Branch 0 taken 17265 times.
✓ Branch 1 taken 5755 times.
|
23020 | for (i = 0; i < 3; i++) |
207 | 17265 | isf_q[i] += dico21_isf[ind[2]][i] * (1.0f / (1 << 15)); | |
208 | |||
209 |
2/2✓ Branch 0 taken 17265 times.
✓ Branch 1 taken 5755 times.
|
23020 | for (i = 0; i < 3; i++) |
210 | 17265 | isf_q[i + 3] += dico22_isf[ind[3]][i] * (1.0f / (1 << 15)); | |
211 | |||
212 |
2/2✓ Branch 0 taken 17265 times.
✓ Branch 1 taken 5755 times.
|
23020 | for (i = 0; i < 3; i++) |
213 | 17265 | isf_q[i + 6] += dico23_isf[ind[4]][i] * (1.0f / (1 << 15)); | |
214 | |||
215 |
2/2✓ Branch 0 taken 17265 times.
✓ Branch 1 taken 5755 times.
|
23020 | for (i = 0; i < 3; i++) |
216 | 17265 | isf_q[i + 9] += dico24_isf[ind[5]][i] * (1.0f / (1 << 15)); | |
217 | |||
218 |
2/2✓ Branch 0 taken 23020 times.
✓ Branch 1 taken 5755 times.
|
28775 | for (i = 0; i < 4; i++) |
219 | 23020 | isf_q[i + 12] += dico25_isf[ind[6]][i] * (1.0f / (1 << 15)); | |
220 | 5755 | } | |
221 | |||
222 | /** | ||
223 | * Apply mean and past ISF values using the prediction factor. | ||
224 | * Updates past ISF vector. | ||
225 | * | ||
226 | * @param[in,out] isf_q Current quantized ISF | ||
227 | * @param[in,out] isf_past Past quantized ISF | ||
228 | */ | ||
229 | 6268 | static void isf_add_mean_and_past(float *isf_q, float *isf_past) | |
230 | { | ||
231 | int i; | ||
232 | float tmp; | ||
233 | |||
234 |
2/2✓ Branch 0 taken 100288 times.
✓ Branch 1 taken 6268 times.
|
106556 | for (i = 0; i < LP_ORDER; i++) { |
235 | 100288 | tmp = isf_q[i]; | |
236 | 100288 | isf_q[i] += isf_mean[i] * (1.0f / (1 << 15)); | |
237 | 100288 | isf_q[i] += PRED_FACTOR * isf_past[i]; | |
238 | 100288 | isf_past[i] = tmp; | |
239 | } | ||
240 | 6268 | } | |
241 | |||
242 | /** | ||
243 | * Interpolate the fourth ISP vector from current and past frames | ||
244 | * to obtain an ISP vector for each subframe. | ||
245 | * | ||
246 | * @param[in,out] isp_q ISPs for each subframe | ||
247 | * @param[in] isp4_past Past ISP for subframe 4 | ||
248 | */ | ||
249 | 6268 | static void interpolate_isp(double isp_q[4][LP_ORDER], const double *isp4_past) | |
250 | { | ||
251 | int i, k; | ||
252 | |||
253 |
2/2✓ Branch 0 taken 18804 times.
✓ Branch 1 taken 6268 times.
|
25072 | for (k = 0; k < 3; k++) { |
254 | 18804 | float c = isfp_inter[k]; | |
255 |
2/2✓ Branch 0 taken 300864 times.
✓ Branch 1 taken 18804 times.
|
319668 | for (i = 0; i < LP_ORDER; i++) |
256 | 300864 | isp_q[k][i] = (1.0 - c) * isp4_past[i] + c * isp_q[3][i]; | |
257 | } | ||
258 | 6268 | } | |
259 | |||
260 | /** | ||
261 | * Decode an adaptive codebook index into pitch lag (except 6k60, 8k85 modes). | ||
262 | * Calculate integer lag and fractional lag always using 1/4 resolution. | ||
263 | * In 1st and 3rd subframes the index is relative to last subframe integer lag. | ||
264 | * | ||
265 | * @param[out] lag_int Decoded integer pitch lag | ||
266 | * @param[out] lag_frac Decoded fractional pitch lag | ||
267 | * @param[in] pitch_index Adaptive codebook pitch index | ||
268 | * @param[in,out] base_lag_int Base integer lag used in relative subframes | ||
269 | * @param[in] subframe Current subframe index (0 to 3) | ||
270 | */ | ||
271 | 20968 | static void decode_pitch_lag_high(int *lag_int, int *lag_frac, int pitch_index, | |
272 | uint8_t *base_lag_int, int subframe) | ||
273 | { | ||
274 |
4/4✓ Branch 0 taken 15726 times.
✓ Branch 1 taken 5242 times.
✓ Branch 2 taken 5242 times.
✓ Branch 3 taken 10484 times.
|
20968 | if (subframe == 0 || subframe == 2) { |
275 |
2/2✓ Branch 0 taken 7630 times.
✓ Branch 1 taken 2854 times.
|
10484 | if (pitch_index < 376) { |
276 | 7630 | *lag_int = (pitch_index + 137) >> 2; | |
277 | 7630 | *lag_frac = pitch_index - (*lag_int << 2) + 136; | |
278 |
2/2✓ Branch 0 taken 1248 times.
✓ Branch 1 taken 1606 times.
|
2854 | } else if (pitch_index < 440) { |
279 | 1248 | *lag_int = (pitch_index + 257 - 376) >> 1; | |
280 | 1248 | *lag_frac = (pitch_index - (*lag_int << 1) + 256 - 376) * 2; | |
281 | /* the actual resolution is 1/2 but expressed as 1/4 */ | ||
282 | } else { | ||
283 | 1606 | *lag_int = pitch_index - 280; | |
284 | 1606 | *lag_frac = 0; | |
285 | } | ||
286 | /* minimum lag for next subframe */ | ||
287 | 10484 | *base_lag_int = av_clip(*lag_int - 8 - (*lag_frac < 0), | |
288 | AMRWB_P_DELAY_MIN, AMRWB_P_DELAY_MAX - 15); | ||
289 | // XXX: the spec states clearly that *base_lag_int should be | ||
290 | // the nearest integer to *lag_int (minus 8), but the ref code | ||
291 | // actually always uses its floor, I'm following the latter | ||
292 | } else { | ||
293 | 10484 | *lag_int = (pitch_index + 1) >> 2; | |
294 | 10484 | *lag_frac = pitch_index - (*lag_int << 2); | |
295 | 10484 | *lag_int += *base_lag_int; | |
296 | } | ||
297 | 20968 | } | |
298 | |||
299 | /** | ||
300 | * Decode an adaptive codebook index into pitch lag for 8k85 and 6k60 modes. | ||
301 | * The description is analogous to decode_pitch_lag_high, but in 6k60 the | ||
302 | * relative index is used for all subframes except the first. | ||
303 | */ | ||
304 | 4104 | static void decode_pitch_lag_low(int *lag_int, int *lag_frac, int pitch_index, | |
305 | uint8_t *base_lag_int, int subframe, enum Mode mode) | ||
306 | { | ||
307 |
6/6✓ Branch 0 taken 3078 times.
✓ Branch 1 taken 1026 times.
✓ Branch 2 taken 1026 times.
✓ Branch 3 taken 2052 times.
✓ Branch 4 taken 513 times.
✓ Branch 5 taken 513 times.
|
4104 | if (subframe == 0 || (subframe == 2 && mode != MODE_6k60)) { |
308 |
2/2✓ Branch 0 taken 850 times.
✓ Branch 1 taken 689 times.
|
1539 | if (pitch_index < 116) { |
309 | 850 | *lag_int = (pitch_index + 69) >> 1; | |
310 | 850 | *lag_frac = (pitch_index - (*lag_int << 1) + 68) * 2; | |
311 | } else { | ||
312 | 689 | *lag_int = pitch_index - 24; | |
313 | 689 | *lag_frac = 0; | |
314 | } | ||
315 | // XXX: same problem as before | ||
316 | 1539 | *base_lag_int = av_clip(*lag_int - 8 - (*lag_frac < 0), | |
317 | AMRWB_P_DELAY_MIN, AMRWB_P_DELAY_MAX - 15); | ||
318 | } else { | ||
319 | 2565 | *lag_int = (pitch_index + 1) >> 1; | |
320 | 2565 | *lag_frac = (pitch_index - (*lag_int << 1)) * 2; | |
321 | 2565 | *lag_int += *base_lag_int; | |
322 | } | ||
323 | 4104 | } | |
324 | |||
325 | /** | ||
326 | * Find the pitch vector by interpolating the past excitation at the | ||
327 | * pitch delay, which is obtained in this function. | ||
328 | * | ||
329 | * @param[in,out] ctx The context | ||
330 | * @param[in] amr_subframe Current subframe data | ||
331 | * @param[in] subframe Current subframe index (0 to 3) | ||
332 | */ | ||
333 | 25072 | static void decode_pitch_vector(AMRWBContext *ctx, | |
334 | const AMRWBSubFrame *amr_subframe, | ||
335 | const int subframe) | ||
336 | { | ||
337 | int pitch_lag_int, pitch_lag_frac; | ||
338 | int i; | ||
339 | 25072 | float *exc = ctx->excitation; | |
340 | 25072 | enum Mode mode = ctx->fr_cur_mode; | |
341 | |||
342 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 20968 times.
|
25072 | if (mode <= MODE_8k85) { |
343 | 4104 | decode_pitch_lag_low(&pitch_lag_int, &pitch_lag_frac, amr_subframe->adap, | |
344 | &ctx->base_pitch_lag, subframe, mode); | ||
345 | } else | ||
346 | 20968 | decode_pitch_lag_high(&pitch_lag_int, &pitch_lag_frac, amr_subframe->adap, | |
347 | &ctx->base_pitch_lag, subframe); | ||
348 | |||
349 | 25072 | ctx->pitch_lag_int = pitch_lag_int; | |
350 | 25072 | pitch_lag_int += pitch_lag_frac > 0; | |
351 | |||
352 | /* Calculate the pitch vector by interpolating the past excitation at the | ||
353 | pitch lag using a hamming windowed sinc function */ | ||
354 | 50144 | ctx->acelpf_ctx.acelp_interpolatef(exc, | |
355 | 25072 | exc + 1 - pitch_lag_int, | |
356 | ac_inter, 4, | ||
357 |
2/2✓ Branch 0 taken 8454 times.
✓ Branch 1 taken 16618 times.
|
25072 | pitch_lag_frac + (pitch_lag_frac > 0 ? 0 : 4), |
358 | LP_ORDER, AMRWB_SFR_SIZE + 1); | ||
359 | |||
360 | /* Check which pitch signal path should be used | ||
361 | * 6k60 and 8k85 modes have the ltp flag set to 0 */ | ||
362 |
2/2✓ Branch 0 taken 7140 times.
✓ Branch 1 taken 17932 times.
|
25072 | if (amr_subframe->ltp) { |
363 | 7140 | memcpy(ctx->pitch_vector, exc, AMRWB_SFR_SIZE * sizeof(float)); | |
364 | } else { | ||
365 |
2/2✓ Branch 0 taken 1147648 times.
✓ Branch 1 taken 17932 times.
|
1165580 | for (i = 0; i < AMRWB_SFR_SIZE; i++) |
366 | 1147648 | ctx->pitch_vector[i] = 0.18 * exc[i - 1] + 0.64 * exc[i] + | |
367 | 1147648 | 0.18 * exc[i + 1]; | |
368 | 17932 | memcpy(exc, ctx->pitch_vector, AMRWB_SFR_SIZE * sizeof(float)); | |
369 | } | ||
370 | 25072 | } | |
371 | |||
372 | /** Get x bits in the index interval [lsb,lsb+len-1] inclusive */ | ||
373 | #define BIT_STR(x,lsb,len) av_zero_extend((x) >> (lsb), (len)) | ||
374 | |||
375 | /** Get the bit at specified position */ | ||
376 | #define BIT_POS(x, p) (((x) >> (p)) & 1) | ||
377 | |||
378 | /** | ||
379 | * The next six functions decode_[i]p_track decode exactly i pulses | ||
380 | * positions and amplitudes (-1 or 1) in a subframe track using | ||
381 | * an encoded pulse indexing (TS 26.190 section 5.8.2). | ||
382 | * | ||
383 | * The results are given in out[], in which a negative number means | ||
384 | * amplitude -1 and vice versa (i.e., ampl(x) = x / abs(x) ). | ||
385 | * | ||
386 | * @param[out] out Output buffer (writes i elements) | ||
387 | * @param[in] code Pulse index (no. of bits varies, see below) | ||
388 | * @param[in] m (log2) Number of potential positions | ||
389 | * @param[in] off Offset for decoded positions | ||
390 | */ | ||
391 | 106180 | static inline void decode_1p_track(int *out, int code, int m, int off) | |
392 | { | ||
393 | 106180 | int pos = BIT_STR(code, 0, m) + off; ///code: m+1 bits | |
394 | |||
395 |
2/2✓ Branch 0 taken 53239 times.
✓ Branch 1 taken 52941 times.
|
106180 | out[0] = BIT_POS(code, m) ? -pos : pos; |
396 | 106180 | } | |
397 | |||
398 | 147226 | static inline void decode_2p_track(int *out, int code, int m, int off) ///code: 2m+1 bits | |
399 | { | ||
400 | 147226 | int pos0 = BIT_STR(code, m, m) + off; | |
401 | 147226 | int pos1 = BIT_STR(code, 0, m) + off; | |
402 | |||
403 |
2/2✓ Branch 0 taken 74035 times.
✓ Branch 1 taken 73191 times.
|
147226 | out[0] = BIT_POS(code, 2*m) ? -pos0 : pos0; |
404 |
2/2✓ Branch 0 taken 74035 times.
✓ Branch 1 taken 73191 times.
|
147226 | out[1] = BIT_POS(code, 2*m) ? -pos1 : pos1; |
405 |
2/2✓ Branch 0 taken 66336 times.
✓ Branch 1 taken 80890 times.
|
147226 | out[1] = pos0 > pos1 ? -out[1] : out[1]; |
406 | 147226 | } | |
407 | |||
408 | 68748 | static void decode_3p_track(int *out, int code, int m, int off) ///code: 3m+1 bits | |
409 | { | ||
410 | 68748 | int half_2p = BIT_POS(code, 2*m - 1) << (m - 1); | |
411 | |||
412 | 68748 | decode_2p_track(out, BIT_STR(code, 0, 2*m - 1), | |
413 | m - 1, off + half_2p); | ||
414 | 68748 | decode_1p_track(out + 2, BIT_STR(code, 2*m, m + 1), m, off); | |
415 | 68748 | } | |
416 | |||
417 | 32563 | static void decode_4p_track(int *out, int code, int m, int off) ///code: 4m bits | |
418 | { | ||
419 | int half_4p, subhalf_2p; | ||
420 | 32563 | int b_offset = 1 << (m - 1); | |
421 | |||
422 |
4/5✓ Branch 0 taken 3612 times.
✓ Branch 1 taken 7991 times.
✓ Branch 2 taken 12806 times.
✓ Branch 3 taken 8154 times.
✗ Branch 4 not taken.
|
32563 | switch (BIT_STR(code, 4*m - 2, 2)) { /* case ID (2 bits) */ |
423 | 3612 | case 0: /* 0 pulses in A, 4 pulses in B or vice versa */ | |
424 | 3612 | half_4p = BIT_POS(code, 4*m - 3) << (m - 1); // which has 4 pulses | |
425 | 3612 | subhalf_2p = BIT_POS(code, 2*m - 3) << (m - 2); | |
426 | |||
427 | 3612 | decode_2p_track(out, BIT_STR(code, 0, 2*m - 3), | |
428 | 3612 | m - 2, off + half_4p + subhalf_2p); | |
429 | 3612 | decode_2p_track(out + 2, BIT_STR(code, 2*m - 2, 2*m - 1), | |
430 | m - 1, off + half_4p); | ||
431 | 3612 | break; | |
432 | 7991 | case 1: /* 1 pulse in A, 3 pulses in B */ | |
433 | 7991 | decode_1p_track(out, BIT_STR(code, 3*m - 2, m), | |
434 | m - 1, off); | ||
435 | 7991 | decode_3p_track(out + 1, BIT_STR(code, 0, 3*m - 2), | |
436 | m - 1, off + b_offset); | ||
437 | 7991 | break; | |
438 | 12806 | case 2: /* 2 pulses in each half */ | |
439 | 12806 | decode_2p_track(out, BIT_STR(code, 2*m - 1, 2*m - 1), | |
440 | m - 1, off); | ||
441 | 12806 | decode_2p_track(out + 2, BIT_STR(code, 0, 2*m - 1), | |
442 | m - 1, off + b_offset); | ||
443 | 12806 | break; | |
444 | 8154 | case 3: /* 3 pulses in A, 1 pulse in B */ | |
445 | 8154 | decode_3p_track(out, BIT_STR(code, m, 3*m - 2), | |
446 | m - 1, off); | ||
447 | 8154 | decode_1p_track(out + 3, BIT_STR(code, 0, m), | |
448 | m - 1, off + b_offset); | ||
449 | 8154 | break; | |
450 | } | ||
451 | 32563 | } | |
452 | |||
453 | 13079 | static void decode_5p_track(int *out, int code, int m, int off) ///code: 5m bits | |
454 | { | ||
455 | 13079 | int half_3p = BIT_POS(code, 5*m - 1) << (m - 1); | |
456 | |||
457 | 13079 | decode_3p_track(out, BIT_STR(code, 2*m + 1, 3*m - 2), | |
458 | m - 1, off + half_3p); | ||
459 | |||
460 | 13079 | decode_2p_track(out + 3, BIT_STR(code, 0, 2*m + 1), m, off); | |
461 | 13079 | } | |
462 | |||
463 | 42832 | static void decode_6p_track(int *out, int code, int m, int off) ///code: 6m-2 bits | |
464 | { | ||
465 | 42832 | int b_offset = 1 << (m - 1); | |
466 | /* which half has more pulses in cases 0 to 2 */ | ||
467 | 42832 | int half_more = BIT_POS(code, 6*m - 5) << (m - 1); | |
468 | 42832 | int half_other = b_offset - half_more; | |
469 | |||
470 |
4/5✓ Branch 0 taken 1297 times.
✓ Branch 1 taken 7678 times.
✓ Branch 2 taken 20251 times.
✓ Branch 3 taken 13606 times.
✗ Branch 4 not taken.
|
42832 | switch (BIT_STR(code, 6*m - 4, 2)) { /* case ID (2 bits) */ |
471 | 1297 | case 0: /* 0 pulses in A, 6 pulses in B or vice versa */ | |
472 | 1297 | decode_1p_track(out, BIT_STR(code, 0, m), | |
473 | m - 1, off + half_more); | ||
474 | 1297 | decode_5p_track(out + 1, BIT_STR(code, m, 5*m - 5), | |
475 | m - 1, off + half_more); | ||
476 | 1297 | break; | |
477 | 7678 | case 1: /* 1 pulse in A, 5 pulses in B or vice versa */ | |
478 | 7678 | decode_1p_track(out, BIT_STR(code, 0, m), | |
479 | m - 1, off + half_other); | ||
480 | 7678 | decode_5p_track(out + 1, BIT_STR(code, m, 5*m - 5), | |
481 | m - 1, off + half_more); | ||
482 | 7678 | break; | |
483 | 20251 | case 2: /* 2 pulses in A, 4 pulses in B or vice versa */ | |
484 | 20251 | decode_2p_track(out, BIT_STR(code, 0, 2*m - 1), | |
485 | m - 1, off + half_other); | ||
486 | 20251 | decode_4p_track(out + 2, BIT_STR(code, 2*m - 1, 4*m - 4), | |
487 | m - 1, off + half_more); | ||
488 | 20251 | break; | |
489 | 13606 | case 3: /* 3 pulses in A, 3 pulses in B */ | |
490 | 13606 | decode_3p_track(out, BIT_STR(code, 3*m - 2, 3*m - 2), | |
491 | m - 1, off); | ||
492 | 13606 | decode_3p_track(out + 3, BIT_STR(code, 0, 3*m - 2), | |
493 | m - 1, off + b_offset); | ||
494 | 13606 | break; | |
495 | } | ||
496 | 42832 | } | |
497 | |||
498 | /** | ||
499 | * Decode the algebraic codebook index to pulse positions and signs, | ||
500 | * then construct the algebraic codebook vector. | ||
501 | * | ||
502 | * @param[out] fixed_vector Buffer for the fixed codebook excitation | ||
503 | * @param[in] pulse_hi MSBs part of the pulse index array (higher modes only) | ||
504 | * @param[in] pulse_lo LSBs part of the pulse index array | ||
505 | * @param[in] mode Mode of the current frame | ||
506 | */ | ||
507 | 25072 | static void decode_fixed_vector(float *fixed_vector, const uint16_t *pulse_hi, | |
508 | const uint16_t *pulse_lo, const enum Mode mode) | ||
509 | { | ||
510 | /* sig_pos stores for each track the decoded pulse position indexes | ||
511 | * (1-based) multiplied by its corresponding amplitude (+1 or -1) */ | ||
512 | int sig_pos[4][6]; | ||
513 |
2/2✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 23020 times.
|
25072 | int spacing = (mode == MODE_6k60) ? 2 : 4; |
514 | int i, j; | ||
515 | |||
516 |
8/9✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 2052 times.
✓ Branch 2 taken 2052 times.
✓ Branch 3 taken 2052 times.
✓ Branch 4 taken 2052 times.
✓ Branch 5 taken 2052 times.
✓ Branch 6 taken 2052 times.
✓ Branch 7 taken 10708 times.
✗ Branch 8 not taken.
|
25072 | switch (mode) { |
517 | 2052 | case MODE_6k60: | |
518 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 2052 times.
|
6156 | for (i = 0; i < 2; i++) |
519 | 4104 | decode_1p_track(sig_pos[i], pulse_lo[i], 5, 1); | |
520 | 2052 | break; | |
521 | 2052 | case MODE_8k85: | |
522 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = 0; i < 4; i++) |
523 | 8208 | decode_1p_track(sig_pos[i], pulse_lo[i], 4, 1); | |
524 | 2052 | break; | |
525 | 2052 | case MODE_12k65: | |
526 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = 0; i < 4; i++) |
527 | 8208 | decode_2p_track(sig_pos[i], pulse_lo[i], 4, 1); | |
528 | 2052 | break; | |
529 | 2052 | case MODE_14k25: | |
530 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 2052 times.
|
6156 | for (i = 0; i < 2; i++) |
531 | 4104 | decode_3p_track(sig_pos[i], pulse_lo[i], 4, 1); | |
532 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 2052 times.
|
6156 | for (i = 2; i < 4; i++) |
533 | 4104 | decode_2p_track(sig_pos[i], pulse_lo[i], 4, 1); | |
534 | 2052 | break; | |
535 | 2052 | case MODE_15k85: | |
536 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = 0; i < 4; i++) |
537 | 8208 | decode_3p_track(sig_pos[i], pulse_lo[i], 4, 1); | |
538 | 2052 | break; | |
539 | 2052 | case MODE_18k25: | |
540 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = 0; i < 4; i++) |
541 | 8208 | decode_4p_track(sig_pos[i], (int) pulse_lo[i] + | |
542 | 8208 | ((int) pulse_hi[i] << 14), 4, 1); | |
543 | 2052 | break; | |
544 | 2052 | case MODE_19k85: | |
545 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 2052 times.
|
6156 | for (i = 0; i < 2; i++) |
546 | 4104 | decode_5p_track(sig_pos[i], (int) pulse_lo[i] + | |
547 | 4104 | ((int) pulse_hi[i] << 10), 4, 1); | |
548 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 2052 times.
|
6156 | for (i = 2; i < 4; i++) |
549 | 4104 | decode_4p_track(sig_pos[i], (int) pulse_lo[i] + | |
550 | 4104 | ((int) pulse_hi[i] << 14), 4, 1); | |
551 | 2052 | break; | |
552 | 10708 | case MODE_23k05: | |
553 | case MODE_23k85: | ||
554 |
2/2✓ Branch 0 taken 42832 times.
✓ Branch 1 taken 10708 times.
|
53540 | for (i = 0; i < 4; i++) |
555 | 42832 | decode_6p_track(sig_pos[i], (int) pulse_lo[i] + | |
556 | 42832 | ((int) pulse_hi[i] << 11), 4, 1); | |
557 | 10708 | break; | |
558 | 25072 | default: | |
559 | av_assert2(0); | ||
560 | } | ||
561 | |||
562 | 25072 | memset(fixed_vector, 0, sizeof(float) * AMRWB_SFR_SIZE); | |
563 | |||
564 |
2/2✓ Branch 0 taken 100288 times.
✓ Branch 1 taken 25072 times.
|
125360 | for (i = 0; i < 4; i++) |
565 |
2/2✓ Branch 0 taken 400632 times.
✓ Branch 1 taken 100288 times.
|
500920 | for (j = 0; j < pulses_nb_per_mode_tr[mode][i]; j++) { |
566 | 400632 | int pos = (FFABS(sig_pos[i][j]) - 1) * spacing + i; | |
567 | |||
568 |
2/2✓ Branch 0 taken 201133 times.
✓ Branch 1 taken 199499 times.
|
400632 | fixed_vector[pos] += sig_pos[i][j] < 0 ? -1.0 : 1.0; |
569 | } | ||
570 | 25072 | } | |
571 | |||
572 | /** | ||
573 | * Decode pitch gain and fixed gain correction factor. | ||
574 | * | ||
575 | * @param[in] vq_gain Vector-quantized index for gains | ||
576 | * @param[in] mode Mode of the current frame | ||
577 | * @param[out] fixed_gain_factor Decoded fixed gain correction factor | ||
578 | * @param[out] pitch_gain Decoded pitch gain | ||
579 | */ | ||
580 | 25072 | static void decode_gains(const uint8_t vq_gain, const enum Mode mode, | |
581 | float *fixed_gain_factor, float *pitch_gain) | ||
582 | { | ||
583 |
2/2✓ Branch 0 taken 4104 times.
✓ Branch 1 taken 20968 times.
|
25072 | const int16_t *gains = (mode <= MODE_8k85 ? qua_gain_6b[vq_gain] : |
584 | 20968 | qua_gain_7b[vq_gain]); | |
585 | |||
586 | 25072 | *pitch_gain = gains[0] * (1.0f / (1 << 14)); | |
587 | 25072 | *fixed_gain_factor = gains[1] * (1.0f / (1 << 11)); | |
588 | 25072 | } | |
589 | |||
590 | /** | ||
591 | * Apply pitch sharpening filters to the fixed codebook vector. | ||
592 | * | ||
593 | * @param[in] ctx The context | ||
594 | * @param[in,out] fixed_vector Fixed codebook excitation | ||
595 | */ | ||
596 | // XXX: Spec states this procedure should be applied when the pitch | ||
597 | // lag is less than 64, but this checking seems absent in reference and AMR-NB | ||
598 | 25072 | static void pitch_sharpening(AMRWBContext *ctx, float *fixed_vector) | |
599 | { | ||
600 | int i; | ||
601 | |||
602 | /* Tilt part */ | ||
603 |
2/2✓ Branch 0 taken 1579536 times.
✓ Branch 1 taken 25072 times.
|
1604608 | for (i = AMRWB_SFR_SIZE - 1; i != 0; i--) |
604 | 1579536 | fixed_vector[i] -= fixed_vector[i - 1] * ctx->tilt_coef; | |
605 | |||
606 | /* Periodicity enhancement part */ | ||
607 |
2/2✓ Branch 0 taken 161953 times.
✓ Branch 1 taken 25072 times.
|
187025 | for (i = ctx->pitch_lag_int; i < AMRWB_SFR_SIZE; i++) |
608 | 161953 | fixed_vector[i] += fixed_vector[i - ctx->pitch_lag_int] * 0.85; | |
609 | 25072 | } | |
610 | |||
611 | /** | ||
612 | * Calculate the voicing factor (-1.0 = unvoiced to 1.0 = voiced). | ||
613 | * | ||
614 | * @param[in] p_vector, f_vector Pitch and fixed excitation vectors | ||
615 | * @param[in] p_gain, f_gain Pitch and fixed gains | ||
616 | * @param[in] ctx The context | ||
617 | */ | ||
618 | // XXX: There is something wrong with the precision here! The magnitudes | ||
619 | // of the energies are not correct. Please check the reference code carefully | ||
620 | 25072 | static float voice_factor(float *p_vector, float p_gain, | |
621 | float *f_vector, float f_gain, | ||
622 | CELPMContext *ctx) | ||
623 | { | ||
624 | 25072 | double p_ener = (double) ctx->dot_productf(p_vector, p_vector, | |
625 | 25072 | AMRWB_SFR_SIZE) * | |
626 | 25072 | p_gain * p_gain; | |
627 | 25072 | double f_ener = (double) ctx->dot_productf(f_vector, f_vector, | |
628 | 25072 | AMRWB_SFR_SIZE) * | |
629 | 25072 | f_gain * f_gain; | |
630 | |||
631 | 25072 | return (p_ener - f_ener) / (p_ener + f_ener + 0.01); | |
632 | } | ||
633 | |||
634 | /** | ||
635 | * Reduce fixed vector sparseness by smoothing with one of three IR filters, | ||
636 | * also known as "adaptive phase dispersion". | ||
637 | * | ||
638 | * @param[in] ctx The context | ||
639 | * @param[in,out] fixed_vector Unfiltered fixed vector | ||
640 | * @param[out] buf Space for modified vector if necessary | ||
641 | * | ||
642 | * @return The potentially overwritten filtered fixed vector address | ||
643 | */ | ||
644 | 25072 | static float *anti_sparseness(AMRWBContext *ctx, | |
645 | float *fixed_vector, float *buf) | ||
646 | { | ||
647 | int ir_filter_nr; | ||
648 | |||
649 |
2/2✓ Branch 0 taken 20968 times.
✓ Branch 1 taken 4104 times.
|
25072 | if (ctx->fr_cur_mode > MODE_8k85) // no filtering in higher modes |
650 | 20968 | return fixed_vector; | |
651 | |||
652 |
2/2✓ Branch 0 taken 2261 times.
✓ Branch 1 taken 1843 times.
|
4104 | if (ctx->pitch_gain[0] < 0.6) { |
653 | 2261 | ir_filter_nr = 0; // strong filtering | |
654 |
2/2✓ Branch 0 taken 712 times.
✓ Branch 1 taken 1131 times.
|
1843 | } else if (ctx->pitch_gain[0] < 0.9) { |
655 | 712 | ir_filter_nr = 1; // medium filtering | |
656 | } else | ||
657 | 1131 | ir_filter_nr = 2; // no filtering | |
658 | |||
659 | /* detect 'onset' */ | ||
660 |
2/2✓ Branch 0 taken 61 times.
✓ Branch 1 taken 4043 times.
|
4104 | if (ctx->fixed_gain[0] > 3.0 * ctx->fixed_gain[1]) { |
661 |
2/2✓ Branch 0 taken 39 times.
✓ Branch 1 taken 22 times.
|
61 | if (ir_filter_nr < 2) |
662 | 39 | ir_filter_nr++; | |
663 | } else { | ||
664 | 4043 | int i, count = 0; | |
665 | |||
666 |
2/2✓ Branch 0 taken 24258 times.
✓ Branch 1 taken 4043 times.
|
28301 | for (i = 0; i < 6; i++) |
667 |
2/2✓ Branch 0 taken 13373 times.
✓ Branch 1 taken 10885 times.
|
24258 | if (ctx->pitch_gain[i] < 0.6) |
668 | 13373 | count++; | |
669 | |||
670 |
2/2✓ Branch 0 taken 2724 times.
✓ Branch 1 taken 1319 times.
|
4043 | if (count > 2) |
671 | 2724 | ir_filter_nr = 0; | |
672 | |||
673 |
2/2✓ Branch 0 taken 83 times.
✓ Branch 1 taken 3960 times.
|
4043 | if (ir_filter_nr > ctx->prev_ir_filter_nr + 1) |
674 | 83 | ir_filter_nr--; | |
675 | } | ||
676 | |||
677 | /* update ir filter strength history */ | ||
678 | 4104 | ctx->prev_ir_filter_nr = ir_filter_nr; | |
679 | |||
680 | 4104 | ir_filter_nr += (ctx->fr_cur_mode == MODE_8k85); | |
681 | |||
682 |
2/2✓ Branch 0 taken 3197 times.
✓ Branch 1 taken 907 times.
|
4104 | if (ir_filter_nr < 2) { |
683 | int i; | ||
684 | 3197 | const float *coef = ir_filters_lookup[ir_filter_nr]; | |
685 | |||
686 | /* Circular convolution code in the reference | ||
687 | * decoder was modified to avoid using one | ||
688 | * extra array. The filtered vector is given by: | ||
689 | * | ||
690 | * c2(n) = sum(i,0,len-1){ c(i) * coef( (n - i + len) % len ) } | ||
691 | */ | ||
692 | |||
693 | 3197 | memset(buf, 0, sizeof(float) * AMRWB_SFR_SIZE); | |
694 |
2/2✓ Branch 0 taken 204608 times.
✓ Branch 1 taken 3197 times.
|
207805 | for (i = 0; i < AMRWB_SFR_SIZE; i++) |
695 |
2/2✓ Branch 0 taken 21471 times.
✓ Branch 1 taken 183137 times.
|
204608 | if (fixed_vector[i]) |
696 | 21471 | ff_celp_circ_addf(buf, buf, coef, i, fixed_vector[i], | |
697 | AMRWB_SFR_SIZE); | ||
698 | 3197 | fixed_vector = buf; | |
699 | } | ||
700 | |||
701 | 4104 | return fixed_vector; | |
702 | } | ||
703 | |||
704 | /** | ||
705 | * Calculate a stability factor {teta} based on distance between | ||
706 | * current and past isf. A value of 1 shows maximum signal stability. | ||
707 | */ | ||
708 | 6268 | static float stability_factor(const float *isf, const float *isf_past) | |
709 | { | ||
710 | int i; | ||
711 | 6268 | float acc = 0.0; | |
712 | |||
713 |
2/2✓ Branch 0 taken 94020 times.
✓ Branch 1 taken 6268 times.
|
100288 | for (i = 0; i < LP_ORDER - 1; i++) |
714 | 94020 | acc += (isf[i] - isf_past[i]) * (isf[i] - isf_past[i]); | |
715 | |||
716 | // XXX: This part is not so clear from the reference code | ||
717 | // the result is more accurate changing the "/ 256" to "* 512" | ||
718 |
2/2✓ Branch 0 taken 511 times.
✓ Branch 1 taken 5757 times.
|
6268 | return FFMAX(0.0, 1.25 - acc * 0.8 * 512); |
719 | } | ||
720 | |||
721 | /** | ||
722 | * Apply a non-linear fixed gain smoothing in order to reduce | ||
723 | * fluctuation in the energy of excitation. | ||
724 | * | ||
725 | * @param[in] fixed_gain Unsmoothed fixed gain | ||
726 | * @param[in,out] prev_tr_gain Previous threshold gain (updated) | ||
727 | * @param[in] voice_fac Frame voicing factor | ||
728 | * @param[in] stab_fac Frame stability factor | ||
729 | * | ||
730 | * @return The smoothed gain | ||
731 | */ | ||
732 | 25072 | static float noise_enhancer(float fixed_gain, float *prev_tr_gain, | |
733 | float voice_fac, float stab_fac) | ||
734 | { | ||
735 | 25072 | float sm_fac = 0.5 * (1 - voice_fac) * stab_fac; | |
736 | float g0; | ||
737 | |||
738 | // XXX: the following fixed-point constants used to in(de)crement | ||
739 | // gain by 1.5dB were taken from the reference code, maybe it could | ||
740 | // be simpler | ||
741 |
2/2✓ Branch 0 taken 13115 times.
✓ Branch 1 taken 11957 times.
|
25072 | if (fixed_gain < *prev_tr_gain) { |
742 |
2/2✓ Branch 0 taken 7438 times.
✓ Branch 1 taken 5677 times.
|
13115 | g0 = FFMIN(*prev_tr_gain, fixed_gain + fixed_gain * |
743 | (6226 * (1.0f / (1 << 15)))); // +1.5 dB | ||
744 | } else | ||
745 |
2/2✓ Branch 0 taken 5835 times.
✓ Branch 1 taken 6122 times.
|
11957 | g0 = FFMAX(*prev_tr_gain, fixed_gain * |
746 | (27536 * (1.0f / (1 << 15)))); // -1.5 dB | ||
747 | |||
748 | 25072 | *prev_tr_gain = g0; // update next frame threshold | |
749 | |||
750 | 25072 | return sm_fac * g0 + (1 - sm_fac) * fixed_gain; | |
751 | } | ||
752 | |||
753 | /** | ||
754 | * Filter the fixed_vector to emphasize the higher frequencies. | ||
755 | * | ||
756 | * @param[in,out] fixed_vector Fixed codebook vector | ||
757 | * @param[in] voice_fac Frame voicing factor | ||
758 | */ | ||
759 | 25072 | static void pitch_enhancer(float *fixed_vector, float voice_fac) | |
760 | { | ||
761 | int i; | ||
762 | 25072 | float cpe = 0.125 * (1 + voice_fac); | |
763 | 25072 | float last = fixed_vector[0]; // holds c(i - 1) | |
764 | |||
765 | 25072 | fixed_vector[0] -= cpe * fixed_vector[1]; | |
766 | |||
767 |
2/2✓ Branch 0 taken 1554464 times.
✓ Branch 1 taken 25072 times.
|
1579536 | for (i = 1; i < AMRWB_SFR_SIZE - 1; i++) { |
768 | 1554464 | float cur = fixed_vector[i]; | |
769 | |||
770 | 1554464 | fixed_vector[i] -= cpe * (last + fixed_vector[i + 1]); | |
771 | 1554464 | last = cur; | |
772 | } | ||
773 | |||
774 | 25072 | fixed_vector[AMRWB_SFR_SIZE - 1] -= cpe * last; | |
775 | 25072 | } | |
776 | |||
777 | /** | ||
778 | * Conduct 16th order linear predictive coding synthesis from excitation. | ||
779 | * | ||
780 | * @param[in] ctx Pointer to the AMRWBContext | ||
781 | * @param[in] lpc Pointer to the LPC coefficients | ||
782 | * @param[out] excitation Buffer for synthesis final excitation | ||
783 | * @param[in] fixed_gain Fixed codebook gain for synthesis | ||
784 | * @param[in] fixed_vector Algebraic codebook vector | ||
785 | * @param[in,out] samples Pointer to the output samples and memory | ||
786 | */ | ||
787 | 25072 | static void synthesis(AMRWBContext *ctx, float *lpc, float *excitation, | |
788 | float fixed_gain, const float *fixed_vector, | ||
789 | float *samples) | ||
790 | { | ||
791 | 25072 | ctx->acelpv_ctx.weighted_vector_sumf(excitation, ctx->pitch_vector, fixed_vector, | |
792 | ctx->pitch_gain[0], fixed_gain, AMRWB_SFR_SIZE); | ||
793 | |||
794 | /* emphasize pitch vector contribution in low bitrate modes */ | ||
795 |
4/4✓ Branch 0 taken 14894 times.
✓ Branch 1 taken 10178 times.
✓ Branch 2 taken 1897 times.
✓ Branch 3 taken 12997 times.
|
25072 | if (ctx->pitch_gain[0] > 0.5 && ctx->fr_cur_mode <= MODE_8k85) { |
796 | int i; | ||
797 | 1897 | float energy = ctx->celpm_ctx.dot_productf(excitation, excitation, | |
798 | AMRWB_SFR_SIZE); | ||
799 | |||
800 | // XXX: Weird part in both ref code and spec. A unknown parameter | ||
801 | // {beta} seems to be identical to the current pitch gain | ||
802 | 1897 | float pitch_factor = 0.25 * ctx->pitch_gain[0] * ctx->pitch_gain[0]; | |
803 | |||
804 |
2/2✓ Branch 0 taken 121408 times.
✓ Branch 1 taken 1897 times.
|
123305 | for (i = 0; i < AMRWB_SFR_SIZE; i++) |
805 | 121408 | excitation[i] += pitch_factor * ctx->pitch_vector[i]; | |
806 | |||
807 | 1897 | ff_scale_vector_to_given_sum_of_squares(excitation, excitation, | |
808 | energy, AMRWB_SFR_SIZE); | ||
809 | } | ||
810 | |||
811 | 25072 | ctx->celpf_ctx.celp_lp_synthesis_filterf(samples, lpc, excitation, | |
812 | AMRWB_SFR_SIZE, LP_ORDER); | ||
813 | 25072 | } | |
814 | |||
815 | /** | ||
816 | * Apply to synthesis a de-emphasis filter of the form: | ||
817 | * H(z) = 1 / (1 - m * z^-1) | ||
818 | * | ||
819 | * @param[out] out Output buffer | ||
820 | * @param[in] in Input samples array with in[-1] | ||
821 | * @param[in] m Filter coefficient | ||
822 | * @param[in,out] mem State from last filtering | ||
823 | */ | ||
824 | 25072 | static void de_emphasis(float *out, float *in, float m, float mem[1]) | |
825 | { | ||
826 | int i; | ||
827 | |||
828 | 25072 | out[0] = in[0] + m * mem[0]; | |
829 | |||
830 |
2/2✓ Branch 0 taken 1579536 times.
✓ Branch 1 taken 25072 times.
|
1604608 | for (i = 1; i < AMRWB_SFR_SIZE; i++) |
831 | 1579536 | out[i] = in[i] + out[i - 1] * m; | |
832 | |||
833 | 25072 | mem[0] = out[AMRWB_SFR_SIZE - 1]; | |
834 | 25072 | } | |
835 | |||
836 | /** | ||
837 | * Upsample a signal by 5/4 ratio (from 12.8kHz to 16kHz) using | ||
838 | * a FIR interpolation filter. Uses past data from before *in address. | ||
839 | * | ||
840 | * @param[out] out Buffer for interpolated signal | ||
841 | * @param[in] in Current signal data (length 0.8*o_size) | ||
842 | * @param[in] o_size Output signal length | ||
843 | * @param[in] ctx The context | ||
844 | */ | ||
845 | 25072 | static void upsample_5_4(float *out, const float *in, int o_size, CELPMContext *ctx) | |
846 | { | ||
847 | 25072 | const float *in0 = in - UPS_FIR_SIZE + 1; | |
848 | int i, j, k; | ||
849 | 25072 | int int_part = 0, frac_part; | |
850 | |||
851 | 25072 | i = 0; | |
852 |
2/2✓ Branch 0 taken 401152 times.
✓ Branch 1 taken 25072 times.
|
426224 | for (j = 0; j < o_size / 5; j++) { |
853 | 401152 | out[i] = in[int_part]; | |
854 | 401152 | frac_part = 4; | |
855 | 401152 | i++; | |
856 | |||
857 |
2/2✓ Branch 0 taken 1604608 times.
✓ Branch 1 taken 401152 times.
|
2005760 | for (k = 1; k < 5; k++) { |
858 | 3209216 | out[i] = ctx->dot_productf(in0 + int_part, | |
859 | 1604608 | upsample_fir[4 - frac_part], | |
860 | UPS_MEM_SIZE); | ||
861 | 1604608 | int_part++; | |
862 | 1604608 | frac_part--; | |
863 | 1604608 | i++; | |
864 | } | ||
865 | } | ||
866 | 25072 | } | |
867 | |||
868 | /** | ||
869 | * Calculate the high-band gain based on encoded index (23k85 mode) or | ||
870 | * on the low-band speech signal and the Voice Activity Detection flag. | ||
871 | * | ||
872 | * @param[in] ctx The context | ||
873 | * @param[in] synth LB speech synthesis at 12.8k | ||
874 | * @param[in] hb_idx Gain index for mode 23k85 only | ||
875 | * @param[in] vad VAD flag for the frame | ||
876 | */ | ||
877 | 25072 | static float find_hb_gain(AMRWBContext *ctx, const float *synth, | |
878 | uint16_t hb_idx, uint8_t vad) | ||
879 | { | ||
880 | 25072 | int wsp = (vad > 0); | |
881 | float tilt; | ||
882 | float tmp; | ||
883 | |||
884 |
2/2✓ Branch 0 taken 8656 times.
✓ Branch 1 taken 16416 times.
|
25072 | if (ctx->fr_cur_mode == MODE_23k85) |
885 | 8656 | return qua_hb_gain[hb_idx] * (1.0f / (1 << 14)); | |
886 | |||
887 | 16416 | tmp = ctx->celpm_ctx.dot_productf(synth, synth + 1, AMRWB_SFR_SIZE - 1); | |
888 | |||
889 |
2/2✓ Branch 0 taken 15653 times.
✓ Branch 1 taken 763 times.
|
16416 | if (tmp > 0) { |
890 | 15653 | tilt = tmp / ctx->celpm_ctx.dot_productf(synth, synth, AMRWB_SFR_SIZE); | |
891 | } else | ||
892 | 763 | tilt = 0; | |
893 | |||
894 | /* return gain bounded by [0.1, 1.0] */ | ||
895 | 16416 | return av_clipf((1.0 - tilt) * (1.25 - 0.25 * wsp), 0.1, 1.0); | |
896 | } | ||
897 | |||
898 | /** | ||
899 | * Generate the high-band excitation with the same energy from the lower | ||
900 | * one and scaled by the given gain. | ||
901 | * | ||
902 | * @param[in] ctx The context | ||
903 | * @param[out] hb_exc Buffer for the excitation | ||
904 | * @param[in] synth_exc Low-band excitation used for synthesis | ||
905 | * @param[in] hb_gain Wanted excitation gain | ||
906 | */ | ||
907 | 25072 | static void scaled_hb_excitation(AMRWBContext *ctx, float *hb_exc, | |
908 | const float *synth_exc, float hb_gain) | ||
909 | { | ||
910 | int i; | ||
911 | 25072 | float energy = ctx->celpm_ctx.dot_productf(synth_exc, synth_exc, | |
912 | AMRWB_SFR_SIZE); | ||
913 | |||
914 | /* Generate a white-noise excitation */ | ||
915 |
2/2✓ Branch 0 taken 2005760 times.
✓ Branch 1 taken 25072 times.
|
2030832 | for (i = 0; i < AMRWB_SFR_SIZE_16k; i++) |
916 | 2005760 | hb_exc[i] = 32768.0 - (uint16_t) av_lfg_get(&ctx->prng); | |
917 | |||
918 | 25072 | ff_scale_vector_to_given_sum_of_squares(hb_exc, hb_exc, | |
919 | 25072 | energy * hb_gain * hb_gain, | |
920 | AMRWB_SFR_SIZE_16k); | ||
921 | 25072 | } | |
922 | |||
923 | /** | ||
924 | * Calculate the auto-correlation for the ISF difference vector. | ||
925 | */ | ||
926 | 6156 | static float auto_correlation(float *diff_isf, float mean, int lag) | |
927 | { | ||
928 | int i; | ||
929 | 6156 | float sum = 0.0; | |
930 | |||
931 |
2/2✓ Branch 0 taken 43092 times.
✓ Branch 1 taken 6156 times.
|
49248 | for (i = 7; i < LP_ORDER - 2; i++) { |
932 | 43092 | float prod = (diff_isf[i] - mean) * (diff_isf[i - lag] - mean); | |
933 | 43092 | sum += prod * prod; | |
934 | } | ||
935 | 6156 | return sum; | |
936 | } | ||
937 | |||
938 | /** | ||
939 | * Extrapolate a ISF vector to the 16kHz range (20th order LP) | ||
940 | * used at mode 6k60 LP filter for the high frequency band. | ||
941 | * | ||
942 | * @param[out] isf Buffer for extrapolated isf; contains LP_ORDER | ||
943 | * values on input | ||
944 | */ | ||
945 | 2052 | static void extrapolate_isf(float isf[LP_ORDER_16k]) | |
946 | { | ||
947 | float diff_isf[LP_ORDER - 2], diff_mean; | ||
948 | float corr_lag[3]; | ||
949 | float est, scale; | ||
950 | int i, j, i_max_corr; | ||
951 | |||
952 | 2052 | isf[LP_ORDER_16k - 1] = isf[LP_ORDER - 1]; | |
953 | |||
954 | /* Calculate the difference vector */ | ||
955 |
2/2✓ Branch 0 taken 28728 times.
✓ Branch 1 taken 2052 times.
|
30780 | for (i = 0; i < LP_ORDER - 2; i++) |
956 | 28728 | diff_isf[i] = isf[i + 1] - isf[i]; | |
957 | |||
958 | 2052 | diff_mean = 0.0; | |
959 |
2/2✓ Branch 0 taken 24624 times.
✓ Branch 1 taken 2052 times.
|
26676 | for (i = 2; i < LP_ORDER - 2; i++) |
960 | 24624 | diff_mean += diff_isf[i] * (1.0f / (LP_ORDER - 4)); | |
961 | |||
962 | /* Find which is the maximum autocorrelation */ | ||
963 | 2052 | i_max_corr = 0; | |
964 |
2/2✓ Branch 0 taken 6156 times.
✓ Branch 1 taken 2052 times.
|
8208 | for (i = 0; i < 3; i++) { |
965 | 6156 | corr_lag[i] = auto_correlation(diff_isf, diff_mean, i + 2); | |
966 | |||
967 |
2/2✓ Branch 0 taken 2154 times.
✓ Branch 1 taken 4002 times.
|
6156 | if (corr_lag[i] > corr_lag[i_max_corr]) |
968 | 2154 | i_max_corr = i; | |
969 | } | ||
970 | 2052 | i_max_corr++; | |
971 | |||
972 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = LP_ORDER - 1; i < LP_ORDER_16k - 1; i++) |
973 | 8208 | isf[i] = isf[i - 1] + isf[i - 1 - i_max_corr] | |
974 | 8208 | - isf[i - 2 - i_max_corr]; | |
975 | |||
976 | /* Calculate an estimate for ISF(18) and scale ISF based on the error */ | ||
977 | 2052 | est = 7965 + (isf[2] - isf[3] - isf[4]) / 6.0; | |
978 |
1/2✓ Branch 0 taken 2052 times.
✗ Branch 1 not taken.
|
2052 | scale = 0.5 * (FFMIN(est, 7600) - isf[LP_ORDER - 2]) / |
979 | 2052 | (isf[LP_ORDER_16k - 2] - isf[LP_ORDER - 2]); | |
980 | |||
981 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = LP_ORDER - 1, j = 0; i < LP_ORDER_16k - 1; i++, j++) |
982 | 8208 | diff_isf[j] = scale * (isf[i] - isf[i - 1]); | |
983 | |||
984 | /* Stability insurance */ | ||
985 |
2/2✓ Branch 0 taken 6156 times.
✓ Branch 1 taken 2052 times.
|
8208 | for (i = 1; i < LP_ORDER_16k - LP_ORDER; i++) |
986 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6156 times.
|
6156 | if (diff_isf[i] + diff_isf[i - 1] < 5.0) { |
987 | ✗ | if (diff_isf[i] > diff_isf[i - 1]) { | |
988 | ✗ | diff_isf[i - 1] = 5.0 - diff_isf[i]; | |
989 | } else | ||
990 | ✗ | diff_isf[i] = 5.0 - diff_isf[i - 1]; | |
991 | } | ||
992 | |||
993 |
2/2✓ Branch 0 taken 8208 times.
✓ Branch 1 taken 2052 times.
|
10260 | for (i = LP_ORDER - 1, j = 0; i < LP_ORDER_16k - 1; i++, j++) |
994 | 8208 | isf[i] = isf[i - 1] + diff_isf[j] * (1.0f / (1 << 15)); | |
995 | |||
996 | /* Scale the ISF vector for 16000 Hz */ | ||
997 |
2/2✓ Branch 0 taken 38988 times.
✓ Branch 1 taken 2052 times.
|
41040 | for (i = 0; i < LP_ORDER_16k - 1; i++) |
998 | 38988 | isf[i] *= 0.8; | |
999 | 2052 | } | |
1000 | |||
1001 | /** | ||
1002 | * Spectral expand the LP coefficients using the equation: | ||
1003 | * y[i] = x[i] * (gamma ** i) | ||
1004 | * | ||
1005 | * @param[out] out Output buffer (may use input array) | ||
1006 | * @param[in] lpc LP coefficients array | ||
1007 | * @param[in] gamma Weighting factor | ||
1008 | * @param[in] size LP array size | ||
1009 | */ | ||
1010 | 25072 | static void lpc_weighting(float *out, const float *lpc, float gamma, int size) | |
1011 | { | ||
1012 | int i; | ||
1013 | 25072 | float fac = gamma; | |
1014 | |||
1015 |
2/2✓ Branch 0 taken 409360 times.
✓ Branch 1 taken 25072 times.
|
434432 | for (i = 0; i < size; i++) { |
1016 | 409360 | out[i] = lpc[i] * fac; | |
1017 | 409360 | fac *= gamma; | |
1018 | } | ||
1019 | 25072 | } | |
1020 | |||
1021 | /** | ||
1022 | * Conduct 20th order linear predictive coding synthesis for the high | ||
1023 | * frequency band excitation at 16kHz. | ||
1024 | * | ||
1025 | * @param[in] ctx The context | ||
1026 | * @param[in] subframe Current subframe index (0 to 3) | ||
1027 | * @param[in,out] samples Pointer to the output speech samples | ||
1028 | * @param[in] exc Generated white-noise scaled excitation | ||
1029 | * @param[in] isf Current frame isf vector | ||
1030 | * @param[in] isf_past Past frame final isf vector | ||
1031 | */ | ||
1032 | 25072 | static void hb_synthesis(AMRWBContext *ctx, int subframe, float *samples, | |
1033 | const float *exc, const float *isf, const float *isf_past) | ||
1034 | { | ||
1035 | float hb_lpc[LP_ORDER_16k]; | ||
1036 | 25072 | enum Mode mode = ctx->fr_cur_mode; | |
1037 | |||
1038 |
2/2✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 23020 times.
|
25072 | if (mode == MODE_6k60) { |
1039 | float e_isf[LP_ORDER_16k]; // ISF vector for extrapolation | ||
1040 | double e_isp[LP_ORDER_16k]; | ||
1041 | |||
1042 | 2052 | ctx->acelpv_ctx.weighted_vector_sumf(e_isf, isf_past, isf, isfp_inter[subframe], | |
1043 | 2052 | 1.0 - isfp_inter[subframe], LP_ORDER); | |
1044 | |||
1045 | 2052 | extrapolate_isf(e_isf); | |
1046 | |||
1047 | 2052 | e_isf[LP_ORDER_16k - 1] *= 2.0; | |
1048 | 2052 | ff_acelp_lsf2lspd(e_isp, e_isf, LP_ORDER_16k); | |
1049 | 2052 | ff_amrwb_lsp2lpc(e_isp, hb_lpc, LP_ORDER_16k); | |
1050 | |||
1051 | 2052 | lpc_weighting(hb_lpc, hb_lpc, 0.9, LP_ORDER_16k); | |
1052 | } else { | ||
1053 | 23020 | lpc_weighting(hb_lpc, ctx->lp_coef[subframe], 0.6, LP_ORDER); | |
1054 | } | ||
1055 | |||
1056 |
2/2✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 23020 times.
|
25072 | ctx->celpf_ctx.celp_lp_synthesis_filterf(samples, hb_lpc, exc, AMRWB_SFR_SIZE_16k, |
1057 | (mode == MODE_6k60) ? LP_ORDER_16k : LP_ORDER); | ||
1058 | 25072 | } | |
1059 | |||
1060 | /** | ||
1061 | * Apply a 15th order filter to high-band samples. | ||
1062 | * The filter characteristic depends on the given coefficients. | ||
1063 | * | ||
1064 | * @param[out] out Buffer for filtered output | ||
1065 | * @param[in] fir_coef Filter coefficients | ||
1066 | * @param[in,out] mem State from last filtering (updated) | ||
1067 | * @param[in] in Input speech data (high-band) | ||
1068 | * | ||
1069 | * @remark It is safe to pass the same array in in and out parameters | ||
1070 | */ | ||
1071 | |||
1072 | #ifndef hb_fir_filter | ||
1073 | 33728 | static void hb_fir_filter(float *out, const float fir_coef[HB_FIR_SIZE + 1], | |
1074 | float mem[HB_FIR_SIZE], const float *in) | ||
1075 | { | ||
1076 | int i, j; | ||
1077 | float data[AMRWB_SFR_SIZE_16k + HB_FIR_SIZE]; // past and current samples | ||
1078 | |||
1079 | 33728 | memcpy(data, mem, HB_FIR_SIZE * sizeof(float)); | |
1080 | 33728 | memcpy(data + HB_FIR_SIZE, in, AMRWB_SFR_SIZE_16k * sizeof(float)); | |
1081 | |||
1082 |
2/2✓ Branch 0 taken 2698240 times.
✓ Branch 1 taken 33728 times.
|
2731968 | for (i = 0; i < AMRWB_SFR_SIZE_16k; i++) { |
1083 | 2698240 | out[i] = 0.0; | |
1084 |
2/2✓ Branch 0 taken 83645440 times.
✓ Branch 1 taken 2698240 times.
|
86343680 | for (j = 0; j <= HB_FIR_SIZE; j++) |
1085 | 83645440 | out[i] += data[i + j] * fir_coef[j]; | |
1086 | } | ||
1087 | |||
1088 | 33728 | memcpy(mem, data + AMRWB_SFR_SIZE_16k, HB_FIR_SIZE * sizeof(float)); | |
1089 | 33728 | } | |
1090 | #endif /* hb_fir_filter */ | ||
1091 | |||
1092 | /** | ||
1093 | * Update context state before the next subframe. | ||
1094 | */ | ||
1095 | 25072 | static void update_sub_state(AMRWBContext *ctx) | |
1096 | { | ||
1097 | 25072 | memmove(&ctx->excitation_buf[0], &ctx->excitation_buf[AMRWB_SFR_SIZE], | |
1098 | (AMRWB_P_DELAY_MAX + LP_ORDER + 1) * sizeof(float)); | ||
1099 | |||
1100 | 25072 | memmove(&ctx->pitch_gain[1], &ctx->pitch_gain[0], 5 * sizeof(float)); | |
1101 | 25072 | memmove(&ctx->fixed_gain[1], &ctx->fixed_gain[0], 1 * sizeof(float)); | |
1102 | |||
1103 | 25072 | memmove(&ctx->samples_az[0], &ctx->samples_az[AMRWB_SFR_SIZE], | |
1104 | LP_ORDER * sizeof(float)); | ||
1105 | 25072 | memmove(&ctx->samples_up[0], &ctx->samples_up[AMRWB_SFR_SIZE], | |
1106 | UPS_MEM_SIZE * sizeof(float)); | ||
1107 | 25072 | memmove(&ctx->samples_hb[0], &ctx->samples_hb[AMRWB_SFR_SIZE_16k], | |
1108 | LP_ORDER_16k * sizeof(float)); | ||
1109 | 25072 | } | |
1110 | |||
1111 | 6268 | static int amrwb_decode_frame(AVCodecContext *avctx, AVFrame *frame, | |
1112 | int *got_frame_ptr, AVPacket *avpkt) | ||
1113 | { | ||
1114 | 6268 | AMRWBChannelsContext *s = avctx->priv_data; | |
1115 | 6268 | const uint8_t *buf = avpkt->data; | |
1116 | 6268 | int buf_size = avpkt->size; | |
1117 | int sub, i, ret; | ||
1118 | |||
1119 | /* get output buffer */ | ||
1120 | 6268 | frame->nb_samples = 4 * AMRWB_SFR_SIZE_16k; | |
1121 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6268 times.
|
6268 | if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) |
1122 | ✗ | return ret; | |
1123 | |||
1124 |
2/2✓ Branch 0 taken 6268 times.
✓ Branch 1 taken 6268 times.
|
12536 | for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { |
1125 | 6268 | AMRWBContext *ctx = &s->ch[ch]; | |
1126 | 6268 | AMRWBFrame *cf = &ctx->frame; | |
1127 | int expected_fr_size, header_size; | ||
1128 | float spare_vector[AMRWB_SFR_SIZE]; // extra stack space to hold result from anti-sparseness processing | ||
1129 | float fixed_gain_factor; // fixed gain correction factor (gamma) | ||
1130 | float *synth_fixed_vector; // pointer to the fixed vector that synthesis should use | ||
1131 | float synth_fixed_gain; // the fixed gain that synthesis should use | ||
1132 | float voice_fac, stab_fac; // parameters used for gain smoothing | ||
1133 | float synth_exc[AMRWB_SFR_SIZE]; // post-processed excitation for synthesis | ||
1134 | float hb_exc[AMRWB_SFR_SIZE_16k]; // excitation for the high frequency band | ||
1135 | float hb_samples[AMRWB_SFR_SIZE_16k]; // filtered high-band samples from synthesis | ||
1136 | float hb_gain; | ||
1137 | 6268 | float *buf_out = (float *)frame->extended_data[ch]; | |
1138 | |||
1139 | 6268 | header_size = decode_mime_header(ctx, buf); | |
1140 | 6268 | expected_fr_size = ((cf_sizes_wb[ctx->fr_cur_mode] + 7) >> 3) + 1; | |
1141 | |||
1142 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6268 times.
|
6268 | if (!ctx->fr_quality) |
1143 | ✗ | av_log(avctx, AV_LOG_ERROR, "Encountered a bad or corrupted frame\n"); | |
1144 | |||
1145 |
2/4✓ Branch 0 taken 6268 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6268 times.
|
6268 | if (ctx->fr_cur_mode == NO_DATA || !ctx->fr_quality) { |
1146 | /* The specification suggests a "random signal" and | ||
1147 | "a muting technique" to "gradually decrease the output level". */ | ||
1148 | ✗ | av_samples_set_silence(&frame->extended_data[ch], 0, frame->nb_samples, 1, AV_SAMPLE_FMT_FLT); | |
1149 | ✗ | buf += expected_fr_size; | |
1150 | ✗ | buf_size -= expected_fr_size; | |
1151 | ✗ | continue; | |
1152 | } | ||
1153 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6268 times.
|
6268 | if (ctx->fr_cur_mode > MODE_SID) { |
1154 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
1155 | ✗ | "Invalid mode %d\n", ctx->fr_cur_mode); | |
1156 | ✗ | return AVERROR_INVALIDDATA; | |
1157 | } | ||
1158 | |||
1159 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6268 times.
|
6268 | if (buf_size < expected_fr_size) { |
1160 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
1161 | "Frame too small (%d bytes). Truncated file?\n", buf_size); | ||
1162 | ✗ | *got_frame_ptr = 0; | |
1163 | ✗ | return AVERROR_INVALIDDATA; | |
1164 | } | ||
1165 | |||
1166 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 6268 times.
|
6268 | if (ctx->fr_cur_mode == MODE_SID) { /* Comfort noise frame */ |
1167 | ✗ | avpriv_request_sample(avctx, "SID mode"); | |
1168 | ✗ | return AVERROR_PATCHWELCOME; | |
1169 | } | ||
1170 | |||
1171 | 6268 | ff_amr_bit_reorder((uint16_t *) &ctx->frame, sizeof(AMRWBFrame), | |
1172 | 6268 | buf + header_size, amr_bit_orderings_by_mode[ctx->fr_cur_mode]); | |
1173 | |||
1174 | /* Decode the quantized ISF vector */ | ||
1175 |
2/2✓ Branch 0 taken 513 times.
✓ Branch 1 taken 5755 times.
|
6268 | if (ctx->fr_cur_mode == MODE_6k60) { |
1176 | 513 | decode_isf_indices_36b(cf->isp_id, ctx->isf_cur); | |
1177 | } else { | ||
1178 | 5755 | decode_isf_indices_46b(cf->isp_id, ctx->isf_cur); | |
1179 | } | ||
1180 | |||
1181 | 6268 | isf_add_mean_and_past(ctx->isf_cur, ctx->isf_q_past); | |
1182 | 6268 | ff_set_min_dist_lsf(ctx->isf_cur, MIN_ISF_SPACING, LP_ORDER - 1); | |
1183 | |||
1184 | 6268 | stab_fac = stability_factor(ctx->isf_cur, ctx->isf_past_final); | |
1185 | |||
1186 | 6268 | ctx->isf_cur[LP_ORDER - 1] *= 2.0; | |
1187 | 6268 | ff_acelp_lsf2lspd(ctx->isp[3], ctx->isf_cur, LP_ORDER); | |
1188 | |||
1189 | /* Generate a ISP vector for each subframe */ | ||
1190 |
2/2✓ Branch 0 taken 22 times.
✓ Branch 1 taken 6246 times.
|
6268 | if (ctx->first_frame) { |
1191 | 22 | ctx->first_frame = 0; | |
1192 | 22 | memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(double)); | |
1193 | } | ||
1194 | 6268 | interpolate_isp(ctx->isp, ctx->isp_sub4_past); | |
1195 | |||
1196 |
2/2✓ Branch 0 taken 25072 times.
✓ Branch 1 taken 6268 times.
|
31340 | for (sub = 0; sub < 4; sub++) |
1197 | 25072 | ff_amrwb_lsp2lpc(ctx->isp[sub], ctx->lp_coef[sub], LP_ORDER); | |
1198 | |||
1199 |
2/2✓ Branch 0 taken 25072 times.
✓ Branch 1 taken 6268 times.
|
31340 | for (sub = 0; sub < 4; sub++) { |
1200 | 25072 | const AMRWBSubFrame *cur_subframe = &cf->subframe[sub]; | |
1201 | 25072 | float *sub_buf = buf_out + sub * AMRWB_SFR_SIZE_16k; | |
1202 | |||
1203 | /* Decode adaptive codebook (pitch vector) */ | ||
1204 | 25072 | decode_pitch_vector(ctx, cur_subframe, sub); | |
1205 | /* Decode innovative codebook (fixed vector) */ | ||
1206 | 25072 | decode_fixed_vector(ctx->fixed_vector, cur_subframe->pul_ih, | |
1207 | 25072 | cur_subframe->pul_il, ctx->fr_cur_mode); | |
1208 | |||
1209 | 25072 | pitch_sharpening(ctx, ctx->fixed_vector); | |
1210 | |||
1211 | 25072 | decode_gains(cur_subframe->vq_gain, ctx->fr_cur_mode, | |
1212 | &fixed_gain_factor, &ctx->pitch_gain[0]); | ||
1213 | |||
1214 | 25072 | ctx->fixed_gain[0] = | |
1215 | 25072 | ff_amr_set_fixed_gain(fixed_gain_factor, | |
1216 | 25072 | ctx->celpm_ctx.dot_productf(ctx->fixed_vector, | |
1217 | 25072 | ctx->fixed_vector, | |
1218 | AMRWB_SFR_SIZE) / | ||
1219 | AMRWB_SFR_SIZE, | ||
1220 | 25072 | ctx->prediction_error, | |
1221 | ENERGY_MEAN, energy_pred_fac); | ||
1222 | |||
1223 | /* Calculate voice factor and store tilt for next subframe */ | ||
1224 | 25072 | voice_fac = voice_factor(ctx->pitch_vector, ctx->pitch_gain[0], | |
1225 | 25072 | ctx->fixed_vector, ctx->fixed_gain[0], | |
1226 | &ctx->celpm_ctx); | ||
1227 | 25072 | ctx->tilt_coef = voice_fac * 0.25 + 0.25; | |
1228 | |||
1229 | /* Construct current excitation */ | ||
1230 |
2/2✓ Branch 0 taken 1604608 times.
✓ Branch 1 taken 25072 times.
|
1629680 | for (i = 0; i < AMRWB_SFR_SIZE; i++) { |
1231 | 1604608 | ctx->excitation[i] *= ctx->pitch_gain[0]; | |
1232 | 1604608 | ctx->excitation[i] += ctx->fixed_gain[0] * ctx->fixed_vector[i]; | |
1233 | 1604608 | ctx->excitation[i] = truncf(ctx->excitation[i]); | |
1234 | } | ||
1235 | |||
1236 | /* Post-processing of excitation elements */ | ||
1237 | 25072 | synth_fixed_gain = noise_enhancer(ctx->fixed_gain[0], &ctx->prev_tr_gain, | |
1238 | voice_fac, stab_fac); | ||
1239 | |||
1240 | 25072 | synth_fixed_vector = anti_sparseness(ctx, ctx->fixed_vector, | |
1241 | spare_vector); | ||
1242 | |||
1243 | 25072 | pitch_enhancer(synth_fixed_vector, voice_fac); | |
1244 | |||
1245 | 25072 | synthesis(ctx, ctx->lp_coef[sub], synth_exc, synth_fixed_gain, | |
1246 | synth_fixed_vector, &ctx->samples_az[LP_ORDER]); | ||
1247 | |||
1248 | /* Synthesis speech post-processing */ | ||
1249 | 25072 | de_emphasis(&ctx->samples_up[UPS_MEM_SIZE], | |
1250 | 25072 | &ctx->samples_az[LP_ORDER], PREEMPH_FAC, ctx->demph_mem); | |
1251 | |||
1252 | 25072 | ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(&ctx->samples_up[UPS_MEM_SIZE], | |
1253 | 25072 | &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_31_poles, | |
1254 | 25072 | hpf_31_gain, ctx->hpf_31_mem, AMRWB_SFR_SIZE); | |
1255 | |||
1256 | 25072 | upsample_5_4(sub_buf, &ctx->samples_up[UPS_FIR_SIZE], | |
1257 | AMRWB_SFR_SIZE_16k, &ctx->celpm_ctx); | ||
1258 | |||
1259 | /* High frequency band (6.4 - 7.0 kHz) generation part */ | ||
1260 | 25072 | ctx->acelpf_ctx.acelp_apply_order_2_transfer_function(hb_samples, | |
1261 | 25072 | &ctx->samples_up[UPS_MEM_SIZE], hpf_zeros, hpf_400_poles, | |
1262 | 25072 | hpf_400_gain, ctx->hpf_400_mem, AMRWB_SFR_SIZE); | |
1263 | |||
1264 | 25072 | hb_gain = find_hb_gain(ctx, hb_samples, | |
1265 | 25072 | cur_subframe->hb_gain, cf->vad); | |
1266 | |||
1267 | 25072 | scaled_hb_excitation(ctx, hb_exc, synth_exc, hb_gain); | |
1268 | |||
1269 | 25072 | hb_synthesis(ctx, sub, &ctx->samples_hb[LP_ORDER_16k], | |
1270 | 25072 | hb_exc, ctx->isf_cur, ctx->isf_past_final); | |
1271 | |||
1272 | /* High-band post-processing filters */ | ||
1273 | 25072 | hb_fir_filter(hb_samples, bpf_6_7_coef, ctx->bpf_6_7_mem, | |
1274 | 25072 | &ctx->samples_hb[LP_ORDER_16k]); | |
1275 | |||
1276 |
2/2✓ Branch 0 taken 8656 times.
✓ Branch 1 taken 16416 times.
|
25072 | if (ctx->fr_cur_mode == MODE_23k85) |
1277 | 8656 | hb_fir_filter(hb_samples, lpf_7_coef, ctx->lpf_7_mem, | |
1278 | hb_samples); | ||
1279 | |||
1280 | /* Add the low and high frequency bands */ | ||
1281 |
2/2✓ Branch 0 taken 2005760 times.
✓ Branch 1 taken 25072 times.
|
2030832 | for (i = 0; i < AMRWB_SFR_SIZE_16k; i++) |
1282 | 2005760 | sub_buf[i] = (sub_buf[i] + hb_samples[i]) * (1.0f / (1 << 15)); | |
1283 | |||
1284 | /* Update buffers and history */ | ||
1285 | 25072 | update_sub_state(ctx); | |
1286 | } | ||
1287 | |||
1288 | /* update state for next frame */ | ||
1289 | 6268 | memcpy(ctx->isp_sub4_past, ctx->isp[3], LP_ORDER * sizeof(ctx->isp[3][0])); | |
1290 | 6268 | memcpy(ctx->isf_past_final, ctx->isf_cur, LP_ORDER * sizeof(float)); | |
1291 | |||
1292 | 6268 | buf += expected_fr_size; | |
1293 | 6268 | buf_size -= expected_fr_size; | |
1294 | } | ||
1295 | |||
1296 | 6268 | *got_frame_ptr = 1; | |
1297 | |||
1298 | 6268 | return buf - avpkt->data; | |
1299 | } | ||
1300 | |||
1301 | const FFCodec ff_amrwb_decoder = { | ||
1302 | .p.name = "amrwb", | ||
1303 | CODEC_LONG_NAME("AMR-WB (Adaptive Multi-Rate WideBand)"), | ||
1304 | .p.type = AVMEDIA_TYPE_AUDIO, | ||
1305 | .p.id = AV_CODEC_ID_AMR_WB, | ||
1306 | .priv_data_size = sizeof(AMRWBChannelsContext), | ||
1307 | .init = amrwb_decode_init, | ||
1308 | FF_CODEC_DECODE_CB(amrwb_decode_frame), | ||
1309 | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, | ||
1310 | .p.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, | ||
1311 | AV_SAMPLE_FMT_NONE }, | ||
1312 | }; | ||
1313 |