FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dss_sp.c
Date: 2025-06-01 09:29:47
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 33 static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
305 {
306 GetBitContext gb;
307 33 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 693 times.
✓ Branch 1 taken 33 times.
726 for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
315 693 p->bits[i] = src[i + 1];
316 693 p->bits[i + 1] = src[i];
317 }
318
319 33 init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);
320
321
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 33 times.
99 for (i = 0; i < 2; i++)
322 66 fparam->filter_idx[i] = get_bits(&gb, 5);
323
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 33 times.
231 for (; i < 8; i++)
324 198 fparam->filter_idx[i] = get_bits(&gb, 4);
325
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 33 times.
231 for (; i < 14; i++)
326 198 fparam->filter_idx[i] = get_bits(&gb, 3);
327
328
2/2
✓ Branch 0 taken 132 times.
✓ Branch 1 taken 33 times.
165 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
329 132 fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);
330
331 132 fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);
332
333 132 fparam->sf[subframe_idx].gain = get_bits(&gb, 6);
334
335
2/2
✓ Branch 0 taken 924 times.
✓ Branch 1 taken 132 times.
1056 for (i = 0; i < 7; i++)
336 924 fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
337 }
338
339
2/2
✓ Branch 0 taken 132 times.
✓ Branch 1 taken 33 times.
165 for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
340 132 unsigned int C72_binomials[PULSE_MAX] = {
341 72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
342 3379081753
343 };
344 132 unsigned int combined_pulse_pos =
345 132 fparam->sf[subframe_idx].combined_pulse_pos;
346 132 int index = 6;
347
348
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
349
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (p->pulse_dec_mode) {
350 int pulse, pulse_idx;
351 132 pulse = PULSE_MAX - 1;
352 132 pulse_idx = 71;
353 132 combined_pulse_pos =
354 132 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 924 times.
✓ Branch 1 taken 132 times.
1056 for (i = 0; i < 7; i++) {
361 924 for (;
362 8888 combined_pulse_pos <
363
2/2
✓ Branch 0 taken 7964 times.
✓ Branch 1 taken 924 times.
8888 dss_sp_combinatorial_table[pulse][pulse_idx];
364 7964 --pulse_idx)
365 ;
366 924 combined_pulse_pos -=
367 924 dss_sp_combinatorial_table[pulse][pulse_idx];
368 924 pulse--;
369 924 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 33 combined_pitch = get_bits(&gb, 24);
399
400 33 fparam->pitch_lag[0] = (combined_pitch % 151) + 36;
401
402 33 combined_pitch /= 151;
403
404
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 33 times.
99 for (i = 1; i < SUBFRAMES - 1; i++) {
405 66 fparam->pitch_lag[i] = combined_pitch % 48;
406 66 combined_pitch /= 48;
407 }
408
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
33 if (combined_pitch > 47) {
409 av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
410 combined_pitch = 0;
411 }
412 33 fparam->pitch_lag[i] = combined_pitch;
413
414 33 pitch_lag = fparam->pitch_lag[0];
415
2/2
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 33 times.
132 for (i = 1; i < SUBFRAMES; i++) {
416
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 88 times.
99 if (pitch_lag > 162) {
417 11 fparam->pitch_lag[i] += 162 - 23;
418 } else {
419 88 tmp = pitch_lag - 23;
420
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 67 times.
88 if (tmp < 36)
421 21 tmp = 36;
422 88 fparam->pitch_lag[i] += tmp;
423 }
424 99 pitch_lag = fparam->pitch_lag[i];
425 }
426 33 }
427
428 33 static void dss_sp_unpack_filter(DssSpContext *p)
429 {
430 int i;
431
432
2/2
✓ Branch 0 taken 462 times.
✓ Branch 1 taken 33 times.
495 for (i = 0; i < 14; i++)
433 462 p->lpc_filter[i] = dss_sp_filter_cb[i][p->fparam.filter_idx[i]];
434 33 }
435
436 33 static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
437 {
438 int a, a_plus, i;
439
440 33 coeffs[0] = 0x2000;
441
2/2
✓ Branch 0 taken 462 times.
✓ Branch 1 taken 33 times.
495 for (a = 0; a < 14; a++) {
442 462 a_plus = a + 1;
443 462 coeffs[a_plus] = lpc_filter[a] >> 2;
444
2/2
✓ Branch 0 taken 429 times.
✓ Branch 1 taken 33 times.
462 if (a_plus / 2 >= 1) {
445
2/2
✓ Branch 0 taken 1617 times.
✓ Branch 1 taken 429 times.
2046 for (i = 1; i <= a_plus / 2; i++) {
446 int coeff_1, coeff_2, tmp;
447
448 1617 coeff_1 = coeffs[i];
449 1617 coeff_2 = coeffs[a_plus - i];
450
451 1617 tmp = DSS_SP_FORMULA(coeff_1, lpc_filter[a], coeff_2);
452 1617 coeffs[i] = av_clip_int16(tmp);
453
454 1617 tmp = DSS_SP_FORMULA(coeff_2, lpc_filter[a], coeff_1);
455 1617 coeffs[a_plus - i] = av_clip_int16(tmp);
456 }
457 }
458 }
459 33 }
460
461 132 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 924 times.
✓ Branch 1 taken 132 times.
1056 for (i = 0; i < 7; i++)
467 924 vector_buf[sf->pulse_pos[i]] += (dss_sp_fixed_cb_gain[sf->gain] *
468 924 dss_sp_pulse_val[sf->pulse_val[i]] +
469 924 0x4000) >> 15;
470 132 }
471
472 132 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 39 times.
✓ Branch 1 taken 93 times.
132 if (pitch_lag < 72)
480
2/2
✓ Branch 0 taken 2808 times.
✓ Branch 1 taken 39 times.
2847 for (i = 0; i < 72; i++)
481 2808 vector[i] = prev_exc[pitch_lag - i % pitch_lag];
482 else
483
2/2
✓ Branch 0 taken 6696 times.
✓ Branch 1 taken 93 times.
6789 for (i = 0; i < 72; i++)
484 6696 vector[i] = prev_exc[pitch_lag - i];
485
486
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 132 times.
9636 for (i = 0; i < 72; i++) {
487 9504 int tmp = gain * vector[i] >> 11;
488 9504 vector[i] = av_clip_int16(tmp);
489 }
490 132 }
491
492 792 static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
493 {
494 int i;
495
496
2/2
✓ Branch 0 taken 396 times.
✓ Branch 1 taken 396 times.
792 if (bits < 0)
497
2/2
✓ Branch 0 taken 13464 times.
✓ Branch 1 taken 396 times.
13860 for (i = 0; i < size; i++)
498 13464 vec[i] = vec[i] >> -bits;
499 else
500
2/2
✓ Branch 0 taken 13464 times.
✓ Branch 1 taken 396 times.
13860 for (i = 0; i < size; i++)
501 13464 vec[i] = vec[i] * (1 << bits);
502 792 }
503
504 132 static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
505 {
506 int i;
507
508
2/2
✓ Branch 0 taken 15048 times.
✓ Branch 1 taken 132 times.
15180 for (i = 114; i > 0; i--)
509 15048 vector[i + 72] = vector[i];
510
511
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 132 times.
9636 for (i = 0; i < 72; i++)
512 9504 vector[72 - i] = hist[i];
513 132 }
514
515 264 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 19008 times.
✓ Branch 1 taken 264 times.
19272 for (a = 0; a < 72; a++) {
521 int i, tmp;
522
523 19008 tmp = dst[a] * filter_buf[0];
524
525
2/2
✓ Branch 0 taken 266112 times.
✓ Branch 1 taken 19008 times.
285120 for (i = 14; i > 0; i--)
526 266112 tmp -= error_buf[i] * (unsigned)filter_buf[i];
527
528
2/2
✓ Branch 0 taken 266112 times.
✓ Branch 1 taken 19008 times.
285120 for (i = 14; i > 0; i--)
529 266112 error_buf[i] = error_buf[i - 1];
530
531 19008 tmp = (int)(tmp + 4096U) >> 13;
532
533 19008 error_buf[1] = tmp;
534
535 19008 dst[a] = av_clip_int16(tmp);
536 }
537 264 }
538
539 132 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 9504 times.
✓ Branch 1 taken 132 times.
9636 for (a = 0; a < 72; a++) {
545 9504 int i, tmp = 0;
546
547 9504 audio_buf[0] = dst[a];
548
549
2/2
✓ Branch 0 taken 142560 times.
✓ Branch 1 taken 9504 times.
152064 for (i = 14; i >= 0; i--)
550 142560 tmp += audio_buf[i] * filter_buf[i];
551
552
2/2
✓ Branch 0 taken 133056 times.
✓ Branch 1 taken 9504 times.
142560 for (i = 14; i > 0; i--)
553 133056 audio_buf[i] = audio_buf[i - 1];
554
555 9504 tmp = (tmp + 4096) >> 13;
556
557 9504 dst[a] = av_clip_int16(tmp);
558 }
559 132 }
560
561 264 static void dss_sp_vec_mult(const int32_t *src, int32_t *dst,
562 const int16_t *mult)
563 {
564 int i;
565
566 264 dst[0] = src[0];
567
568
2/2
✓ Branch 0 taken 3696 times.
✓ Branch 1 taken 264 times.
3960 for (i = 1; i < 15; i++)
569 3696 dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
570 264 }
571
572 132 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 132 val = 1;
579
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 132 times.
9636 for (i = 0; i < size; i++)
580 9504 val |= FFABS(vector_buf[i]);
581
582
2/2
✓ Branch 0 taken 958 times.
✓ Branch 1 taken 132 times.
1090 for (max_val = 0; val <= 0x4000; ++max_val)
583 958 val *= 2;
584 132 return max_val;
585 }
586
587 264 static int dss_sp_vector_sum(DssSpContext *p, int size)
588 {
589 264 int i, sum = 0;
590
2/2
✓ Branch 0 taken 19008 times.
✓ Branch 1 taken 264 times.
19272 for (i = 0; i < size; i++)
591 19008 sum += FFABS(p->vector_buf[i]);
592 264 return sum;
593 }
594
595 132 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 132 int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
601 int i, tmp;
602
603
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (size > 0) {
604 132 vsum_1 = dss_sp_vector_sum(p, size);
605
606
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 132 times.
132 if (vsum_1 > 0xFFFFF)
607 vsum_1 = 0xFFFFF;
608 }
609
610 132 normalize_bits = dss_sp_get_normalize_bits(p->vector_buf, size);
611
612 132 dss_sp_scale_vector(p->vector_buf, normalize_bits - 3, size);
613 132 dss_sp_scale_vector(p->audio_buf, normalize_bits, 15);
614 132 dss_sp_scale_vector(p->err_buf1, normalize_bits, 15);
615
616 132 v36 = p->err_buf1[1];
617
618 132 dss_sp_vec_mult(p->filter, tmp_buf, binary_decreasing_array);
619 132 dss_sp_shift_sq_add(tmp_buf, p->audio_buf, p->vector_buf);
620
621 132 dss_sp_vec_mult(p->filter, tmp_buf, dss_sp_unc_decreasing_array);
622 132 dss_sp_shift_sq_sub(tmp_buf, p->err_buf1, p->vector_buf);
623
624 /* lpc_filter can be negative */
625 132 lpc_filter = lpc_filter >> 1;
626
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 132 times.
132 if (lpc_filter >= 0)
627 lpc_filter = 0;
628
629
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (size > 1) {
630
2/2
✓ Branch 0 taken 9372 times.
✓ Branch 1 taken 132 times.
9504 for (i = size - 1; i > 0; i--) {
631 9372 tmp = DSS_SP_FORMULA(p->vector_buf[i], lpc_filter,
632 p->vector_buf[i - 1]);
633 9372 p->vector_buf[i] = av_clip_int16(tmp);
634 }
635 }
636
637 132 tmp = DSS_SP_FORMULA(p->vector_buf[0], lpc_filter, v36);
638 132 p->vector_buf[0] = av_clip_int16(tmp);
639
640 132 dss_sp_scale_vector(p->vector_buf, -normalize_bits, size);
641 132 dss_sp_scale_vector(p->audio_buf, -normalize_bits, 15);
642 132 dss_sp_scale_vector(p->err_buf1, -normalize_bits, 15);
643
644
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (size > 0)
645 132 vsum_2 = dss_sp_vector_sum(p, size);
646
647
1/2
✓ Branch 0 taken 132 times.
✗ Branch 1 not taken.
132 if (vsum_2 >= 0x40)
648 132 tmp = (vsum_1 << 11) / vsum_2;
649 else
650 tmp = 1;
651
652 132 bias = 409 * tmp >> 15 << 15;
653 132 tmp = (bias + 32358 * p->noise_state) >> 15;
654 132 noise[0] = av_clip_int16(tmp);
655
656
2/2
✓ Branch 0 taken 9372 times.
✓ Branch 1 taken 132 times.
9504 for (i = 1; i < size; i++) {
657 9372 tmp = (bias + 32358 * noise[i - 1]) >> 15;
658 9372 noise[i] = av_clip_int16(tmp);
659 }
660
661 132 p->noise_state = noise[size - 1];
662
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 132 times.
9636 for (i = 0; i < size; i++) {
663 9504 tmp = (p->vector_buf[i] * noise[i]) >> 11;
664 9504 dst[i] = av_clip_int16(tmp);
665 }
666 132 }
667
668 33 static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
669 {
670 33 int i, offset = 6, counter = 0, a = 0;
671
672
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 33 times.
231 for (i = 0; i < 6; i++)
673 198 p->excitation[i] = p->excitation[288 + i];
674
675
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 33 times.
9537 for (i = 0; i < 72 * SUBFRAMES; i++)
676 9504 p->excitation[6 + i] = dst[i];
677
678 do {
679 8712 int tmp = 0;
680
681
2/2
✓ Branch 0 taken 52272 times.
✓ Branch 1 taken 8712 times.
60984 for (i = 0; i < 6; i++)
682 52272 tmp += p->excitation[offset--] * dss_sp_sinc[a + i * 11];
683
684 8712 offset += 7;
685
686 8712 tmp >>= 15;
687 8712 dst[counter] = av_clip_int16(tmp);
688
689 8712 counter++;
690
691 8712 a = (a + 1) % 11;
692
2/2
✓ Branch 0 taken 792 times.
✓ Branch 1 taken 7920 times.
8712 if (!a)
693 792 offset++;
694
2/2
✓ Branch 0 taken 8679 times.
✓ Branch 1 taken 33 times.
8712 } while (offset < FF_ARRAY_ELEMS(p->excitation));
695 33 }
696
697 33 static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
698 {
699 int i;
700
701
2/2
✓ Branch 0 taken 8712 times.
✓ Branch 1 taken 33 times.
8745 for (i = 0; i < size; i++)
702 8712 dst[i] = av_clip_int16(src[i]);
703 33 }
704
705 33 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 33 dss_sp_unpack_coeffs(p, abuf_src);
711
712 33 dss_sp_unpack_filter(p);
713
714 33 dss_sp_convert_coeffs(p->lpc_filter, p->filter);
715
716
2/2
✓ Branch 0 taken 132 times.
✓ Branch 1 taken 33 times.
165 for (j = 0; j < SUBFRAMES; j++) {
717 132 dss_sp_gen_exc(p->vector_buf, p->history,
718 132 p->fparam.pitch_lag[j],
719 132 dss_sp_adaptive_gain[p->fparam.sf_adaptive_gain[j]]);
720
721 132 dss_sp_add_pulses(p->vector_buf, &p->fparam.sf[j]);
722
723 132 dss_sp_update_buf(p->vector_buf, p->history);
724
725
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 132 times.
9636 for (i = 0; i < 72; i++)
726 9504 p->vector_buf[i] = p->history[72 - i];
727
728 132 dss_sp_shift_sq_sub(p->filter,
729 132 p->err_buf2, p->vector_buf);
730
731 132 dss_sp_sf_synthesis(p, p->lpc_filter[0],
732 &p->working_buffer[j][0], 72);
733 }
734
735 33 dss_sp_update_state(p, &p->working_buffer[0][0]);
736
737 33 dss_sp_32to16bit(abuf_dst,
738 &p->working_buffer[0][0], 264);
739 33 return 0;
740 }
741
742 33 static int dss_sp_decode_frame(AVCodecContext *avctx, AVFrame *frame,
743 int *got_frame_ptr, AVPacket *avpkt)
744 {
745 33 DssSpContext *p = avctx->priv_data;
746 33 const uint8_t *buf = avpkt->data;
747 33 int buf_size = avpkt->size;
748
749 int16_t *out;
750 int ret;
751
752
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
33 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 33 frame->nb_samples = DSS_SP_SAMPLE_COUNT;
762
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
33 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
763 return ret;
764
765 33 out = (int16_t *)frame->data[0];
766
767 33 dss_sp_decode_one_frame(p, out, buf);
768
769 33 *got_frame_ptr = 1;
770
771 33 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