FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dss_sp.c
Date: 2021-09-24 20:55:06
Exec Total Coverage
Lines: 243 266 91.4%
Branches: 107 130 82.3%

Line Branch Exec Source
1 /*
2 * Digital Speech Standard - Standard Play mode (DSS SP) audio decoder.
3 * Copyright (C) 2014 Oleksij Rempel <linux@rempel-privat.de>
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 #include "libavutil/channel_layout.h"
23 #include "libavutil/common.h"
24 #include "libavutil/mem_internal.h"
25 #include "libavutil/opt.h"
26
27 #include "avcodec.h"
28 #include "get_bits.h"
29 #include "internal.h"
30
31 #define SUBFRAMES 4
32 #define PULSE_MAX 8
33
34 #define DSS_SP_FRAME_SIZE 42
35 #define DSS_SP_SAMPLE_COUNT (66 * SUBFRAMES)
36 #define DSS_SP_FORMULA(a, b, c) ((int)((((a) * (1 << 15)) + (b) * (unsigned)(c)) + 0x4000) >> 15)
37
38 typedef struct DssSpSubframe {
39 int16_t gain;
40 int32_t combined_pulse_pos;
41 int16_t pulse_pos[7];
42 int16_t pulse_val[7];
43 } DssSpSubframe;
44
45 typedef struct DssSpFrame {
46 int16_t filter_idx[14];
47 int16_t sf_adaptive_gain[SUBFRAMES];
48 int16_t pitch_lag[SUBFRAMES];
49 struct DssSpSubframe sf[SUBFRAMES];
50 } DssSpFrame;
51
52 typedef struct DssSpContext {
53 AVCodecContext *avctx;
54 int32_t excitation[288 + 6];
55 int32_t history[187];
56 DssSpFrame fparam;
57 int32_t working_buffer[SUBFRAMES][72];
58 int32_t audio_buf[15];
59 int32_t err_buf1[15];
60 int32_t lpc_filter[14];
61 int32_t filter[15];
62 int32_t vector_buf[72];
63 int noise_state;
64 int32_t err_buf2[15];
65
66 int pulse_dec_mode;
67
68 DECLARE_ALIGNED(16, uint8_t, bits)[DSS_SP_FRAME_SIZE +
69 AV_INPUT_BUFFER_PADDING_SIZE];
70 } DssSpContext;
71
72 /*
73 * Used for the coding/decoding of the pulse positions for the MP-MLQ codebook.
74 */
75 static const uint32_t dss_sp_combinatorial_table[PULSE_MAX][72] = {
76 { 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0,
79 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0,
81 0, 0, 0, 0, 0, 0,
82 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 0, 0,
84 0, 0, 0, 0, 0, 0,
85 0, 0, 0, 0, 0, 0,
86 0, 0, 0, 0, 0, 0,
87 0, 0, 0, 0, 0, 0 },
88 { 0, 1, 2, 3, 4, 5,
89 6, 7, 8, 9, 10, 11,
90 12, 13, 14, 15, 16, 17,
91 18, 19, 20, 21, 22, 23,
92 24, 25, 26, 27, 28, 29,
93 30, 31, 32, 33, 34, 35,
94 36, 37, 38, 39, 40, 41,
95 42, 43, 44, 45, 46, 47,
96 48, 49, 50, 51, 52, 53,
97 54, 55, 56, 57, 58, 59,
98 60, 61, 62, 63, 64, 65,
99 66, 67, 68, 69, 70, 71 },
100 { 0, 0, 1, 3, 6, 10,
101 15, 21, 28, 36, 45, 55,
102 66, 78, 91, 105, 120, 136,
103 153, 171, 190, 210, 231, 253,
104 276, 300, 325, 351, 378, 406,
105 435, 465, 496, 528, 561, 595,
106 630, 666, 703, 741, 780, 820,
107 861, 903, 946, 990, 1035, 1081,
108 1128, 1176, 1225, 1275, 1326, 1378,
109 1431, 1485, 1540, 1596, 1653, 1711,
110 1770, 1830, 1891, 1953, 2016, 2080,
111 2145, 2211, 2278, 2346, 2415, 2485 },
112 { 0, 0, 0, 1, 4, 10,
113 20, 35, 56, 84, 120, 165,
114 220, 286, 364, 455, 560, 680,
115 816, 969, 1140, 1330, 1540, 1771,
116 2024, 2300, 2600, 2925, 3276, 3654,
117 4060, 4495, 4960, 5456, 5984, 6545,
118 7140, 7770, 8436, 9139, 9880, 10660,
119 11480, 12341, 13244, 14190, 15180, 16215,
120 17296, 18424, 19600, 20825, 22100, 23426,
121 24804, 26235, 27720, 29260, 30856, 32509,
122 34220, 35990, 37820, 39711, 41664, 43680,
123 45760, 47905, 50116, 52394, 54740, 57155 },
124 { 0, 0, 0, 0, 1, 5,
125 15, 35, 70, 126, 210, 330,
126 495, 715, 1001, 1365, 1820, 2380,
127 3060, 3876, 4845, 5985, 7315, 8855,
128 10626, 12650, 14950, 17550, 20475, 23751,
129 27405, 31465, 35960, 40920, 46376, 52360,
130 58905, 66045, 73815, 82251, 91390, 101270,
131 111930, 123410, 135751, 148995, 163185, 178365,
132 194580, 211876, 230300, 249900, 270725, 292825,
133 316251, 341055, 367290, 395010, 424270, 455126,
134 487635, 521855, 557845, 595665, 635376, 677040,
135 720720, 766480, 814385, 864501, 916895, 971635 },
136 { 0, 0, 0, 0, 0, 1,
137 6, 21, 56, 126, 252, 462,
138 792, 1287, 2002, 3003, 4368, 6188,
139 8568, 11628, 15504, 20349, 26334, 33649,
140 42504, 53130, 65780, 80730, 98280, 118755,
141 142506, 169911, 201376, 237336, 278256, 324632,
142 376992, 435897, 501942, 575757, 658008, 749398,
143 850668, 962598, 1086008, 1221759, 1370754, 1533939,
144 1712304, 1906884, 2118760, 2349060, 2598960, 2869685,
145 3162510, 3478761, 3819816, 4187106, 4582116, 5006386,
146 5461512, 5949147, 6471002, 7028847, 7624512, 8259888,
147 8936928, 9657648, 10424128, 11238513, 12103014, 13019909 },
148 { 0, 0, 0, 0, 0, 0,
149 1, 7, 28, 84, 210, 462,
150 924, 1716, 3003, 5005, 8008, 12376,
151 18564, 27132, 38760, 54264, 74613, 100947,
152 134596, 177100, 230230, 296010, 376740, 475020,
153 593775, 736281, 906192, 1107568, 1344904, 1623160,
154 1947792, 2324784, 2760681, 3262623, 3838380, 4496388,
155 5245786, 6096454, 7059052, 8145060, 9366819, 10737573,
156 12271512, 13983816, 15890700, 18009460, 20358520, 22957480,
157 25827165, 28989675, 32468436, 36288252, 40475358, 45057474,
158 50063860, 55525372, 61474519, 67945521, 74974368, 82598880,
159 90858768, 99795696, 109453344, 119877472, 131115985, 143218999 },
160 { 0, 0, 0, 0, 0, 0,
161 0, 1, 8, 36, 120, 330,
162 792, 1716, 3432, 6435, 11440, 19448,
163 31824, 50388, 77520, 116280, 170544, 245157,
164 346104, 480700, 657800, 888030, 1184040, 1560780,
165 2035800, 2629575, 3365856, 4272048, 5379616, 6724520,
166 8347680, 10295472, 12620256, 15380937, 18643560, 22481940,
167 26978328, 32224114, 38320568, 45379620, 53524680, 62891499,
168 73629072, 85900584, 99884400, 115775100, 133784560, 154143080,
169 177100560, 202927725, 231917400, 264385836, 300674088, 341149446,
170 386206920, 436270780, 491796152, 553270671, 621216192, 696190560,
171 778789440, 869648208, 969443904, 1078897248, 1198774720, 1329890705 },
172 };
173
174 static const int16_t dss_sp_filter_cb[14][32] = {
175 { -32653, -32587, -32515, -32438, -32341, -32216, -32062, -31881,
176 -31665, -31398, -31080, -30724, -30299, -29813, -29248, -28572,
177 -27674, -26439, -24666, -22466, -19433, -16133, -12218, -7783,
178 -2834, 1819, 6544, 11260, 16050, 20220, 24774, 28120 },
179
180 { -27503, -24509, -20644, -17496, -14187, -11277, -8420, -5595,
181 -3013, -624, 1711, 3880, 5844, 7774, 9739, 11592,
182 13364, 14903, 16426, 17900, 19250, 20586, 21803, 23006,
183 24142, 25249, 26275, 27300, 28359, 29249, 30118, 31183 },
184
185 { -27827, -24208, -20943, -17781, -14843, -11848, -9066, -6297,
186 -3660, -910, 1918, 5025, 8223, 11649, 15086, 18423,
187 0, 0, 0, 0, 0, 0, 0, 0,
188 0, 0, 0, 0, 0, 0, 0, 0 },
189
190 { -17128, -11975, -8270, -5123, -2296, 183, 2503, 4707,
191 6798, 8945, 11045, 13239, 15528, 18248, 21115, 24785,
192 0, 0, 0, 0, 0, 0, 0, 0,
193 0, 0, 0, 0, 0, 0, 0, 0 },
194
195 { -21557, -17280, -14286, -11644, -9268, -7087, -4939, -2831,
196 -691, 1407, 3536, 5721, 8125, 10677, 13721, 17731,
197 0, 0, 0, 0, 0, 0, 0, 0,
198 0, 0, 0, 0, 0, 0, 0, 0 },
199
200 { -15030, -10377, -7034, -4327, -1900, 364, 2458, 4450,
201 6422, 8374, 10374, 12486, 14714, 16997, 19626, 22954,
202 0, 0, 0, 0, 0, 0, 0, 0,
203 0, 0, 0, 0, 0, 0, 0, 0 },
204
205 { -16155, -12362, -9698, -7460, -5258, -3359, -1547, 219,
206 1916, 3599, 5299, 6994, 8963, 11226, 13716, 16982,
207 0, 0, 0, 0, 0, 0, 0, 0,
208 0, 0, 0, 0, 0, 0, 0, 0 },
209
210 { -14742, -9848, -6921, -4648, -2769, -1065, 499, 2083,
211 3633, 5219, 6857, 8580, 10410, 12672, 15561, 20101,
212 0, 0, 0, 0, 0, 0, 0, 0,
213 0, 0, 0, 0, 0, 0, 0, 0 },
214
215 { -11099, -7014, -3855, -1025, 1680, 4544, 7807, 11932,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 0, 0, 0, 0, 0, 0, 0 },
219
220 { -9060, -4570, -1381, 1419, 4034, 6728, 9865, 14149,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0,
223 0, 0, 0, 0, 0, 0, 0, 0 },
224
225 { -12450, -7985, -4596, -1734, 961, 3629, 6865, 11142,
226 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0,
228 0, 0, 0, 0, 0, 0, 0, 0 },
229
230 { -11831, -7404, -4010, -1096, 1606, 4291, 7386, 11482,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0,
233 0, 0, 0, 0, 0, 0, 0, 0 },
234
235 { -13404, -9250, -5995, -3312, -890, 1594, 4464, 8198,
236 0, 0, 0, 0, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, 0, 0,
238 0, 0, 0, 0, 0, 0, 0, 0 },
239
240 { -11239, -7220, -4040, -1406, 971, 3321, 6006, 9697,
241 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0 },
244 };
245
246 static const uint16_t dss_sp_fixed_cb_gain[64] = {
247 0, 4, 8, 13, 17, 22, 26, 31,
248 35, 40, 44, 48, 53, 58, 63, 69,
249 76, 83, 91, 99, 109, 119, 130, 142,
250 155, 170, 185, 203, 222, 242, 265, 290,
251 317, 346, 378, 414, 452, 494, 540, 591,
252 646, 706, 771, 843, 922, 1007, 1101, 1204,
253 1316, 1438, 1572, 1719, 1879, 2053, 2244, 2453,
254 2682, 2931, 3204, 3502, 3828, 4184, 4574, 5000,
255 };
256
257 static const int16_t dss_sp_pulse_val[8] = {
258 -31182, -22273, -13364, -4455, 4455, 13364, 22273, 31182
259 };
260
261 static const uint16_t binary_decreasing_array[] = {
262 32767, 16384, 8192, 4096, 2048, 1024, 512, 256,
263 128, 64, 32, 16, 8, 4, 2,
264 };
265
266 static const uint16_t dss_sp_unc_decreasing_array[] = {
267 32767, 26214, 20972, 16777, 13422, 10737, 8590, 6872,
268 5498, 4398, 3518, 2815, 2252, 1801, 1441,
269 };
270
271 static const uint16_t dss_sp_adaptive_gain[] = {
272 102, 231, 360, 488, 617, 746, 875, 1004,
273 1133, 1261, 1390, 1519, 1648, 1777, 1905, 2034,
274 2163, 2292, 2421, 2550, 2678, 2807, 2936, 3065,
275 3194, 3323, 3451, 3580, 3709, 3838, 3967, 4096,
276 };
277
278 static const int32_t dss_sp_sinc[67] = {
279 262, 293, 323, 348, 356, 336, 269, 139,
280 -67, -358, -733, -1178, -1668, -2162, -2607, -2940,
281 -3090, -2986, -2562, -1760, -541, 1110, 3187, 5651,
282 8435, 11446, 14568, 17670, 20611, 23251, 25460, 27125,
283 28160, 28512, 28160,
284 27125, 25460, 23251, 20611, 17670, 14568, 11446, 8435,
285 5651, 3187, 1110, -541, -1760, -2562, -2986, -3090,
286 -2940, -2607, -2162, -1668, -1178, -733, -358, -67,
287 139, 269, 336, 356, 348, 323, 293, 262,
288 };
289
290 2 static av_cold int dss_sp_decode_init(AVCodecContext *avctx)
291 {
292 2 DssSpContext *p = avctx->priv_data;
293 2 avctx->channel_layout = AV_CH_LAYOUT_MONO;
294 2 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
295 2 avctx->channels = 1;
296 2 avctx->sample_rate = 11025;
297
298 2 p->pulse_dec_mode = 1;
299 2 p->avctx = avctx;
300
301 2 return 0;
302 }
303
304 31 static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
305 {
306 GetBitContext gb;
307 31 DssSpFrame *fparam = &p->fparam;
308 int i;
309 int subframe_idx;
310 uint32_t combined_pitch;
311 uint32_t tmp;
312 uint32_t pitch_lag;
313
314
2/2
✓ Branch 0 taken 651 times.
✓ Branch 1 taken 31 times.
682 for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
315 651 p->bits[i] = src[i + 1];
316 651 p->bits[i + 1] = src[i];
317 }
318
319 31 init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);
320
321
2/2
✓ Branch 0 taken 62 times.
✓ Branch 1 taken 31 times.
93 for (i = 0; i < 2; i++)
322 62 fparam->filter_idx[i] = get_bits(&gb, 5);
323
2/2
✓ Branch 0 taken 186 times.
✓ Branch 1 taken 31 times.
217 for (; i < 8; i++)
324 186 fparam->filter_idx[i] = get_bits(&gb, 4);
325
2/2
✓ Branch 0 taken 186 times.
✓ Branch 1 taken 31 times.
217 for (; i < 14; i++)
326 186 fparam->filter_idx[i] = get_bits(&gb, 3);
327
328
2/2
✓ Branch 0 taken 124 times.
✓ Branch 1 taken 31 times.
155 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
329 124 fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);
330
331 124 fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);
332
333 124 fparam->sf[subframe_idx].gain = get_bits(&gb, 6);
334
335
2/2
✓ Branch 0 taken 868 times.
✓ Branch 1 taken 124 times.
992 for (i = 0; i < 7; i++)
336 868 fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
337 }
338
339
2/2
✓ Branch 0 taken 124 times.
✓ Branch 1 taken 31 times.
155 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
340 124 unsigned int C72_binomials[PULSE_MAX] = {
341 72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
342 3379081753
343 };
344 124 unsigned int combined_pulse_pos =
345 124 fparam->sf[subframe_idx].combined_pulse_pos;
346 124 int index = 6;
347
348
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
349
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (p->pulse_dec_mode) {
350 int pulse, pulse_idx;
351 124 pulse = PULSE_MAX - 1;
352 124 pulse_idx = 71;
353 124 combined_pulse_pos =
354 124 fparam->sf[subframe_idx].combined_pulse_pos;
355
356 /* this part seems to be close to g723.1 gen_fcb_excitation()
357 * RATE_6300 */
358
359 /* TODO: what is 7? size of subframe? */
360
2/2
✓ Branch 0 taken 868 times.
✓ Branch 1 taken 124 times.
992 for (i = 0; i < 7; i++) {
361 868 for (;
362 8323 combined_pulse_pos <
363
2/2
✓ Branch 0 taken 7455 times.
✓ Branch 1 taken 868 times.
8323 dss_sp_combinatorial_table[pulse][pulse_idx];
364 7455 --pulse_idx)
365 ;
366 868 combined_pulse_pos -=
367 868 dss_sp_combinatorial_table[pulse][pulse_idx];
368 868 pulse--;
369 868 fparam->sf[subframe_idx].pulse_pos[i] = pulse_idx;
370 }
371 }
372 } else {
373 p->pulse_dec_mode = 0;
374
375 /* why do we need this? */
376 fparam->sf[subframe_idx].pulse_pos[6] = 0;
377
378 for (i = 71; i >= 0; i--) {
379 if (C72_binomials[index] <= combined_pulse_pos) {
380 combined_pulse_pos -= C72_binomials[index];
381
382 fparam->sf[subframe_idx].pulse_pos[6 - index] = i;
383
384 if (!index)
385 break;
386 --index;
387 }
388 --C72_binomials[0];
389 if (index) {
390 int a;
391 for (a = 0; a < index; a++)
392 C72_binomials[a + 1] -= C72_binomials[a];
393 }
394 }
395 }
396 }
397
398 31 combined_pitch = get_bits(&gb, 24);
399
400 31 fparam->pitch_lag[0] = (combined_pitch % 151) + 36;
401
402 31 combined_pitch /= 151;
403
404
2/2
✓ Branch 0 taken 62 times.
✓ Branch 1 taken 31 times.
93 for (i = 1; i < SUBFRAMES - 1; i++) {
405 62 fparam->pitch_lag[i] = combined_pitch % 48;
406 62 combined_pitch /= 48;
407 }
408
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
31 if (combined_pitch > 47) {
409 av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
410 combined_pitch = 0;
411 }
412 31 fparam->pitch_lag[i] = combined_pitch;
413
414 31 pitch_lag = fparam->pitch_lag[0];
415
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 31 times.
124 for (i = 1; i < SUBFRAMES; i++) {
416
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 82 times.
93 if (pitch_lag > 162) {
417 11 fparam->pitch_lag[i] += 162 - 23;
418 } else {
419 82 tmp = pitch_lag - 23;
420
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 63 times.
82 if (tmp < 36)
421 19 tmp = 36;
422 82 fparam->pitch_lag[i] += tmp;
423 }
424 93 pitch_lag = fparam->pitch_lag[i];
425 }
426 31 }
427
428 31 static void dss_sp_unpack_filter(DssSpContext *p)
429 {
430 int i;
431
432
2/2
✓ Branch 0 taken 434 times.
✓ Branch 1 taken 31 times.
465 for (i = 0; i < 14; i++)
433 434 p->lpc_filter[i] = dss_sp_filter_cb[i][p->fparam.filter_idx[i]];
434 31 }
435
436 31 static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
437 {
438 int a, a_plus, i;
439
440 31 coeffs[0] = 0x2000;
441
2/2
✓ Branch 0 taken 434 times.
✓ Branch 1 taken 31 times.
465 for (a = 0; a < 14; a++) {
442 434 a_plus = a + 1;
443 434 coeffs[a_plus] = lpc_filter[a] >> 2;
444
2/2
✓ Branch 0 taken 403 times.
✓ Branch 1 taken 31 times.
434 if (a_plus / 2 >= 1) {
445
2/2
✓ Branch 0 taken 1519 times.
✓ Branch 1 taken 403 times.
1922 for (i = 1; i <= a_plus / 2; i++) {
446 int coeff_1, coeff_2, tmp;
447
448 1519 coeff_1 = coeffs[i];
449 1519 coeff_2 = coeffs[a_plus - i];
450
451 1519 tmp = DSS_SP_FORMULA(coeff_1, lpc_filter[a], coeff_2);
452 1519 coeffs[i] = av_clip_int16(tmp);
453
454 1519 tmp = DSS_SP_FORMULA(coeff_2, lpc_filter[a], coeff_1);
455 1519 coeffs[a_plus - i] = av_clip_int16(tmp);
456 }
457 }
458 }
459 31 }
460
461 124 static void dss_sp_add_pulses(int32_t *vector_buf,
462 const struct DssSpSubframe *sf)
463 {
464 int i;
465
466
2/2
✓ Branch 0 taken 868 times.
✓ Branch 1 taken 124 times.
992 for (i = 0; i < 7; i++)
467 868 vector_buf[sf->pulse_pos[i]] += (dss_sp_fixed_cb_gain[sf->gain] *
468 868 dss_sp_pulse_val[sf->pulse_val[i]] +
469 868 0x4000) >> 15;
470 124 }
471
472 124 static void dss_sp_gen_exc(int32_t *vector, int32_t *prev_exc,
473 int pitch_lag, int gain)
474 {
475 int i;
476
477 /* do we actually need this check? we can use just [a3 - i % a3]
478 * for both cases */
479
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 88 times.
124 if (pitch_lag < 72)
480
2/2
✓ Branch 0 taken 2592 times.
✓ Branch 1 taken 36 times.
2628 for (i = 0; i < 72; i++)
481 2592 vector[i] = prev_exc[pitch_lag - i % pitch_lag];
482 else
483
2/2
✓ Branch 0 taken 6336 times.
✓ Branch 1 taken 88 times.
6424 for (i = 0; i < 72; i++)
484 6336 vector[i] = prev_exc[pitch_lag - i];
485
486
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (i = 0; i < 72; i++) {
487 8928 int tmp = gain * vector[i] >> 11;
488 8928 vector[i] = av_clip_int16(tmp);
489 }
490 124 }
491
492 744 static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
493 {
494 int i;
495
496
2/2
✓ Branch 0 taken 372 times.
✓ Branch 1 taken 372 times.
744 if (bits < 0)
497
2/2
✓ Branch 0 taken 12648 times.
✓ Branch 1 taken 372 times.
13020 for (i = 0; i < size; i++)
498 12648 vec[i] = vec[i] >> -bits;
499 else
500
2/2
✓ Branch 0 taken 12648 times.
✓ Branch 1 taken 372 times.
13020 for (i = 0; i < size; i++)
501 12648 vec[i] = vec[i] * (1 << bits);
502 744 }
503
504 124 static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
505 {
506 int i;
507
508
2/2
✓ Branch 0 taken 14136 times.
✓ Branch 1 taken 124 times.
14260 for (i = 114; i > 0; i--)
509 14136 vector[i + 72] = vector[i];
510
511
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (i = 0; i < 72; i++)
512 8928 vector[72 - i] = hist[i];
513 124 }
514
515 248 static void dss_sp_shift_sq_sub(const int32_t *filter_buf,
516 int32_t *error_buf, int32_t *dst)
517 {
518 int a;
519
520
2/2
✓ Branch 0 taken 17856 times.
✓ Branch 1 taken 248 times.
18104 for (a = 0; a < 72; a++) {
521 int i, tmp;
522
523 17856 tmp = dst[a] * filter_buf[0];
524
525
2/2
✓ Branch 0 taken 249984 times.
✓ Branch 1 taken 17856 times.
267840 for (i = 14; i > 0; i--)
526 249984 tmp -= error_buf[i] * (unsigned)filter_buf[i];
527
528
2/2
✓ Branch 0 taken 249984 times.
✓ Branch 1 taken 17856 times.
267840 for (i = 14; i > 0; i--)
529 249984 error_buf[i] = error_buf[i - 1];
530
531 17856 tmp = (int)(tmp + 4096U) >> 13;
532
533 17856 error_buf[1] = tmp;
534
535 17856 dst[a] = av_clip_int16(tmp);
536 }
537 248 }
538
539 124 static void dss_sp_shift_sq_add(const int32_t *filter_buf, int32_t *audio_buf,
540 int32_t *dst)
541 {
542 int a;
543
544
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (a = 0; a < 72; a++) {
545 8928 int i, tmp = 0;
546
547 8928 audio_buf[0] = dst[a];
548
549
2/2
✓ Branch 0 taken 133920 times.
✓ Branch 1 taken 8928 times.
142848 for (i = 14; i >= 0; i--)
550 133920 tmp += audio_buf[i] * filter_buf[i];
551
552
2/2
✓ Branch 0 taken 124992 times.
✓ Branch 1 taken 8928 times.
133920 for (i = 14; i > 0; i--)
553 124992 audio_buf[i] = audio_buf[i - 1];
554
555 8928 tmp = (tmp + 4096) >> 13;
556
557 8928 dst[a] = av_clip_int16(tmp);
558 }
559 124 }
560
561 248 static void dss_sp_vec_mult(const int32_t *src, int32_t *dst,
562 const int16_t *mult)
563 {
564 int i;
565
566 248 dst[0] = src[0];
567
568
2/2
✓ Branch 0 taken 3472 times.
✓ Branch 1 taken 248 times.
3720 for (i = 1; i < 15; i++)
569 3472 dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
570 248 }
571
572 124 static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
573 {
574 unsigned int val;
575 int max_val;
576 int i;
577
578 124 val = 1;
579
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (i = 0; i < size; i++)
580 8928 val |= FFABS(vector_buf[i]);
581
582
2/2
✓ Branch 0 taken 901 times.
✓ Branch 1 taken 124 times.
1025 for (max_val = 0; val <= 0x4000; ++max_val)
583 901 val *= 2;
584 124 return max_val;
585 }
586
587 248 static int dss_sp_vector_sum(DssSpContext *p, int size)
588 {
589 248 int i, sum = 0;
590
2/2
✓ Branch 0 taken 17856 times.
✓ Branch 1 taken 248 times.
18104 for (i = 0; i < size; i++)
591 17856 sum += FFABS(p->vector_buf[i]);
592 248 return sum;
593 }
594
595 124 static void dss_sp_sf_synthesis(DssSpContext *p, int32_t lpc_filter,
596 int32_t *dst, int size)
597 {
598 int32_t tmp_buf[15];
599 int32_t noise[72];
600 124 int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
601 int i, tmp;
602
603
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (size > 0) {
604 124 vsum_1 = dss_sp_vector_sum(p, size);
605
606
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 124 times.
124 if (vsum_1 > 0xFFFFF)
607 vsum_1 = 0xFFFFF;
608 }
609
610 124 normalize_bits = dss_sp_get_normalize_bits(p->vector_buf, size);
611
612 124 dss_sp_scale_vector(p->vector_buf, normalize_bits - 3, size);
613 124 dss_sp_scale_vector(p->audio_buf, normalize_bits, 15);
614 124 dss_sp_scale_vector(p->err_buf1, normalize_bits, 15);
615
616 124 v36 = p->err_buf1[1];
617
618 124 dss_sp_vec_mult(p->filter, tmp_buf, binary_decreasing_array);
619 124 dss_sp_shift_sq_add(tmp_buf, p->audio_buf, p->vector_buf);
620
621 124 dss_sp_vec_mult(p->filter, tmp_buf, dss_sp_unc_decreasing_array);
622 124 dss_sp_shift_sq_sub(tmp_buf, p->err_buf1, p->vector_buf);
623
624 /* lpc_filter can be negative */
625 124 lpc_filter = lpc_filter >> 1;
626
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 124 times.
124 if (lpc_filter >= 0)
627 lpc_filter = 0;
628
629
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (size > 1) {
630
2/2
✓ Branch 0 taken 8804 times.
✓ Branch 1 taken 124 times.
8928 for (i = size - 1; i > 0; i--) {
631 8804 tmp = DSS_SP_FORMULA(p->vector_buf[i], lpc_filter,
632 p->vector_buf[i - 1]);
633 8804 p->vector_buf[i] = av_clip_int16(tmp);
634 }
635 }
636
637 124 tmp = DSS_SP_FORMULA(p->vector_buf[0], lpc_filter, v36);
638 124 p->vector_buf[0] = av_clip_int16(tmp);
639
640 124 dss_sp_scale_vector(p->vector_buf, -normalize_bits, size);
641 124 dss_sp_scale_vector(p->audio_buf, -normalize_bits, 15);
642 124 dss_sp_scale_vector(p->err_buf1, -normalize_bits, 15);
643
644
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (size > 0)
645 124 vsum_2 = dss_sp_vector_sum(p, size);
646
647
1/2
✓ Branch 0 taken 124 times.
✗ Branch 1 not taken.
124 if (vsum_2 >= 0x40)
648 124 tmp = (vsum_1 << 11) / vsum_2;
649 else
650 tmp = 1;
651
652 124 bias = 409 * tmp >> 15 << 15;
653 124 tmp = (bias + 32358 * p->noise_state) >> 15;
654 124 noise[0] = av_clip_int16(tmp);
655
656
2/2
✓ Branch 0 taken 8804 times.
✓ Branch 1 taken 124 times.
8928 for (i = 1; i < size; i++) {
657 8804 tmp = (bias + 32358 * noise[i - 1]) >> 15;
658 8804 noise[i] = av_clip_int16(tmp);
659 }
660
661 124 p->noise_state = noise[size - 1];
662
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (i = 0; i < size; i++) {
663 8928 tmp = (p->vector_buf[i] * noise[i]) >> 11;
664 8928 dst[i] = av_clip_int16(tmp);
665 }
666 124 }
667
668 31 static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
669 {
670 31 int i, offset = 6, counter = 0, a = 0;
671
672
2/2
✓ Branch 0 taken 186 times.
✓ Branch 1 taken 31 times.
217 for (i = 0; i < 6; i++)
673 186 p->excitation[i] = p->excitation[288 + i];
674
675
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 31 times.
8959 for (i = 0; i < 72 * SUBFRAMES; i++)
676 8928 p->excitation[6 + i] = dst[i];
677
678 do {
679 8184 int tmp = 0;
680
681
2/2
✓ Branch 0 taken 49104 times.
✓ Branch 1 taken 8184 times.
57288 for (i = 0; i < 6; i++)
682 49104 tmp += p->excitation[offset--] * dss_sp_sinc[a + i * 11];
683
684 8184 offset += 7;
685
686 8184 tmp >>= 15;
687 8184 dst[counter] = av_clip_int16(tmp);
688
689 8184 counter++;
690
691 8184 a = (a + 1) % 11;
692
2/2
✓ Branch 0 taken 744 times.
✓ Branch 1 taken 7440 times.
8184 if (!a)
693 744 offset++;
694
2/2
✓ Branch 0 taken 8153 times.
✓ Branch 1 taken 31 times.
8184 } while (offset < FF_ARRAY_ELEMS(p->excitation));
695 31 }
696
697 31 static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
698 {
699 int i;
700
701
2/2
✓ Branch 0 taken 8184 times.
✓ Branch 1 taken 31 times.
8215 for (i = 0; i < size; i++)
702 8184 dst[i] = av_clip_int16(src[i]);
703 31 }
704
705 31 static int dss_sp_decode_one_frame(DssSpContext *p,
706 int16_t *abuf_dst, const uint8_t *abuf_src)
707 {
708 int i, j;
709
710 31 dss_sp_unpack_coeffs(p, abuf_src);
711
712 31 dss_sp_unpack_filter(p);
713
714 31 dss_sp_convert_coeffs(p->lpc_filter, p->filter);
715
716
2/2
✓ Branch 0 taken 124 times.
✓ Branch 1 taken 31 times.
155 for (j = 0; j < SUBFRAMES; j++) {
717 124 dss_sp_gen_exc(p->vector_buf, p->history,
718 124 p->fparam.pitch_lag[j],
719 124 dss_sp_adaptive_gain[p->fparam.sf_adaptive_gain[j]]);
720
721 124 dss_sp_add_pulses(p->vector_buf, &p->fparam.sf[j]);
722
723 124 dss_sp_update_buf(p->vector_buf, p->history);
724
725
2/2
✓ Branch 0 taken 8928 times.
✓ Branch 1 taken 124 times.
9052 for (i = 0; i < 72; i++)
726 8928 p->vector_buf[i] = p->history[72 - i];
727
728 124 dss_sp_shift_sq_sub(p->filter,
729 124 p->err_buf2, p->vector_buf);
730
731 124 dss_sp_sf_synthesis(p, p->lpc_filter[0],
732 &p->working_buffer[j][0], 72);
733 }
734
735 31 dss_sp_update_state(p, &p->working_buffer[0][0]);
736
737 31 dss_sp_32to16bit(abuf_dst,
738 &p->working_buffer[0][0], 264);
739 31 return 0;
740 }
741
742 31 static int dss_sp_decode_frame(AVCodecContext *avctx, void *data,
743 int *got_frame_ptr, AVPacket *avpkt)
744 {
745 31 DssSpContext *p = avctx->priv_data;
746 31 AVFrame *frame = data;
747 31 const uint8_t *buf = avpkt->data;
748 31 int buf_size = avpkt->size;
749
750 int16_t *out;
751 int ret;
752
753
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
31 if (buf_size < DSS_SP_FRAME_SIZE) {
754 if (buf_size)
755 av_log(avctx, AV_LOG_WARNING,
756 "Expected %d bytes, got %d - skipping packet.\n",
757 DSS_SP_FRAME_SIZE, buf_size);
758 *got_frame_ptr = 0;
759 return AVERROR_INVALIDDATA;
760 }
761
762 31 frame->nb_samples = DSS_SP_SAMPLE_COUNT;
763
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 31 times.
31 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
764 return ret;
765
766 31 out = (int16_t *)frame->data[0];
767
768 31 dss_sp_decode_one_frame(p, out, buf);
769
770 31 *got_frame_ptr = 1;
771
772 31 return DSS_SP_FRAME_SIZE;
773 }
774
775 const AVCodec ff_dss_sp_decoder = {
776 .name = "dss_sp",
777 .long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
778 .type = AVMEDIA_TYPE_AUDIO,
779 .id = AV_CODEC_ID_DSS_SP,
780 .priv_data_size = sizeof(DssSpContext),
781 .init = dss_sp_decode_init,
782 .decode = dss_sp_decode_frame,
783 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
784 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
785 };
786