FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/dss_sp.c
Date: 2025-01-20 09:27:23
Exec Total Coverage
Lines: 243 265 91.7%
Functions: 18 18 100.0%
Branches: 108 130 83.1%

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