2 * Digital Speech Standard - Standard Play mode (DSS SP) audio decoder.
3 * Copyright (C) 2014 Oleksij Rempel <linux@rempel-privat.de>
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/channel_layout.h"
23 #include "libavutil/common.h"
24 #include "libavutil/mem.h"
25 #include "libavutil/opt.h"
28 #include "bitstream.h"
34 #define DSS_SP_FRAME_SIZE 42
35 #define DSS_SP_SAMPLE_COUNT (66 * SUBFRAMES)
36 #define DSS_SP_FORMULA(a, b, c) ((((a) << 15) + (b) * (c)) + 0x4000) >> 15
38 typedef struct DssSpSubframe
{
40 int32_t combined_pulse_pos
;
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
];
52 typedef struct DssSpContext
{
53 int32_t excitation
[288 + 6];
56 int32_t working_buffer
[SUBFRAMES
][72];
57 int32_t audio_buf
[15];
59 int32_t lpc_filter
[14];
61 int32_t vector_buf
[72];
67 DECLARE_ALIGNED(16, uint8_t, bits
)[DSS_SP_FRAME_SIZE
+
68 AV_INPUT_BUFFER_PADDING_SIZE
];
72 * Used for the coding/decoding of the pulse positions for the MP-MLQ codebook.
74 static const uint32_t dss_sp_combinatorial_table
[PULSE_MAX
][72] = {
89 12, 13, 14, 15, 16, 17,
90 18, 19, 20, 21, 22, 23,
91 24, 25, 26, 27, 28, 29,
92 30, 31, 32, 33, 34, 35,
93 36, 37, 38, 39, 40, 41,
94 42, 43, 44, 45, 46, 47,
95 48, 49, 50, 51, 52, 53,
96 54, 55, 56, 57, 58, 59,
97 60, 61, 62, 63, 64, 65,
98 66, 67, 68, 69, 70, 71 },
100 15, 21, 28, 36, 45, 55,
101 66, 78, 91, 105, 120, 136,
102 153, 171, 190, 210, 231, 253,
103 276, 300, 325, 351, 378, 406,
104 435, 465, 496, 528, 561, 595,
105 630, 666, 703, 741, 780, 820,
106 861, 903, 946, 990, 1035, 1081,
107 1128, 1176, 1225, 1275, 1326, 1378,
108 1431, 1485, 1540, 1596, 1653, 1711,
109 1770, 1830, 1891, 1953, 2016, 2080,
110 2145, 2211, 2278, 2346, 2415, 2485 },
112 20, 35, 56, 84, 120, 165,
113 220, 286, 364, 455, 560, 680,
114 816, 969, 1140, 1330, 1540, 1771,
115 2024, 2300, 2600, 2925, 3276, 3654,
116 4060, 4495, 4960, 5456, 5984, 6545,
117 7140, 7770, 8436, 9139, 9880, 10660,
118 11480, 12341, 13244, 14190, 15180, 16215,
119 17296, 18424, 19600, 20825, 22100, 23426,
120 24804, 26235, 27720, 29260, 30856, 32509,
121 34220, 35990, 37820, 39711, 41664, 43680,
122 45760, 47905, 50116, 52394, 54740, 57155 },
124 15, 35, 70, 126, 210, 330,
125 495, 715, 1001, 1365, 1820, 2380,
126 3060, 3876, 4845, 5985, 7315, 8855,
127 10626, 12650, 14950, 17550, 20475, 23751,
128 27405, 31465, 35960, 40920, 46376, 52360,
129 58905, 66045, 73815, 82251, 91390, 101270,
130 111930, 123410, 135751, 148995, 163185, 178365,
131 194580, 211876, 230300, 249900, 270725, 292825,
132 316251, 341055, 367290, 395010, 424270, 455126,
133 487635, 521855, 557845, 595665, 635376, 677040,
134 720720, 766480, 814385, 864501, 916895, 971635 },
136 6, 21, 56, 126, 252, 462,
137 792, 1287, 2002, 3003, 4368, 6188,
138 8568, 11628, 15504, 20349, 26334, 33649,
139 42504, 53130, 65780, 80730, 98280, 118755,
140 142506, 169911, 201376, 237336, 278256, 324632,
141 376992, 435897, 501942, 575757, 658008, 749398,
142 850668, 962598, 1086008, 1221759, 1370754, 1533939,
143 1712304, 1906884, 2118760, 2349060, 2598960, 2869685,
144 3162510, 3478761, 3819816, 4187106, 4582116, 5006386,
145 5461512, 5949147, 6471002, 7028847, 7624512, 8259888,
146 8936928, 9657648, 10424128, 11238513, 12103014, 13019909 },
148 1, 7, 28, 84, 210, 462,
149 924, 1716, 3003, 5005, 8008, 12376,
150 18564, 27132, 38760, 54264, 74613, 100947,
151 134596, 177100, 230230, 296010, 376740, 475020,
152 593775, 736281, 906192, 1107568, 1344904, 1623160,
153 1947792, 2324784, 2760681, 3262623, 3838380, 4496388,
154 5245786, 6096454, 7059052, 8145060, 9366819, 10737573,
155 12271512, 13983816, 15890700, 18009460, 20358520, 22957480,
156 25827165, 28989675, 32468436, 36288252, 40475358, 45057474,
157 50063860, 55525372, 61474519, 67945521, 74974368, 82598880,
158 90858768, 99795696, 109453344, 119877472, 131115985, 143218999 },
160 0, 1, 8, 36, 120, 330,
161 792, 1716, 3432, 6435, 11440, 19448,
162 31824, 50388, 77520, 116280, 170544, 245157,
163 346104, 480700, 657800, 888030, 1184040, 1560780,
164 2035800, 2629575, 3365856, 4272048, 5379616, 6724520,
165 8347680, 10295472, 12620256, 15380937, 18643560, 22481940,
166 26978328, 32224114, 38320568, 45379620, 53524680, 62891499,
167 73629072, 85900584, 99884400, 115775100, 133784560, 154143080,
168 177100560, 202927725, 231917400, 264385836, 300674088, 341149446,
169 386206920, 436270780, 491796152, 553270671, 621216192, 696190560,
170 778789440, 869648208, 969443904, 1078897248, 1198774720, 1329890705 },
173 static const int16_t dss_sp_filter_cb
[14][32] = {
174 { -32653, -32587, -32515, -32438, -32341, -32216, -32062, -31881,
175 -31665, -31398, -31080, -30724, -30299, -29813, -29248, -28572,
176 -27674, -26439, -24666, -22466, -19433, -16133, -12218, -7783,
177 -2834, 1819, 6544, 11260, 16050, 20220, 24774, 28120 },
179 { -27503, -24509, -20644, -17496, -14187, -11277, -8420, -5595,
180 -3013, -624, 1711, 3880, 5844, 7774, 9739, 11592,
181 13364, 14903, 16426, 17900, 19250, 20586, 21803, 23006,
182 24142, 25249, 26275, 27300, 28359, 29249, 30118, 31183 },
184 { -27827, -24208, -20943, -17781, -14843, -11848, -9066, -6297,
185 -3660, -910, 1918, 5025, 8223, 11649, 15086, 18423,
186 0, 0, 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 0, 0, 0, 0, 0 },
189 { -17128, -11975, -8270, -5123, -2296, 183, 2503, 4707,
190 6798, 8945, 11045, 13239, 15528, 18248, 21115, 24785,
191 0, 0, 0, 0, 0, 0, 0, 0,
192 0, 0, 0, 0, 0, 0, 0, 0 },
194 { -21557, -17280, -14286, -11644, -9268, -7087, -4939, -2831,
195 -691, 1407, 3536, 5721, 8125, 10677, 13721, 17731,
196 0, 0, 0, 0, 0, 0, 0, 0,
197 0, 0, 0, 0, 0, 0, 0, 0 },
199 { -15030, -10377, -7034, -4327, -1900, 364, 2458, 4450,
200 6422, 8374, 10374, 12486, 14714, 16997, 19626, 22954,
201 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0 },
204 { -16155, -12362, -9698, -7460, -5258, -3359, -1547, 219,
205 1916, 3599, 5299, 6994, 8963, 11226, 13716, 16982,
206 0, 0, 0, 0, 0, 0, 0, 0,
207 0, 0, 0, 0, 0, 0, 0, 0 },
209 { -14742, -9848, -6921, -4648, -2769, -1065, 499, 2083,
210 3633, 5219, 6857, 8580, 10410, 12672, 15561, 20101,
211 0, 0, 0, 0, 0, 0, 0, 0,
212 0, 0, 0, 0, 0, 0, 0, 0 },
214 { -11099, -7014, -3855, -1025, 1680, 4544, 7807, 11932,
215 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 0, 0, 0, 0, 0, 0, 0,
217 0, 0, 0, 0, 0, 0, 0, 0 },
219 { -9060, -4570, -1381, 1419, 4034, 6728, 9865, 14149,
220 0, 0, 0, 0, 0, 0, 0, 0,
221 0, 0, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0 },
224 { -12450, -7985, -4596, -1734, 961, 3629, 6865, 11142,
225 0, 0, 0, 0, 0, 0, 0, 0,
226 0, 0, 0, 0, 0, 0, 0, 0,
227 0, 0, 0, 0, 0, 0, 0, 0 },
229 { -11831, -7404, -4010, -1096, 1606, 4291, 7386, 11482,
230 0, 0, 0, 0, 0, 0, 0, 0,
231 0, 0, 0, 0, 0, 0, 0, 0,
232 0, 0, 0, 0, 0, 0, 0, 0 },
234 { -13404, -9250, -5995, -3312, -890, 1594, 4464, 8198,
235 0, 0, 0, 0, 0, 0, 0, 0,
236 0, 0, 0, 0, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, 0, 0 },
239 { -11239, -7220, -4040, -1406, 971, 3321, 6006, 9697,
240 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0 },
245 static const uint16_t dss_sp_fixed_cb_gain
[64] = {
246 0, 4, 8, 13, 17, 22, 26, 31,
247 35, 40, 44, 48, 53, 58, 63, 69,
248 76, 83, 91, 99, 109, 119, 130, 142,
249 155, 170, 185, 203, 222, 242, 265, 290,
250 317, 346, 378, 414, 452, 494, 540, 591,
251 646, 706, 771, 843, 922, 1007, 1101, 1204,
252 1316, 1438, 1572, 1719, 1879, 2053, 2244, 2453,
253 2682, 2931, 3204, 3502, 3828, 4184, 4574, 5000,
256 static const int16_t dss_sp_pulse_val
[8] = {
257 -31182, -22273, -13364, -4455, 4455, 13364, 22273, 31182
260 static const uint16_t binary_decreasing_array
[] = {
261 32767, 16384, 8192, 4096, 2048, 1024, 512, 256,
262 128, 64, 32, 16, 8, 4, 2,
265 static const uint16_t dss_sp_unc_decreasing_array
[] = {
266 32767, 26214, 20972, 16777, 13422, 10737, 8590, 6872,
267 5498, 4398, 3518, 2815, 2252, 1801, 1441,
270 static const uint16_t dss_sp_adaptive_gain
[] = {
271 102, 231, 360, 488, 617, 746, 875, 1004,
272 1133, 1261, 1390, 1519, 1648, 1777, 1905, 2034,
273 2163, 2292, 2421, 2550, 2678, 2807, 2936, 3065,
274 3194, 3323, 3451, 3580, 3709, 3838, 3967, 4096,
277 static const int32_t dss_sp_sinc
[67] = {
278 262, 293, 323, 348, 356, 336, 269, 139,
279 -67, -358, -733, -1178, -1668, -2162, -2607, -2940,
280 -3090, -2986, -2562, -1760, -541, 1110, 3187, 5651,
281 8435, 11446, 14568, 17670, 20611, 23251, 25460, 27125,
283 27125, 25460, 23251, 20611, 17670, 14568, 11446, 8435,
284 5651, 3187, 1110, -541, -1760, -2562, -2986, -3090,
285 -2940, -2607, -2162, -1668, -1178, -733, -358, -67,
286 139, 269, 336, 356, 348, 323, 293, 262,
289 static av_cold
int dss_sp_decode_init(AVCodecContext
*avctx
)
291 DssSpContext
*p
= avctx
->priv_data
;
292 avctx
->channel_layout
= AV_CH_LAYOUT_MONO
;
293 avctx
->sample_fmt
= AV_SAMPLE_FMT_S16
;
295 avctx
->sample_rate
= 11025;
297 memset(p
->history
, 0, sizeof(p
->history
));
298 p
->pulse_dec_mode
= 1;
303 static void dss_sp_unpack_coeffs(DssSpContext
*p
, const uint8_t *src
)
306 DssSpFrame
*fparam
= &p
->fparam
;
309 uint32_t combined_pitch
;
313 for (i
= 0; i
< DSS_SP_FRAME_SIZE
; i
+= 2) {
314 p
->bits
[i
] = src
[i
+ 1];
315 p
->bits
[i
+ 1] = src
[i
];
318 bitstream_init8(&bc
, p
->bits
, DSS_SP_FRAME_SIZE
);
320 for (i
= 0; i
< 2; i
++)
321 fparam
->filter_idx
[i
] = bitstream_read(&bc
, 5);
323 fparam
->filter_idx
[i
] = bitstream_read(&bc
, 4);
325 fparam
->filter_idx
[i
] = bitstream_read(&bc
, 3);
327 for (subframe_idx
= 0; subframe_idx
< 4; subframe_idx
++) {
328 fparam
->sf_adaptive_gain
[subframe_idx
] = bitstream_read(&bc
, 5);
330 fparam
->sf
[subframe_idx
].combined_pulse_pos
= bitstream_read(&bc
, 31);
332 fparam
->sf
[subframe_idx
].gain
= bitstream_read(&bc
, 6);
334 for (i
= 0; i
< 7; i
++)
335 fparam
->sf
[subframe_idx
].pulse_val
[i
] = bitstream_read(&bc
, 3);
338 for (subframe_idx
= 0; subframe_idx
< 4; subframe_idx
++) {
339 unsigned int C72_binomials
[PULSE_MAX
] = {
340 72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
343 unsigned int combined_pulse_pos
=
344 fparam
->sf
[subframe_idx
].combined_pulse_pos
;
347 if (combined_pulse_pos
< C72_binomials
[PULSE_MAX
- 1]) {
348 if (p
->pulse_dec_mode
) {
349 int pulse
, pulse_idx
;
350 pulse
= PULSE_MAX
- 1;
353 fparam
->sf
[subframe_idx
].combined_pulse_pos
;
355 /* this part seems to be close to g723.1 gen_fcb_excitation()
358 /* TODO: what is 7? size of subframe? */
359 for (i
= 0; i
< 7; i
++) {
362 dss_sp_combinatorial_table
[pulse
][pulse_idx
];
365 combined_pulse_pos
-=
366 dss_sp_combinatorial_table
[pulse
][pulse_idx
];
368 fparam
->sf
[subframe_idx
].pulse_pos
[i
] = pulse_idx
;
372 p
->pulse_dec_mode
= 0;
374 /* why do we need this? */
375 fparam
->sf
[subframe_idx
].pulse_pos
[6] = 0;
377 for (i
= 71; i
>= 0; i
--) {
378 if (C72_binomials
[index
] <= combined_pulse_pos
) {
379 combined_pulse_pos
-= C72_binomials
[index
];
381 fparam
->sf
[subframe_idx
].pulse_pos
[(index
^ 7) - 1] = i
;
390 for (a
= 0; a
< index
; a
++)
391 C72_binomials
[a
+ 1] -= C72_binomials
[a
];
397 combined_pitch
= bitstream_read(&bc
, 24);
399 fparam
->pitch_lag
[0] = (combined_pitch
% 151) + 36;
401 combined_pitch
/= 151;
403 for (i
= 1; i
< SUBFRAMES
; i
++) {
404 fparam
->pitch_lag
[i
] = combined_pitch
% 48;
405 combined_pitch
/= 48;
408 pitch_lag
= fparam
->pitch_lag
[0];
409 for (i
= 1; i
< SUBFRAMES
; i
++) {
410 if (pitch_lag
> 162) {
411 fparam
->pitch_lag
[i
] += 162 - 23;
413 tmp
= pitch_lag
- 23;
416 fparam
->pitch_lag
[i
] += tmp
;
418 pitch_lag
= fparam
->pitch_lag
[i
];
422 static void dss_sp_unpack_filter(DssSpContext
*p
)
426 for (i
= 0; i
< 14; i
++)
427 p
->lpc_filter
[i
] = dss_sp_filter_cb
[i
][p
->fparam
.filter_idx
[i
]];
430 static void dss_sp_convert_coeffs(int32_t *lpc_filter
, int32_t *coeffs
)
435 for (a
= 0; a
< 14; a
++) {
437 coeffs
[a_plus
] = lpc_filter
[a
] >> 2;
438 if (a_plus
/ 2 >= 1) {
439 for (i
= 1; i
<= a_plus
/ 2; i
++) {
440 int coeff_1
, coeff_2
, tmp
;
443 coeff_2
= coeffs
[a_plus
- i
];
445 tmp
= DSS_SP_FORMULA(coeff_1
, lpc_filter
[a
], coeff_2
);
446 coeffs
[i
] = av_clip_int16(tmp
);
448 tmp
= DSS_SP_FORMULA(coeff_2
, lpc_filter
[a
], coeff_1
);
449 coeffs
[a_plus
- i
] = av_clip_int16(tmp
);
455 static void dss_sp_add_pulses(int32_t *vector_buf
,
456 const struct DssSpSubframe
*sf
)
460 for (i
= 0; i
< 7; i
++)
461 vector_buf
[sf
->pulse_pos
[i
]] += (dss_sp_fixed_cb_gain
[sf
->gain
] *
462 dss_sp_pulse_val
[sf
->pulse_val
[i
]] +
466 static void dss_sp_gen_exc(int32_t *vector
, int32_t *prev_exc
,
467 int pitch_lag
, int gain
)
471 /* do we actually need this check? we can use just [a3 - i % a3]
474 for (i
= 0; i
< 72; i
++)
475 vector
[i
] = prev_exc
[pitch_lag
- i
% pitch_lag
];
477 for (i
= 0; i
< 72; i
++)
478 vector
[i
] = prev_exc
[pitch_lag
- i
];
480 for (i
= 0; i
< 72; i
++) {
481 int tmp
= gain
* vector
[i
] >> 11;
482 vector
[i
] = av_clip_int16(tmp
);
486 static void dss_sp_scale_vector(int32_t *vec
, int bits
, int size
)
491 for (i
= 0; i
< size
; i
++)
492 vec
[i
] = vec
[i
] >> -bits
;
494 for (i
= 0; i
< size
; i
++)
495 vec
[i
] = vec
[i
] << bits
;
498 static void dss_sp_update_buf(int32_t *hist
, int32_t *vector
)
502 for (i
= 114; i
> 0; i
--)
503 vector
[i
+ 72] = vector
[i
];
505 for (i
= 0; i
< 72; i
++)
506 vector
[72 - i
] = hist
[i
];
509 static void dss_sp_shift_sq_sub(const int32_t *filter_buf
,
510 int32_t *error_buf
, int32_t *dst
)
514 for (a
= 0; a
< 72; a
++) {
517 tmp
= dst
[a
] * filter_buf
[0];
519 for (i
= 14; i
> 0; i
--)
520 tmp
-= error_buf
[i
] * filter_buf
[i
];
522 for (i
= 14; i
> 0; i
--)
523 error_buf
[i
] = error_buf
[i
- 1];
525 tmp
= (tmp
+ 4096) >> 13;
529 dst
[a
] = av_clip_int16(tmp
);
533 static void dss_sp_shift_sq_add(const int32_t *filter_buf
, int32_t *audio_buf
,
538 for (a
= 0; a
< 72; a
++) {
541 audio_buf
[0] = dst
[a
];
543 for (i
= 14; i
>= 0; i
--)
544 tmp
+= audio_buf
[i
] * filter_buf
[i
];
546 for (i
= 14; i
> 0; i
--)
547 audio_buf
[i
] = audio_buf
[i
- 1];
549 tmp
= (tmp
+ 4096) >> 13;
551 dst
[a
] = av_clip_int16(tmp
);
555 static void dss_sp_vec_mult(const int32_t *src
, int32_t *dst
,
562 for (i
= 1; i
< 15; i
++)
563 dst
[i
] = (src
[i
] * mult
[i
] + 0x4000) >> 15;
566 static int dss_sp_get_normalize_bits(int32_t *vector_buf
, int16_t size
)
573 for (i
= 0; i
< size
; i
++)
574 val
|= FFABS(vector_buf
[i
]);
576 for (max_val
= 0; val
<= 0x4000; ++max_val
)
581 static int dss_sp_vector_sum(DssSpContext
*p
, int size
)
584 for (i
= 0; i
< size
; i
++)
585 sum
+= FFABS(p
->vector_buf
[i
]);
589 static void dss_sp_sf_synthesis(DssSpContext
*p
, int32_t lpc_filter
,
590 int32_t *dst
, int size
)
594 int bias
, vsum_2
= 0, vsum_1
= 0, v36
, normalize_bits
;
598 vsum_1
= dss_sp_vector_sum(p
, size
);
600 if (vsum_1
> 0xFFFFF)
604 normalize_bits
= dss_sp_get_normalize_bits(p
->vector_buf
, size
);
606 dss_sp_scale_vector(p
->vector_buf
, normalize_bits
- 3, size
);
607 dss_sp_scale_vector(p
->audio_buf
, normalize_bits
, 15);
608 dss_sp_scale_vector(p
->err_buf1
, normalize_bits
, 15);
610 v36
= p
->err_buf1
[1];
612 dss_sp_vec_mult(p
->filter
, tmp_buf
, binary_decreasing_array
);
613 dss_sp_shift_sq_add(tmp_buf
, p
->audio_buf
, p
->vector_buf
);
615 dss_sp_vec_mult(p
->filter
, tmp_buf
, dss_sp_unc_decreasing_array
);
616 dss_sp_shift_sq_sub(tmp_buf
, p
->err_buf1
, p
->vector_buf
);
618 /* lpc_filter can be negative */
619 lpc_filter
= lpc_filter
>> 1;
624 for (i
= size
- 1; i
> 0; i
--) {
625 tmp
= DSS_SP_FORMULA(p
->vector_buf
[i
], lpc_filter
,
626 p
->vector_buf
[i
- 1]);
627 p
->vector_buf
[i
] = av_clip_int16(tmp
);
631 tmp
= DSS_SP_FORMULA(p
->vector_buf
[0], lpc_filter
, v36
);
632 p
->vector_buf
[0] = av_clip_int16(tmp
);
634 dss_sp_scale_vector(p
->vector_buf
, -normalize_bits
, size
);
635 dss_sp_scale_vector(p
->audio_buf
, -normalize_bits
, 15);
636 dss_sp_scale_vector(p
->err_buf1
, -normalize_bits
, 15);
639 vsum_2
= dss_sp_vector_sum(p
, size
);
642 tmp
= (vsum_1
<< 11) / vsum_2
;
646 bias
= 409 * tmp
>> 15 << 15;
647 tmp
= (bias
+ 32358 * p
->noise_state
) >> 15;
648 noise
[0] = av_clip_int16(tmp
);
650 for (i
= 1; i
< size
; i
++) {
651 tmp
= (bias
+ 32358 * noise
[i
- 1]) >> 15;
652 noise
[i
] = av_clip_int16(tmp
);
655 p
->noise_state
= noise
[size
- 1];
656 for (i
= 0; i
< size
; i
++) {
657 tmp
= (p
->vector_buf
[i
] * noise
[i
]) >> 11;
658 dst
[i
] = av_clip_int16(tmp
);
662 static void dss_sp_update_state(DssSpContext
*p
, int32_t *dst
)
664 int i
, offset
= 6, counter
= 0, a
= 0;
666 for (i
= 0; i
< 6; i
++)
667 p
->excitation
[i
] = p
->excitation
[288 + i
];
669 for (i
= 0; i
< 72 * SUBFRAMES
; i
++)
670 p
->excitation
[6 + i
] = dst
[i
];
675 for (i
= 0; i
< 6; i
++)
676 tmp
+= p
->excitation
[offset
--] * dss_sp_sinc
[a
+ i
* 11];
681 dst
[counter
] = av_clip_int16(tmp
);
688 } while (offset
< FF_ARRAY_ELEMS(p
->excitation
));
691 static void dss_sp_32to16bit(int16_t *dst
, int32_t *src
, int size
)
695 for (i
= 0; i
< size
; i
++)
696 dst
[i
] = av_clip_int16(src
[i
]);
699 static int dss_sp_decode_one_frame(DssSpContext
*p
,
700 int16_t *abuf_dst
, const uint8_t *abuf_src
)
704 dss_sp_unpack_coeffs(p
, abuf_src
);
706 dss_sp_unpack_filter(p
);
708 dss_sp_convert_coeffs(p
->lpc_filter
, p
->filter
);
710 for (j
= 0; j
< SUBFRAMES
; j
++) {
711 dss_sp_gen_exc(p
->vector_buf
, p
->history
,
712 p
->fparam
.pitch_lag
[j
],
713 dss_sp_adaptive_gain
[p
->fparam
.sf_adaptive_gain
[j
]]);
715 dss_sp_add_pulses(p
->vector_buf
, &p
->fparam
.sf
[j
]);
717 dss_sp_update_buf(p
->vector_buf
, p
->history
);
719 for (i
= 0; i
< 72; i
++)
720 p
->vector_buf
[i
] = p
->history
[72 - i
];
722 dss_sp_shift_sq_sub(p
->filter
,
723 p
->err_buf2
, p
->vector_buf
);
725 dss_sp_sf_synthesis(p
, p
->lpc_filter
[0],
726 &p
->working_buffer
[j
][0], 72);
729 dss_sp_update_state(p
, &p
->working_buffer
[0][0]);
731 dss_sp_32to16bit(abuf_dst
,
732 &p
->working_buffer
[0][0], 264);
736 static int dss_sp_decode_frame(AVCodecContext
*avctx
, void *data
,
737 int *got_frame_ptr
, AVPacket
*avpkt
)
739 DssSpContext
*p
= avctx
->priv_data
;
740 AVFrame
*frame
= data
;
741 const uint8_t *buf
= avpkt
->data
;
742 int buf_size
= avpkt
->size
;
747 if (buf_size
< DSS_SP_FRAME_SIZE
) {
749 av_log(avctx
, AV_LOG_WARNING
,
750 "Expected %d bytes, got %d - skipping packet.\n",
751 DSS_SP_FRAME_SIZE
, buf_size
);
753 return AVERROR_INVALIDDATA
;
756 frame
->nb_samples
= DSS_SP_SAMPLE_COUNT
;
757 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0) {
758 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed.\n");
762 out
= (int16_t *)frame
->data
[0];
764 dss_sp_decode_one_frame(p
, out
, buf
);
768 return DSS_SP_FRAME_SIZE
;
771 AVCodec ff_dss_sp_decoder
= {
773 .long_name
= NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
774 .type
= AVMEDIA_TYPE_AUDIO
,
775 .id
= AV_CODEC_ID_DSS_SP
,
776 .priv_data_size
= sizeof(DssSpContext
),
777 .init
= dss_sp_decode_init
,
778 .decode
= dss_sp_decode_frame
,
779 .capabilities
= AV_CODEC_CAP_DR1
,