FFmpeg coverage


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