FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dss_sp.c
Date: 2025-07-02 09:19:21
Exec Total Coverage
Lines: 242 265 91.3%
Functions: 18 18 100.0%
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
26 #include "avcodec.h"
27 #include "codec_internal.h"
28 #include "decode.h"
29 #include "get_bits.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->sample_fmt = AV_SAMPLE_FMT_S16;
294 2 avctx->sample_rate = 11025;
295 2 av_channel_layout_uninit(&avctx->ch_layout);
296 2 avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO;
297
298 2 p->pulse_dec_mode = 1;
299 2 p->avctx = avctx;
300
301 2 return 0;
302 }
303
304 35 static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
305 {
306 GetBitContext gb;
307 35 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 735 times.
✓ Branch 1 taken 35 times.
770 for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
315 735 p->bits[i] = src[i + 1];
316 735 p->bits[i + 1] = src[i];
317 }
318
319 35 init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);
320
321
2/2
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 35 times.
105 for (i = 0; i < 2; i++)
322 70 fparam->filter_idx[i] = get_bits(&gb, 5);
323
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 35 times.
245 for (; i < 8; i++)
324 210 fparam->filter_idx[i] = get_bits(&gb, 4);
325
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 35 times.
245 for (; i < 14; i++)
326 210 fparam->filter_idx[i] = get_bits(&gb, 3);
327
328
2/2
✓ Branch 0 taken 140 times.
✓ Branch 1 taken 35 times.
175 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
329 140 fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);
330
331 140 fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);
332
333 140 fparam->sf[subframe_idx].gain = get_bits(&gb, 6);
334
335
2/2
✓ Branch 0 taken 980 times.
✓ Branch 1 taken 140 times.
1120 for (i = 0; i < 7; i++)
336 980 fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
337 }
338
339
2/2
✓ Branch 0 taken 140 times.
✓ Branch 1 taken 35 times.
175 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
340 140 unsigned int C72_binomials[PULSE_MAX] = {
341 72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
342 3379081753
343 };
344 140 unsigned int combined_pulse_pos =
345 140 fparam->sf[subframe_idx].combined_pulse_pos;
346 140 int index = 6;
347
348
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
349
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (p->pulse_dec_mode) {
350 int pulse, pulse_idx;
351 140 pulse = PULSE_MAX - 1;
352 140 pulse_idx = 71;
353 140 combined_pulse_pos =
354 140 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 980 times.
✓ Branch 1 taken 140 times.
1120 for (i = 0; i < 7; i++) {
361 980 for (;
362 9444 combined_pulse_pos <
363
2/2
✓ Branch 0 taken 8464 times.
✓ Branch 1 taken 980 times.
9444 dss_sp_combinatorial_table[pulse][pulse_idx];
364 8464 --pulse_idx)
365 ;
366 980 combined_pulse_pos -=
367 980 dss_sp_combinatorial_table[pulse][pulse_idx];
368 980 pulse--;
369 980 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 35 combined_pitch = get_bits(&gb, 24);
399
400 35 fparam->pitch_lag[0] = (combined_pitch % 151) + 36;
401
402 35 combined_pitch /= 151;
403
404
2/2
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 35 times.
105 for (i = 1; i < SUBFRAMES - 1; i++) {
405 70 fparam->pitch_lag[i] = combined_pitch % 48;
406 70 combined_pitch /= 48;
407 }
408
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 35 times.
35 if (combined_pitch > 47) {
409 av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
410 combined_pitch = 0;
411 }
412 35 fparam->pitch_lag[i] = combined_pitch;
413
414 35 pitch_lag = fparam->pitch_lag[0];
415
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 35 times.
140 for (i = 1; i < SUBFRAMES; i++) {
416
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 94 times.
105 if (pitch_lag > 162) {
417 11 fparam->pitch_lag[i] += 162 - 23;
418 } else {
419 94 tmp = pitch_lag - 23;
420
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 71 times.
94 if (tmp < 36)
421 23 tmp = 36;
422 94 fparam->pitch_lag[i] += tmp;
423 }
424 105 pitch_lag = fparam->pitch_lag[i];
425 }
426 35 }
427
428 35 static void dss_sp_unpack_filter(DssSpContext *p)
429 {
430 int i;
431
432
2/2
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 35 times.
525 for (i = 0; i < 14; i++)
433 490 p->lpc_filter[i] = dss_sp_filter_cb[i][p->fparam.filter_idx[i]];
434 35 }
435
436 35 static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
437 {
438 int a, a_plus, i;
439
440 35 coeffs[0] = 0x2000;
441
2/2
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 35 times.
525 for (a = 0; a < 14; a++) {
442 490 a_plus = a + 1;
443 490 coeffs[a_plus] = lpc_filter[a] >> 2;
444
2/2
✓ Branch 0 taken 455 times.
✓ Branch 1 taken 35 times.
490 if (a_plus / 2 >= 1) {
445
2/2
✓ Branch 0 taken 1715 times.
✓ Branch 1 taken 455 times.
2170 for (i = 1; i <= a_plus / 2; i++) {
446 int coeff_1, coeff_2, tmp;
447
448 1715 coeff_1 = coeffs[i];
449 1715 coeff_2 = coeffs[a_plus - i];
450
451 1715 tmp = DSS_SP_FORMULA(coeff_1, lpc_filter[a], coeff_2);
452 1715 coeffs[i] = av_clip_int16(tmp);
453
454 1715 tmp = DSS_SP_FORMULA(coeff_2, lpc_filter[a], coeff_1);
455 1715 coeffs[a_plus - i] = av_clip_int16(tmp);
456 }
457 }
458 }
459 35 }
460
461 140 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 980 times.
✓ Branch 1 taken 140 times.
1120 for (i = 0; i < 7; i++)
467 980 vector_buf[sf->pulse_pos[i]] += (dss_sp_fixed_cb_gain[sf->gain] *
468 980 dss_sp_pulse_val[sf->pulse_val[i]] +
469 980 0x4000) >> 15;
470 140 }
471
472 140 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 43 times.
✓ Branch 1 taken 97 times.
140 if (pitch_lag < 72)
480
2/2
✓ Branch 0 taken 3096 times.
✓ Branch 1 taken 43 times.
3139 for (i = 0; i < 72; i++)
481 3096 vector[i] = prev_exc[pitch_lag - i % pitch_lag];
482 else
483
2/2
✓ Branch 0 taken 6984 times.
✓ Branch 1 taken 97 times.
7081 for (i = 0; i < 72; i++)
484 6984 vector[i] = prev_exc[pitch_lag - i];
485
486
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 140 times.
10220 for (i = 0; i < 72; i++) {
487 10080 int tmp = gain * vector[i] >> 11;
488 10080 vector[i] = av_clip_int16(tmp);
489 }
490 140 }
491
492 840 static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
493 {
494 int i;
495
496
2/2
✓ Branch 0 taken 420 times.
✓ Branch 1 taken 420 times.
840 if (bits < 0)
497
2/2
✓ Branch 0 taken 14280 times.
✓ Branch 1 taken 420 times.
14700 for (i = 0; i < size; i++)
498 14280 vec[i] = vec[i] >> -bits;
499 else
500
2/2
✓ Branch 0 taken 14280 times.
✓ Branch 1 taken 420 times.
14700 for (i = 0; i < size; i++)
501 14280 vec[i] = vec[i] * (1 << bits);
502 840 }
503
504 140 static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
505 {
506 int i;
507
508
2/2
✓ Branch 0 taken 15960 times.
✓ Branch 1 taken 140 times.
16100 for (i = 114; i > 0; i--)
509 15960 vector[i + 72] = vector[i];
510
511
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 140 times.
10220 for (i = 0; i < 72; i++)
512 10080 vector[72 - i] = hist[i];
513 140 }
514
515 280 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 20160 times.
✓ Branch 1 taken 280 times.
20440 for (a = 0; a < 72; a++) {
521 int i, tmp;
522
523 20160 tmp = dst[a] * filter_buf[0];
524
525
2/2
✓ Branch 0 taken 282240 times.
✓ Branch 1 taken 20160 times.
302400 for (i = 14; i > 0; i--)
526 282240 tmp -= error_buf[i] * (unsigned)filter_buf[i];
527
528
2/2
✓ Branch 0 taken 282240 times.
✓ Branch 1 taken 20160 times.
302400 for (i = 14; i > 0; i--)
529 282240 error_buf[i] = error_buf[i - 1];
530
531 20160 tmp = (int)(tmp + 4096U) >> 13;
532
533 20160 error_buf[1] = tmp;
534
535 20160 dst[a] = av_clip_int16(tmp);
536 }
537 280 }
538
539 140 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 10080 times.
✓ Branch 1 taken 140 times.
10220 for (a = 0; a < 72; a++) {
545 10080 int i, tmp = 0;
546
547 10080 audio_buf[0] = dst[a];
548
549
2/2
✓ Branch 0 taken 151200 times.
✓ Branch 1 taken 10080 times.
161280 for (i = 14; i >= 0; i--)
550 151200 tmp += audio_buf[i] * filter_buf[i];
551
552
2/2
✓ Branch 0 taken 141120 times.
✓ Branch 1 taken 10080 times.
151200 for (i = 14; i > 0; i--)
553 141120 audio_buf[i] = audio_buf[i - 1];
554
555 10080 tmp = (tmp + 4096) >> 13;
556
557 10080 dst[a] = av_clip_int16(tmp);
558 }
559 140 }
560
561 280 static void dss_sp_vec_mult(const int32_t *src, int32_t *dst,
562 const int16_t *mult)
563 {
564 int i;
565
566 280 dst[0] = src[0];
567
568
2/2
✓ Branch 0 taken 3920 times.
✓ Branch 1 taken 280 times.
4200 for (i = 1; i < 15; i++)
569 3920 dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
570 280 }
571
572 140 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 140 val = 1;
579
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 140 times.
10220 for (i = 0; i < size; i++)
580 10080 val |= FFABS(vector_buf[i]);
581
582
2/2
✓ Branch 0 taken 1014 times.
✓ Branch 1 taken 140 times.
1154 for (max_val = 0; val <= 0x4000; ++max_val)
583 1014 val *= 2;
584 140 return max_val;
585 }
586
587 280 static int dss_sp_vector_sum(DssSpContext *p, int size)
588 {
589 280 int i, sum = 0;
590
2/2
✓ Branch 0 taken 20160 times.
✓ Branch 1 taken 280 times.
20440 for (i = 0; i < size; i++)
591 20160 sum += FFABS(p->vector_buf[i]);
592 280 return sum;
593 }
594
595 140 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 140 int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
601 int i, tmp;
602
603
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (size > 0) {
604 140 vsum_1 = dss_sp_vector_sum(p, size);
605
606
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 140 times.
140 if (vsum_1 > 0xFFFFF)
607 vsum_1 = 0xFFFFF;
608 }
609
610 140 normalize_bits = dss_sp_get_normalize_bits(p->vector_buf, size);
611
612 140 dss_sp_scale_vector(p->vector_buf, normalize_bits - 3, size);
613 140 dss_sp_scale_vector(p->audio_buf, normalize_bits, 15);
614 140 dss_sp_scale_vector(p->err_buf1, normalize_bits, 15);
615
616 140 v36 = p->err_buf1[1];
617
618 140 dss_sp_vec_mult(p->filter, tmp_buf, binary_decreasing_array);
619 140 dss_sp_shift_sq_add(tmp_buf, p->audio_buf, p->vector_buf);
620
621 140 dss_sp_vec_mult(p->filter, tmp_buf, dss_sp_unc_decreasing_array);
622 140 dss_sp_shift_sq_sub(tmp_buf, p->err_buf1, p->vector_buf);
623
624 /* lpc_filter can be negative */
625 140 lpc_filter = lpc_filter >> 1;
626
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 140 times.
140 if (lpc_filter >= 0)
627 lpc_filter = 0;
628
629
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (size > 1) {
630
2/2
✓ Branch 0 taken 9940 times.
✓ Branch 1 taken 140 times.
10080 for (i = size - 1; i > 0; i--) {
631 9940 tmp = DSS_SP_FORMULA(p->vector_buf[i], lpc_filter,
632 p->vector_buf[i - 1]);
633 9940 p->vector_buf[i] = av_clip_int16(tmp);
634 }
635 }
636
637 140 tmp = DSS_SP_FORMULA(p->vector_buf[0], lpc_filter, v36);
638 140 p->vector_buf[0] = av_clip_int16(tmp);
639
640 140 dss_sp_scale_vector(p->vector_buf, -normalize_bits, size);
641 140 dss_sp_scale_vector(p->audio_buf, -normalize_bits, 15);
642 140 dss_sp_scale_vector(p->err_buf1, -normalize_bits, 15);
643
644
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (size > 0)
645 140 vsum_2 = dss_sp_vector_sum(p, size);
646
647
1/2
✓ Branch 0 taken 140 times.
✗ Branch 1 not taken.
140 if (vsum_2 >= 0x40)
648 140 tmp = (vsum_1 << 11) / vsum_2;
649 else
650 tmp = 1;
651
652 140 bias = 409 * tmp >> 15 << 15;
653 140 tmp = (bias + 32358 * p->noise_state) >> 15;
654 140 noise[0] = av_clip_int16(tmp);
655
656
2/2
✓ Branch 0 taken 9940 times.
✓ Branch 1 taken 140 times.
10080 for (i = 1; i < size; i++) {
657 9940 tmp = (bias + 32358 * noise[i - 1]) >> 15;
658 9940 noise[i] = av_clip_int16(tmp);
659 }
660
661 140 p->noise_state = noise[size - 1];
662
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 140 times.
10220 for (i = 0; i < size; i++) {
663 10080 tmp = (p->vector_buf[i] * noise[i]) >> 11;
664 10080 dst[i] = av_clip_int16(tmp);
665 }
666 140 }
667
668 35 static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
669 {
670 35 int i, offset = 6, counter = 0, a = 0;
671
672
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 35 times.
245 for (i = 0; i < 6; i++)
673 210 p->excitation[i] = p->excitation[288 + i];
674
675
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 35 times.
10115 for (i = 0; i < 72 * SUBFRAMES; i++)
676 10080 p->excitation[6 + i] = dst[i];
677
678 do {
679 9240 int tmp = 0;
680
681
2/2
✓ Branch 0 taken 55440 times.
✓ Branch 1 taken 9240 times.
64680 for (i = 0; i < 6; i++)
682 55440 tmp += p->excitation[offset--] * dss_sp_sinc[a + i * 11];
683
684 9240 offset += 7;
685
686 9240 tmp >>= 15;
687 9240 dst[counter] = av_clip_int16(tmp);
688
689 9240 counter++;
690
691 9240 a = (a + 1) % 11;
692
2/2
✓ Branch 0 taken 840 times.
✓ Branch 1 taken 8400 times.
9240 if (!a)
693 840 offset++;
694
2/2
✓ Branch 0 taken 9205 times.
✓ Branch 1 taken 35 times.
9240 } while (offset < FF_ARRAY_ELEMS(p->excitation));
695 35 }
696
697 35 static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
698 {
699 int i;
700
701
2/2
✓ Branch 0 taken 9240 times.
✓ Branch 1 taken 35 times.
9275 for (i = 0; i < size; i++)
702 9240 dst[i] = av_clip_int16(src[i]);
703 35 }
704
705 35 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 35 dss_sp_unpack_coeffs(p, abuf_src);
711
712 35 dss_sp_unpack_filter(p);
713
714 35 dss_sp_convert_coeffs(p->lpc_filter, p->filter);
715
716
2/2
✓ Branch 0 taken 140 times.
✓ Branch 1 taken 35 times.
175 for (j = 0; j < SUBFRAMES; j++) {
717 140 dss_sp_gen_exc(p->vector_buf, p->history,
718 140 p->fparam.pitch_lag[j],
719 140 dss_sp_adaptive_gain[p->fparam.sf_adaptive_gain[j]]);
720
721 140 dss_sp_add_pulses(p->vector_buf, &p->fparam.sf[j]);
722
723 140 dss_sp_update_buf(p->vector_buf, p->history);
724
725
2/2
✓ Branch 0 taken 10080 times.
✓ Branch 1 taken 140 times.
10220 for (i = 0; i < 72; i++)
726 10080 p->vector_buf[i] = p->history[72 - i];
727
728 140 dss_sp_shift_sq_sub(p->filter,
729 140 p->err_buf2, p->vector_buf);
730
731 140 dss_sp_sf_synthesis(p, p->lpc_filter[0],
732 &p->working_buffer[j][0], 72);
733 }
734
735 35 dss_sp_update_state(p, &p->working_buffer[0][0]);
736
737 35 dss_sp_32to16bit(abuf_dst,
738 &p->working_buffer[0][0], 264);
739 35 return 0;
740 }
741
742 35 static int dss_sp_decode_frame(AVCodecContext *avctx, AVFrame *frame,
743 int *got_frame_ptr, AVPacket *avpkt)
744 {
745 35 DssSpContext *p = avctx->priv_data;
746 35 const uint8_t *buf = avpkt->data;
747 35 int buf_size = avpkt->size;
748
749 int16_t *out;
750 int ret;
751
752
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 35 times.
35 if (buf_size < DSS_SP_FRAME_SIZE) {
753 if (buf_size)
754 av_log(avctx, AV_LOG_WARNING,
755 "Expected %d bytes, got %d - skipping packet.\n",
756 DSS_SP_FRAME_SIZE, buf_size);
757 *got_frame_ptr = 0;
758 return AVERROR_INVALIDDATA;
759 }
760
761 35 frame->nb_samples = DSS_SP_SAMPLE_COUNT;
762
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
35 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
763 return ret;
764
765 35 out = (int16_t *)frame->data[0];
766
767 35 dss_sp_decode_one_frame(p, out, buf);
768
769 35 *got_frame_ptr = 1;
770
771 35 return DSS_SP_FRAME_SIZE;
772 }
773
774 const FFCodec ff_dss_sp_decoder = {
775 .p.name = "dss_sp",
776 CODEC_LONG_NAME("Digital Speech Standard - Standard Play mode (DSS SP)"),
777 .p.type = AVMEDIA_TYPE_AUDIO,
778 .p.id = AV_CODEC_ID_DSS_SP,
779 .priv_data_size = sizeof(DssSpContext),
780 .init = dss_sp_decode_init,
781 FF_CODEC_DECODE_CB(dss_sp_decode_frame),
782 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
783 };
784