FFmpeg
dss_sp.c
Go to the documentation of this file.
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 
23 #include "libavutil/common.h"
24 #include "libavutil/mem_internal.h"
25 #include "libavutil/opt.h"
26 
27 #include "avcodec.h"
28 #include "codec_internal.h"
29 #include "get_bits.h"
30 #include "internal.h"
31 
32 #define SUBFRAMES 4
33 #define PULSE_MAX 8
34 
35 #define DSS_SP_FRAME_SIZE 42
36 #define DSS_SP_SAMPLE_COUNT (66 * SUBFRAMES)
37 #define DSS_SP_FORMULA(a, b, c) ((int)((((a) * (1 << 15)) + (b) * (unsigned)(c)) + 0x4000) >> 15)
38 
39 typedef struct DssSpSubframe {
40  int16_t gain;
42  int16_t pulse_pos[7];
43  int16_t pulse_val[7];
45 
46 typedef struct DssSpFrame {
47  int16_t filter_idx[14];
49  int16_t pitch_lag[SUBFRAMES];
51 } DssSpFrame;
52 
53 typedef struct DssSpContext {
55  int32_t excitation[288 + 6];
66 
68 
69  DECLARE_ALIGNED(16, uint8_t, bits)[DSS_SP_FRAME_SIZE +
71 } DssSpContext;
72 
73 /*
74  * Used for the coding/decoding of the pulse positions for the MP-MLQ codebook.
75  */
76 static const uint32_t dss_sp_combinatorial_table[PULSE_MAX][72] = {
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, 0, 0, 0, 0, 0 },
89  { 0, 1, 2, 3, 4, 5,
90  6, 7, 8, 9, 10, 11,
91  12, 13, 14, 15, 16, 17,
92  18, 19, 20, 21, 22, 23,
93  24, 25, 26, 27, 28, 29,
94  30, 31, 32, 33, 34, 35,
95  36, 37, 38, 39, 40, 41,
96  42, 43, 44, 45, 46, 47,
97  48, 49, 50, 51, 52, 53,
98  54, 55, 56, 57, 58, 59,
99  60, 61, 62, 63, 64, 65,
100  66, 67, 68, 69, 70, 71 },
101  { 0, 0, 1, 3, 6, 10,
102  15, 21, 28, 36, 45, 55,
103  66, 78, 91, 105, 120, 136,
104  153, 171, 190, 210, 231, 253,
105  276, 300, 325, 351, 378, 406,
106  435, 465, 496, 528, 561, 595,
107  630, 666, 703, 741, 780, 820,
108  861, 903, 946, 990, 1035, 1081,
109  1128, 1176, 1225, 1275, 1326, 1378,
110  1431, 1485, 1540, 1596, 1653, 1711,
111  1770, 1830, 1891, 1953, 2016, 2080,
112  2145, 2211, 2278, 2346, 2415, 2485 },
113  { 0, 0, 0, 1, 4, 10,
114  20, 35, 56, 84, 120, 165,
115  220, 286, 364, 455, 560, 680,
116  816, 969, 1140, 1330, 1540, 1771,
117  2024, 2300, 2600, 2925, 3276, 3654,
118  4060, 4495, 4960, 5456, 5984, 6545,
119  7140, 7770, 8436, 9139, 9880, 10660,
120  11480, 12341, 13244, 14190, 15180, 16215,
121  17296, 18424, 19600, 20825, 22100, 23426,
122  24804, 26235, 27720, 29260, 30856, 32509,
123  34220, 35990, 37820, 39711, 41664, 43680,
124  45760, 47905, 50116, 52394, 54740, 57155 },
125  { 0, 0, 0, 0, 1, 5,
126  15, 35, 70, 126, 210, 330,
127  495, 715, 1001, 1365, 1820, 2380,
128  3060, 3876, 4845, 5985, 7315, 8855,
129  10626, 12650, 14950, 17550, 20475, 23751,
130  27405, 31465, 35960, 40920, 46376, 52360,
131  58905, 66045, 73815, 82251, 91390, 101270,
132  111930, 123410, 135751, 148995, 163185, 178365,
133  194580, 211876, 230300, 249900, 270725, 292825,
134  316251, 341055, 367290, 395010, 424270, 455126,
135  487635, 521855, 557845, 595665, 635376, 677040,
136  720720, 766480, 814385, 864501, 916895, 971635 },
137  { 0, 0, 0, 0, 0, 1,
138  6, 21, 56, 126, 252, 462,
139  792, 1287, 2002, 3003, 4368, 6188,
140  8568, 11628, 15504, 20349, 26334, 33649,
141  42504, 53130, 65780, 80730, 98280, 118755,
142  142506, 169911, 201376, 237336, 278256, 324632,
143  376992, 435897, 501942, 575757, 658008, 749398,
144  850668, 962598, 1086008, 1221759, 1370754, 1533939,
145  1712304, 1906884, 2118760, 2349060, 2598960, 2869685,
146  3162510, 3478761, 3819816, 4187106, 4582116, 5006386,
147  5461512, 5949147, 6471002, 7028847, 7624512, 8259888,
148  8936928, 9657648, 10424128, 11238513, 12103014, 13019909 },
149  { 0, 0, 0, 0, 0, 0,
150  1, 7, 28, 84, 210, 462,
151  924, 1716, 3003, 5005, 8008, 12376,
152  18564, 27132, 38760, 54264, 74613, 100947,
153  134596, 177100, 230230, 296010, 376740, 475020,
154  593775, 736281, 906192, 1107568, 1344904, 1623160,
155  1947792, 2324784, 2760681, 3262623, 3838380, 4496388,
156  5245786, 6096454, 7059052, 8145060, 9366819, 10737573,
157  12271512, 13983816, 15890700, 18009460, 20358520, 22957480,
158  25827165, 28989675, 32468436, 36288252, 40475358, 45057474,
159  50063860, 55525372, 61474519, 67945521, 74974368, 82598880,
160  90858768, 99795696, 109453344, 119877472, 131115985, 143218999 },
161  { 0, 0, 0, 0, 0, 0,
162  0, 1, 8, 36, 120, 330,
163  792, 1716, 3432, 6435, 11440, 19448,
164  31824, 50388, 77520, 116280, 170544, 245157,
165  346104, 480700, 657800, 888030, 1184040, 1560780,
166  2035800, 2629575, 3365856, 4272048, 5379616, 6724520,
167  8347680, 10295472, 12620256, 15380937, 18643560, 22481940,
168  26978328, 32224114, 38320568, 45379620, 53524680, 62891499,
169  73629072, 85900584, 99884400, 115775100, 133784560, 154143080,
170  177100560, 202927725, 231917400, 264385836, 300674088, 341149446,
171  386206920, 436270780, 491796152, 553270671, 621216192, 696190560,
172  778789440, 869648208, 969443904, 1078897248, 1198774720, 1329890705 },
173 };
174 
175 static const int16_t dss_sp_filter_cb[14][32] = {
176  { -32653, -32587, -32515, -32438, -32341, -32216, -32062, -31881,
177  -31665, -31398, -31080, -30724, -30299, -29813, -29248, -28572,
178  -27674, -26439, -24666, -22466, -19433, -16133, -12218, -7783,
179  -2834, 1819, 6544, 11260, 16050, 20220, 24774, 28120 },
180 
181  { -27503, -24509, -20644, -17496, -14187, -11277, -8420, -5595,
182  -3013, -624, 1711, 3880, 5844, 7774, 9739, 11592,
183  13364, 14903, 16426, 17900, 19250, 20586, 21803, 23006,
184  24142, 25249, 26275, 27300, 28359, 29249, 30118, 31183 },
185 
186  { -27827, -24208, -20943, -17781, -14843, -11848, -9066, -6297,
187  -3660, -910, 1918, 5025, 8223, 11649, 15086, 18423,
188  0, 0, 0, 0, 0, 0, 0, 0,
189  0, 0, 0, 0, 0, 0, 0, 0 },
190 
191  { -17128, -11975, -8270, -5123, -2296, 183, 2503, 4707,
192  6798, 8945, 11045, 13239, 15528, 18248, 21115, 24785,
193  0, 0, 0, 0, 0, 0, 0, 0,
194  0, 0, 0, 0, 0, 0, 0, 0 },
195 
196  { -21557, -17280, -14286, -11644, -9268, -7087, -4939, -2831,
197  -691, 1407, 3536, 5721, 8125, 10677, 13721, 17731,
198  0, 0, 0, 0, 0, 0, 0, 0,
199  0, 0, 0, 0, 0, 0, 0, 0 },
200 
201  { -15030, -10377, -7034, -4327, -1900, 364, 2458, 4450,
202  6422, 8374, 10374, 12486, 14714, 16997, 19626, 22954,
203  0, 0, 0, 0, 0, 0, 0, 0,
204  0, 0, 0, 0, 0, 0, 0, 0 },
205 
206  { -16155, -12362, -9698, -7460, -5258, -3359, -1547, 219,
207  1916, 3599, 5299, 6994, 8963, 11226, 13716, 16982,
208  0, 0, 0, 0, 0, 0, 0, 0,
209  0, 0, 0, 0, 0, 0, 0, 0 },
210 
211  { -14742, -9848, -6921, -4648, -2769, -1065, 499, 2083,
212  3633, 5219, 6857, 8580, 10410, 12672, 15561, 20101,
213  0, 0, 0, 0, 0, 0, 0, 0,
214  0, 0, 0, 0, 0, 0, 0, 0 },
215 
216  { -11099, -7014, -3855, -1025, 1680, 4544, 7807, 11932,
217  0, 0, 0, 0, 0, 0, 0, 0,
218  0, 0, 0, 0, 0, 0, 0, 0,
219  0, 0, 0, 0, 0, 0, 0, 0 },
220 
221  { -9060, -4570, -1381, 1419, 4034, 6728, 9865, 14149,
222  0, 0, 0, 0, 0, 0, 0, 0,
223  0, 0, 0, 0, 0, 0, 0, 0,
224  0, 0, 0, 0, 0, 0, 0, 0 },
225 
226  { -12450, -7985, -4596, -1734, 961, 3629, 6865, 11142,
227  0, 0, 0, 0, 0, 0, 0, 0,
228  0, 0, 0, 0, 0, 0, 0, 0,
229  0, 0, 0, 0, 0, 0, 0, 0 },
230 
231  { -11831, -7404, -4010, -1096, 1606, 4291, 7386, 11482,
232  0, 0, 0, 0, 0, 0, 0, 0,
233  0, 0, 0, 0, 0, 0, 0, 0,
234  0, 0, 0, 0, 0, 0, 0, 0 },
235 
236  { -13404, -9250, -5995, -3312, -890, 1594, 4464, 8198,
237  0, 0, 0, 0, 0, 0, 0, 0,
238  0, 0, 0, 0, 0, 0, 0, 0,
239  0, 0, 0, 0, 0, 0, 0, 0 },
240 
241  { -11239, -7220, -4040, -1406, 971, 3321, 6006, 9697,
242  0, 0, 0, 0, 0, 0, 0, 0,
243  0, 0, 0, 0, 0, 0, 0, 0,
244  0, 0, 0, 0, 0, 0, 0, 0 },
245 };
246 
247 static const uint16_t dss_sp_fixed_cb_gain[64] = {
248  0, 4, 8, 13, 17, 22, 26, 31,
249  35, 40, 44, 48, 53, 58, 63, 69,
250  76, 83, 91, 99, 109, 119, 130, 142,
251  155, 170, 185, 203, 222, 242, 265, 290,
252  317, 346, 378, 414, 452, 494, 540, 591,
253  646, 706, 771, 843, 922, 1007, 1101, 1204,
254  1316, 1438, 1572, 1719, 1879, 2053, 2244, 2453,
255  2682, 2931, 3204, 3502, 3828, 4184, 4574, 5000,
256 };
257 
258 static const int16_t dss_sp_pulse_val[8] = {
259  -31182, -22273, -13364, -4455, 4455, 13364, 22273, 31182
260 };
261 
262 static const uint16_t binary_decreasing_array[] = {
263  32767, 16384, 8192, 4096, 2048, 1024, 512, 256,
264  128, 64, 32, 16, 8, 4, 2,
265 };
266 
267 static const uint16_t dss_sp_unc_decreasing_array[] = {
268  32767, 26214, 20972, 16777, 13422, 10737, 8590, 6872,
269  5498, 4398, 3518, 2815, 2252, 1801, 1441,
270 };
271 
272 static const uint16_t dss_sp_adaptive_gain[] = {
273  102, 231, 360, 488, 617, 746, 875, 1004,
274  1133, 1261, 1390, 1519, 1648, 1777, 1905, 2034,
275  2163, 2292, 2421, 2550, 2678, 2807, 2936, 3065,
276  3194, 3323, 3451, 3580, 3709, 3838, 3967, 4096,
277 };
278 
279 static const int32_t dss_sp_sinc[67] = {
280  262, 293, 323, 348, 356, 336, 269, 139,
281  -67, -358, -733, -1178, -1668, -2162, -2607, -2940,
282  -3090, -2986, -2562, -1760, -541, 1110, 3187, 5651,
283  8435, 11446, 14568, 17670, 20611, 23251, 25460, 27125,
284  28160, 28512, 28160,
285  27125, 25460, 23251, 20611, 17670, 14568, 11446, 8435,
286  5651, 3187, 1110, -541, -1760, -2562, -2986, -3090,
287  -2940, -2607, -2162, -1668, -1178, -733, -358, -67,
288  139, 269, 336, 356, 348, 323, 293, 262,
289 };
290 
292 {
293  DssSpContext *p = avctx->priv_data;
294  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
295  avctx->sample_rate = 11025;
298 
299  p->pulse_dec_mode = 1;
300  p->avctx = avctx;
301 
302  return 0;
303 }
304 
305 static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
306 {
307  GetBitContext gb;
308  DssSpFrame *fparam = &p->fparam;
309  int i;
310  int subframe_idx;
311  uint32_t combined_pitch;
312  uint32_t tmp;
313  uint32_t pitch_lag;
314 
315  for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
316  p->bits[i] = src[i + 1];
317  p->bits[i + 1] = src[i];
318  }
319 
320  init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);
321 
322  for (i = 0; i < 2; i++)
323  fparam->filter_idx[i] = get_bits(&gb, 5);
324  for (; i < 8; i++)
325  fparam->filter_idx[i] = get_bits(&gb, 4);
326  for (; i < 14; i++)
327  fparam->filter_idx[i] = get_bits(&gb, 3);
328 
329  for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
330  fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);
331 
332  fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);
333 
334  fparam->sf[subframe_idx].gain = get_bits(&gb, 6);
335 
336  for (i = 0; i < 7; i++)
337  fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
338  }
339 
340  for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
341  unsigned int C72_binomials[PULSE_MAX] = {
342  72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
343  3379081753
344  };
345  unsigned int combined_pulse_pos =
346  fparam->sf[subframe_idx].combined_pulse_pos;
347  int index = 6;
348 
349  if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
350  if (p->pulse_dec_mode) {
351  int pulse, pulse_idx;
352  pulse = PULSE_MAX - 1;
353  pulse_idx = 71;
354  combined_pulse_pos =
355  fparam->sf[subframe_idx].combined_pulse_pos;
356 
357  /* this part seems to be close to g723.1 gen_fcb_excitation()
358  * RATE_6300 */
359 
360  /* TODO: what is 7? size of subframe? */
361  for (i = 0; i < 7; i++) {
362  for (;
363  combined_pulse_pos <
364  dss_sp_combinatorial_table[pulse][pulse_idx];
365  --pulse_idx)
366  ;
367  combined_pulse_pos -=
368  dss_sp_combinatorial_table[pulse][pulse_idx];
369  pulse--;
370  fparam->sf[subframe_idx].pulse_pos[i] = pulse_idx;
371  }
372  }
373  } else {
374  p->pulse_dec_mode = 0;
375 
376  /* why do we need this? */
377  fparam->sf[subframe_idx].pulse_pos[6] = 0;
378 
379  for (i = 71; i >= 0; i--) {
380  if (C72_binomials[index] <= combined_pulse_pos) {
381  combined_pulse_pos -= C72_binomials[index];
382 
383  fparam->sf[subframe_idx].pulse_pos[6 - index] = i;
384 
385  if (!index)
386  break;
387  --index;
388  }
389  --C72_binomials[0];
390  if (index) {
391  int a;
392  for (a = 0; a < index; a++)
393  C72_binomials[a + 1] -= C72_binomials[a];
394  }
395  }
396  }
397  }
398 
399  combined_pitch = get_bits(&gb, 24);
400 
401  fparam->pitch_lag[0] = (combined_pitch % 151) + 36;
402 
403  combined_pitch /= 151;
404 
405  for (i = 1; i < SUBFRAMES - 1; i++) {
406  fparam->pitch_lag[i] = combined_pitch % 48;
407  combined_pitch /= 48;
408  }
409  if (combined_pitch > 47) {
410  av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
411  combined_pitch = 0;
412  }
413  fparam->pitch_lag[i] = combined_pitch;
414 
415  pitch_lag = fparam->pitch_lag[0];
416  for (i = 1; i < SUBFRAMES; i++) {
417  if (pitch_lag > 162) {
418  fparam->pitch_lag[i] += 162 - 23;
419  } else {
420  tmp = pitch_lag - 23;
421  if (tmp < 36)
422  tmp = 36;
423  fparam->pitch_lag[i] += tmp;
424  }
425  pitch_lag = fparam->pitch_lag[i];
426  }
427 }
428 
430 {
431  int i;
432 
433  for (i = 0; i < 14; i++)
435 }
436 
437 static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
438 {
439  int a, a_plus, i;
440 
441  coeffs[0] = 0x2000;
442  for (a = 0; a < 14; a++) {
443  a_plus = a + 1;
444  coeffs[a_plus] = lpc_filter[a] >> 2;
445  if (a_plus / 2 >= 1) {
446  for (i = 1; i <= a_plus / 2; i++) {
447  int coeff_1, coeff_2, tmp;
448 
449  coeff_1 = coeffs[i];
450  coeff_2 = coeffs[a_plus - i];
451 
452  tmp = DSS_SP_FORMULA(coeff_1, lpc_filter[a], coeff_2);
453  coeffs[i] = av_clip_int16(tmp);
454 
455  tmp = DSS_SP_FORMULA(coeff_2, lpc_filter[a], coeff_1);
456  coeffs[a_plus - i] = av_clip_int16(tmp);
457  }
458  }
459  }
460 }
461 
462 static void dss_sp_add_pulses(int32_t *vector_buf,
463  const struct DssSpSubframe *sf)
464 {
465  int i;
466 
467  for (i = 0; i < 7; i++)
468  vector_buf[sf->pulse_pos[i]] += (dss_sp_fixed_cb_gain[sf->gain] *
470  0x4000) >> 15;
471 }
472 
473 static void dss_sp_gen_exc(int32_t *vector, int32_t *prev_exc,
474  int pitch_lag, int gain)
475 {
476  int i;
477 
478  /* do we actually need this check? we can use just [a3 - i % a3]
479  * for both cases */
480  if (pitch_lag < 72)
481  for (i = 0; i < 72; i++)
482  vector[i] = prev_exc[pitch_lag - i % pitch_lag];
483  else
484  for (i = 0; i < 72; i++)
485  vector[i] = prev_exc[pitch_lag - i];
486 
487  for (i = 0; i < 72; i++) {
488  int tmp = gain * vector[i] >> 11;
489  vector[i] = av_clip_int16(tmp);
490  }
491 }
492 
493 static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
494 {
495  int i;
496 
497  if (bits < 0)
498  for (i = 0; i < size; i++)
499  vec[i] = vec[i] >> -bits;
500  else
501  for (i = 0; i < size; i++)
502  vec[i] = vec[i] * (1 << bits);
503 }
504 
505 static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
506 {
507  int i;
508 
509  for (i = 114; i > 0; i--)
510  vector[i + 72] = vector[i];
511 
512  for (i = 0; i < 72; i++)
513  vector[72 - i] = hist[i];
514 }
515 
516 static void dss_sp_shift_sq_sub(const int32_t *filter_buf,
517  int32_t *error_buf, int32_t *dst)
518 {
519  int a;
520 
521  for (a = 0; a < 72; a++) {
522  int i, tmp;
523 
524  tmp = dst[a] * filter_buf[0];
525 
526  for (i = 14; i > 0; i--)
527  tmp -= error_buf[i] * (unsigned)filter_buf[i];
528 
529  for (i = 14; i > 0; i--)
530  error_buf[i] = error_buf[i - 1];
531 
532  tmp = (int)(tmp + 4096U) >> 13;
533 
534  error_buf[1] = tmp;
535 
536  dst[a] = av_clip_int16(tmp);
537  }
538 }
539 
540 static void dss_sp_shift_sq_add(const int32_t *filter_buf, int32_t *audio_buf,
541  int32_t *dst)
542 {
543  int a;
544 
545  for (a = 0; a < 72; a++) {
546  int i, tmp = 0;
547 
548  audio_buf[0] = dst[a];
549 
550  for (i = 14; i >= 0; i--)
551  tmp += audio_buf[i] * filter_buf[i];
552 
553  for (i = 14; i > 0; i--)
554  audio_buf[i] = audio_buf[i - 1];
555 
556  tmp = (tmp + 4096) >> 13;
557 
558  dst[a] = av_clip_int16(tmp);
559  }
560 }
561 
562 static void dss_sp_vec_mult(const int32_t *src, int32_t *dst,
563  const int16_t *mult)
564 {
565  int i;
566 
567  dst[0] = src[0];
568 
569  for (i = 1; i < 15; i++)
570  dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
571 }
572 
573 static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
574 {
575  unsigned int val;
576  int max_val;
577  int i;
578 
579  val = 1;
580  for (i = 0; i < size; i++)
581  val |= FFABS(vector_buf[i]);
582 
583  for (max_val = 0; val <= 0x4000; ++max_val)
584  val *= 2;
585  return max_val;
586 }
587 
589 {
590  int i, sum = 0;
591  for (i = 0; i < size; i++)
592  sum += FFABS(p->vector_buf[i]);
593  return sum;
594 }
595 
596 static void dss_sp_sf_synthesis(DssSpContext *p, int32_t lpc_filter,
597  int32_t *dst, int size)
598 {
599  int32_t tmp_buf[15];
600  int32_t noise[72];
601  int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
602  int i, tmp;
603 
604  if (size > 0) {
605  vsum_1 = dss_sp_vector_sum(p, size);
606 
607  if (vsum_1 > 0xFFFFF)
608  vsum_1 = 0xFFFFF;
609  }
610 
611  normalize_bits = dss_sp_get_normalize_bits(p->vector_buf, size);
612 
613  dss_sp_scale_vector(p->vector_buf, normalize_bits - 3, size);
614  dss_sp_scale_vector(p->audio_buf, normalize_bits, 15);
615  dss_sp_scale_vector(p->err_buf1, normalize_bits, 15);
616 
617  v36 = p->err_buf1[1];
618 
620  dss_sp_shift_sq_add(tmp_buf, p->audio_buf, p->vector_buf);
621 
623  dss_sp_shift_sq_sub(tmp_buf, p->err_buf1, p->vector_buf);
624 
625  /* lpc_filter can be negative */
626  lpc_filter = lpc_filter >> 1;
627  if (lpc_filter >= 0)
628  lpc_filter = 0;
629 
630  if (size > 1) {
631  for (i = size - 1; i > 0; i--) {
632  tmp = DSS_SP_FORMULA(p->vector_buf[i], lpc_filter,
633  p->vector_buf[i - 1]);
634  p->vector_buf[i] = av_clip_int16(tmp);
635  }
636  }
637 
638  tmp = DSS_SP_FORMULA(p->vector_buf[0], lpc_filter, v36);
639  p->vector_buf[0] = av_clip_int16(tmp);
640 
641  dss_sp_scale_vector(p->vector_buf, -normalize_bits, size);
642  dss_sp_scale_vector(p->audio_buf, -normalize_bits, 15);
643  dss_sp_scale_vector(p->err_buf1, -normalize_bits, 15);
644 
645  if (size > 0)
646  vsum_2 = dss_sp_vector_sum(p, size);
647 
648  if (vsum_2 >= 0x40)
649  tmp = (vsum_1 << 11) / vsum_2;
650  else
651  tmp = 1;
652 
653  bias = 409 * tmp >> 15 << 15;
654  tmp = (bias + 32358 * p->noise_state) >> 15;
655  noise[0] = av_clip_int16(tmp);
656 
657  for (i = 1; i < size; i++) {
658  tmp = (bias + 32358 * noise[i - 1]) >> 15;
659  noise[i] = av_clip_int16(tmp);
660  }
661 
662  p->noise_state = noise[size - 1];
663  for (i = 0; i < size; i++) {
664  tmp = (p->vector_buf[i] * noise[i]) >> 11;
665  dst[i] = av_clip_int16(tmp);
666  }
667 }
668 
670 {
671  int i, offset = 6, counter = 0, a = 0;
672 
673  for (i = 0; i < 6; i++)
674  p->excitation[i] = p->excitation[288 + i];
675 
676  for (i = 0; i < 72 * SUBFRAMES; i++)
677  p->excitation[6 + i] = dst[i];
678 
679  do {
680  int tmp = 0;
681 
682  for (i = 0; i < 6; i++)
683  tmp += p->excitation[offset--] * dss_sp_sinc[a + i * 11];
684 
685  offset += 7;
686 
687  tmp >>= 15;
688  dst[counter] = av_clip_int16(tmp);
689 
690  counter++;
691 
692  a = (a + 1) % 11;
693  if (!a)
694  offset++;
695  } while (offset < FF_ARRAY_ELEMS(p->excitation));
696 }
697 
698 static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
699 {
700  int i;
701 
702  for (i = 0; i < size; i++)
703  dst[i] = av_clip_int16(src[i]);
704 }
705 
707  int16_t *abuf_dst, const uint8_t *abuf_src)
708 {
709  int i, j;
710 
711  dss_sp_unpack_coeffs(p, abuf_src);
712 
714 
716 
717  for (j = 0; j < SUBFRAMES; j++) {
719  p->fparam.pitch_lag[j],
721 
723 
725 
726  for (i = 0; i < 72; i++)
727  p->vector_buf[i] = p->history[72 - i];
728 
730  p->err_buf2, p->vector_buf);
731 
733  &p->working_buffer[j][0], 72);
734  }
735 
736  dss_sp_update_state(p, &p->working_buffer[0][0]);
737 
738  dss_sp_32to16bit(abuf_dst,
739  &p->working_buffer[0][0], 264);
740  return 0;
741 }
742 
744  int *got_frame_ptr, AVPacket *avpkt)
745 {
746  DssSpContext *p = avctx->priv_data;
747  const uint8_t *buf = avpkt->data;
748  int buf_size = avpkt->size;
749 
750  int16_t *out;
751  int ret;
752 
753  if (buf_size < DSS_SP_FRAME_SIZE) {
754  if (buf_size)
755  av_log(avctx, AV_LOG_WARNING,
756  "Expected %d bytes, got %d - skipping packet.\n",
757  DSS_SP_FRAME_SIZE, buf_size);
758  *got_frame_ptr = 0;
759  return AVERROR_INVALIDDATA;
760  }
761 
762  frame->nb_samples = DSS_SP_SAMPLE_COUNT;
763  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
764  return ret;
765 
766  out = (int16_t *)frame->data[0];
767 
768  dss_sp_decode_one_frame(p, out, buf);
769 
770  *got_frame_ptr = 1;
771 
772  return DSS_SP_FRAME_SIZE;
773 }
774 
776  .p.name = "dss_sp",
777  .p.long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
778  .p.type = AVMEDIA_TYPE_AUDIO,
779  .p.id = AV_CODEC_ID_DSS_SP,
780  .priv_data_size = sizeof(DssSpContext),
783  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
784  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
785 };
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
dss_sp_adaptive_gain
static const uint16_t dss_sp_adaptive_gain[]
Definition: dss_sp.c:272
opt.h
DssSpContext::vector_buf
int32_t vector_buf[72]
Definition: dss_sp.c:63
DssSpSubframe::gain
int16_t gain
Definition: dss_sp.c:40
mem_internal.h
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:998
dss_sp_32to16bit
static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
Definition: dss_sp.c:698
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:546
DssSpContext::avctx
AVCodecContext * avctx
Definition: dss_sp.c:54
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:325
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:374
AV_CHANNEL_LAYOUT_MONO
#define AV_CHANNEL_LAYOUT_MONO
Definition: channel_layout.h:353
FFCodec
Definition: codec_internal.h:112
dss_sp_decode_frame
static int dss_sp_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: dss_sp.c:743
DssSpContext::pulse_dec_mode
int pulse_dec_mode
Definition: dss_sp.c:67
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:649
ff_dss_sp_decoder
const FFCodec ff_dss_sp_decoder
Definition: dss_sp.c:775
DssSpContext::lpc_filter
int32_t lpc_filter[14]
Definition: dss_sp.c:61
init
static int init
Definition: av_tx.c:47
DssSpContext::noise_state
int noise_state
Definition: dss_sp.c:64
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
dss_sp_convert_coeffs
static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
Definition: dss_sp.c:437
DssSpContext::audio_buf
int32_t audio_buf[15]
Definition: dss_sp.c:59
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:116
U
#define U(x)
Definition: vp56_arith.h:37
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:2056
DssSpContext::filter
int32_t filter[15]
Definition: dss_sp.c:62
GetBitContext
Definition: get_bits.h:61
val
static double val(void *priv, double ch)
Definition: aeval.c:77
dss_sp_combinatorial_table
static const uint32_t dss_sp_combinatorial_table[PULSE_MAX][72]
Definition: dss_sp.c:76
dss_sp_shift_sq_add
static void dss_sp_shift_sq_add(const int32_t *filter_buf, int32_t *audio_buf, int32_t *dst)
Definition: dss_sp.c:540
mult
static int16_t mult(Float11 *f1, Float11 *f2)
Definition: g726.c:60
DssSpSubframe::pulse_pos
int16_t pulse_pos[7]
Definition: dss_sp.c:42
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:254
dss_sp_update_buf
static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
Definition: dss_sp.c:505
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
DssSpSubframe::combined_pulse_pos
int32_t combined_pulse_pos
Definition: dss_sp.c:41
dss_sp_unpack_filter
static void dss_sp_unpack_filter(DssSpContext *p)
Definition: dss_sp.c:429
bits
uint8_t bits
Definition: vp3data.h:141
dss_sp_update_state
static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
Definition: dss_sp.c:669
DSS_SP_FRAME_SIZE
#define DSS_SP_FRAME_SIZE
Definition: dss_sp.c:35
get_bits.h
DSS_SP_SAMPLE_COUNT
#define DSS_SP_SAMPLE_COUNT
Definition: dss_sp.c:36
dss_sp_decode_init
static av_cold int dss_sp_decode_init(AVCodecContext *avctx)
Definition: dss_sp.c:291
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:64
DssSpContext::fparam
DssSpFrame fparam
Definition: dss_sp.c:57
av_clip_int16
#define av_clip_int16
Definition: common.h:110
DssSpFrame::sf
struct DssSpSubframe sf[SUBFRAMES]
Definition: dss_sp.c:50
dss_sp_add_pulses
static void dss_sp_add_pulses(int32_t *vector_buf, const struct DssSpSubframe *sf)
Definition: dss_sp.c:462
SUBFRAMES
#define SUBFRAMES
Definition: dss_sp.c:32
dss_sp_get_normalize_bits
static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
Definition: dss_sp.c:573
dss_sp_filter_cb
static const int16_t dss_sp_filter_cb[14][32]
Definition: dss_sp.c:175
dss_sp_vec_mult
static void dss_sp_vec_mult(const int32_t *src, int32_t *dst, const int16_t *mult)
Definition: dss_sp.c:562
index
int index
Definition: gxfenc.c:89
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:630
AV_CODEC_CAP_CHANNEL_CONF
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: codec.h:109
dss_sp_vector_sum
static int dss_sp_vector_sum(DssSpContext *p, int size)
Definition: dss_sp.c:588
DssSpContext
Definition: dss_sp.c:53
DssSpContext::history
int32_t history[187]
Definition: dss_sp.c:56
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1403
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AVPacket::size
int size
Definition: packet.h:375
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:290
codec_internal.h
DssSpFrame
Definition: dss_sp.c:46
dss_sp_sinc
static const int32_t dss_sp_sinc[67]
Definition: dss_sp.c:279
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:425
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1014
size
int size
Definition: twinvq_data.h:10344
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
dss_sp_scale_vector
static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
Definition: dss_sp.c:493
DssSpSubframe
Definition: dss_sp.c:39
DSS_SP_FORMULA
#define DSS_SP_FORMULA(a, b, c)
Definition: dss_sp.c:37
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:116
dss_sp_unpack_coeffs
static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
Definition: dss_sp.c:305
DssSpSubframe::pulse_val
int16_t pulse_val[7]
Definition: dss_sp.c:43
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
common.h
DssSpFrame::sf_adaptive_gain
int16_t sf_adaptive_gain[SUBFRAMES]
Definition: dss_sp.c:48
FF_CODEC_CAP_INIT_THREADSAFE
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: codec_internal.h:31
DssSpContext::excitation
int32_t excitation[288+6]
Definition: dss_sp.c:55
AV_CODEC_ID_DSS_SP
@ AV_CODEC_ID_DSS_SP
Definition: codec_id.h:493
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:58
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:203
avcodec.h
DssSpContext::bits
uint8_t bits[DSS_SP_FRAME_SIZE+AV_INPUT_BUFFER_PADDING_SIZE]
Definition: dss_sp.c:70
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
dss_sp_shift_sq_sub
static void dss_sp_shift_sq_sub(const int32_t *filter_buf, int32_t *error_buf, int32_t *dst)
Definition: dss_sp.c:516
dss_sp_decode_one_frame
static int dss_sp_decode_one_frame(DssSpContext *p, int16_t *abuf_dst, const uint8_t *abuf_src)
Definition: dss_sp.c:706
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
dss_sp_unc_decreasing_array
static const uint16_t dss_sp_unc_decreasing_array[]
Definition: dss_sp.c:267
AVCodecContext
main external API structure.
Definition: avcodec.h:389
channel_layout.h
noise
static int noise(AVBSFContext *ctx, AVPacket *pkt)
Definition: noise_bsf.c:120
PULSE_MAX
#define PULSE_MAX
Definition: dss_sp.c:33
dss_sp_sf_synthesis
static void dss_sp_sf_synthesis(DssSpContext *p, int32_t lpc_filter, int32_t *dst, int size)
Definition: dss_sp.c:596
DssSpFrame::pitch_lag
int16_t pitch_lag[SUBFRAMES]
Definition: dss_sp.c:49
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:416
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
DssSpContext::working_buffer
int32_t working_buffer[SUBFRAMES][72]
Definition: dss_sp.c:58
DssSpContext::err_buf2
int32_t err_buf2[15]
Definition: dss_sp.c:65
dss_sp_pulse_val
static const int16_t dss_sp_pulse_val[8]
Definition: dss_sp.c:258
int32_t
int32_t
Definition: audioconvert.c:56
binary_decreasing_array
static const uint16_t binary_decreasing_array[]
Definition: dss_sp.c:262
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
int
int
Definition: ffmpeg_filter.c:153
DssSpContext::err_buf1
int32_t err_buf1[15]
Definition: dss_sp.c:60
dss_sp_gen_exc
static void dss_sp_gen_exc(int32_t *vector, int32_t *prev_exc, int pitch_lag, int gain)
Definition: dss_sp.c:473
DssSpFrame::filter_idx
int16_t filter_idx[14]
Definition: dss_sp.c:47
dss_sp_fixed_cb_gain
static const uint16_t dss_sp_fixed_cb_gain[64]
Definition: dss_sp.c:247