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 
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;
41  int16_t pulse_pos[7];
42  int16_t pulse_val[7];
44 
45 typedef struct DssSpFrame {
46  int16_t filter_idx[14];
48  int16_t pitch_lag[SUBFRAMES];
50 } DssSpFrame;
51 
52 typedef struct DssSpContext {
54  int32_t excitation[288 + 6];
65 
67 
68  DECLARE_ALIGNED(16, uint8_t, bits)[DSS_SP_FRAME_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 
291 {
292  DssSpContext *p = avctx->priv_data;
293  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
294  avctx->sample_rate = 11025;
297 
298  p->pulse_dec_mode = 1;
299  p->avctx = avctx;
300 
301  return 0;
302 }
303 
304 static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
305 {
306  GetBitContext gb;
307  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  for (i = 0; i < DSS_SP_FRAME_SIZE; i += 2) {
315  p->bits[i] = src[i + 1];
316  p->bits[i + 1] = src[i];
317  }
318 
319  init_get_bits(&gb, p->bits, DSS_SP_FRAME_SIZE * 8);
320 
321  for (i = 0; i < 2; i++)
322  fparam->filter_idx[i] = get_bits(&gb, 5);
323  for (; i < 8; i++)
324  fparam->filter_idx[i] = get_bits(&gb, 4);
325  for (; i < 14; i++)
326  fparam->filter_idx[i] = get_bits(&gb, 3);
327 
328  for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
329  fparam->sf_adaptive_gain[subframe_idx] = get_bits(&gb, 5);
330 
331  fparam->sf[subframe_idx].combined_pulse_pos = get_bits_long(&gb, 31);
332 
333  fparam->sf[subframe_idx].gain = get_bits(&gb, 6);
334 
335  for (i = 0; i < 7; i++)
336  fparam->sf[subframe_idx].pulse_val[i] = get_bits(&gb, 3);
337  }
338 
339  for (subframe_idx = 0; subframe_idx < 4; subframe_idx++) {
340  unsigned int C72_binomials[PULSE_MAX] = {
341  72, 2556, 59640, 1028790, 13991544, 156238908, 1473109704,
342  3379081753
343  };
344  unsigned int combined_pulse_pos =
345  fparam->sf[subframe_idx].combined_pulse_pos;
346  int index = 6;
347 
348  if (combined_pulse_pos < C72_binomials[PULSE_MAX - 1]) {
349  if (p->pulse_dec_mode) {
350  int pulse, pulse_idx;
351  pulse = PULSE_MAX - 1;
352  pulse_idx = 71;
353  combined_pulse_pos =
354  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  for (i = 0; i < 7; i++) {
361  for (;
362  combined_pulse_pos <
363  dss_sp_combinatorial_table[pulse][pulse_idx];
364  --pulse_idx)
365  ;
366  combined_pulse_pos -=
367  dss_sp_combinatorial_table[pulse][pulse_idx];
368  pulse--;
369  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  combined_pitch = get_bits(&gb, 24);
399 
400  fparam->pitch_lag[0] = (combined_pitch % 151) + 36;
401 
402  combined_pitch /= 151;
403 
404  for (i = 1; i < SUBFRAMES - 1; i++) {
405  fparam->pitch_lag[i] = combined_pitch % 48;
406  combined_pitch /= 48;
407  }
408  if (combined_pitch > 47) {
409  av_log (p->avctx, AV_LOG_WARNING, "combined_pitch was too large\n");
410  combined_pitch = 0;
411  }
412  fparam->pitch_lag[i] = combined_pitch;
413 
414  pitch_lag = fparam->pitch_lag[0];
415  for (i = 1; i < SUBFRAMES; i++) {
416  if (pitch_lag > 162) {
417  fparam->pitch_lag[i] += 162 - 23;
418  } else {
419  tmp = pitch_lag - 23;
420  if (tmp < 36)
421  tmp = 36;
422  fparam->pitch_lag[i] += tmp;
423  }
424  pitch_lag = fparam->pitch_lag[i];
425  }
426 }
427 
429 {
430  int i;
431 
432  for (i = 0; i < 14; i++)
434 }
435 
436 static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
437 {
438  int a, a_plus, i;
439 
440  coeffs[0] = 0x2000;
441  for (a = 0; a < 14; a++) {
442  a_plus = a + 1;
443  coeffs[a_plus] = lpc_filter[a] >> 2;
444  if (a_plus / 2 >= 1) {
445  for (i = 1; i <= a_plus / 2; i++) {
446  int coeff_1, coeff_2, tmp;
447 
448  coeff_1 = coeffs[i];
449  coeff_2 = coeffs[a_plus - i];
450 
451  tmp = DSS_SP_FORMULA(coeff_1, lpc_filter[a], coeff_2);
452  coeffs[i] = av_clip_int16(tmp);
453 
454  tmp = DSS_SP_FORMULA(coeff_2, lpc_filter[a], coeff_1);
455  coeffs[a_plus - i] = av_clip_int16(tmp);
456  }
457  }
458  }
459 }
460 
461 static void dss_sp_add_pulses(int32_t *vector_buf,
462  const struct DssSpSubframe *sf)
463 {
464  int i;
465 
466  for (i = 0; i < 7; i++)
467  vector_buf[sf->pulse_pos[i]] += (dss_sp_fixed_cb_gain[sf->gain] *
469  0x4000) >> 15;
470 }
471 
472 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  if (pitch_lag < 72)
480  for (i = 0; i < 72; i++)
481  vector[i] = prev_exc[pitch_lag - i % pitch_lag];
482  else
483  for (i = 0; i < 72; i++)
484  vector[i] = prev_exc[pitch_lag - i];
485 
486  for (i = 0; i < 72; i++) {
487  int tmp = gain * vector[i] >> 11;
488  vector[i] = av_clip_int16(tmp);
489  }
490 }
491 
492 static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
493 {
494  int i;
495 
496  if (bits < 0)
497  for (i = 0; i < size; i++)
498  vec[i] = vec[i] >> -bits;
499  else
500  for (i = 0; i < size; i++)
501  vec[i] = vec[i] * (1 << bits);
502 }
503 
504 static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
505 {
506  int i;
507 
508  for (i = 114; i > 0; i--)
509  vector[i + 72] = vector[i];
510 
511  for (i = 0; i < 72; i++)
512  vector[72 - i] = hist[i];
513 }
514 
515 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  for (a = 0; a < 72; a++) {
521  int i, tmp;
522 
523  tmp = dst[a] * filter_buf[0];
524 
525  for (i = 14; i > 0; i--)
526  tmp -= error_buf[i] * (unsigned)filter_buf[i];
527 
528  for (i = 14; i > 0; i--)
529  error_buf[i] = error_buf[i - 1];
530 
531  tmp = (int)(tmp + 4096U) >> 13;
532 
533  error_buf[1] = tmp;
534 
535  dst[a] = av_clip_int16(tmp);
536  }
537 }
538 
539 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  for (a = 0; a < 72; a++) {
545  int i, tmp = 0;
546 
547  audio_buf[0] = dst[a];
548 
549  for (i = 14; i >= 0; i--)
550  tmp += audio_buf[i] * filter_buf[i];
551 
552  for (i = 14; i > 0; i--)
553  audio_buf[i] = audio_buf[i - 1];
554 
555  tmp = (tmp + 4096) >> 13;
556 
557  dst[a] = av_clip_int16(tmp);
558  }
559 }
560 
561 static void dss_sp_vec_mult(const int32_t *src, int32_t *dst,
562  const int16_t *mult)
563 {
564  int i;
565 
566  dst[0] = src[0];
567 
568  for (i = 1; i < 15; i++)
569  dst[i] = (src[i] * mult[i] + 0x4000) >> 15;
570 }
571 
572 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  val = 1;
579  for (i = 0; i < size; i++)
580  val |= FFABS(vector_buf[i]);
581 
582  for (max_val = 0; val <= 0x4000; ++max_val)
583  val *= 2;
584  return max_val;
585 }
586 
588 {
589  int i, sum = 0;
590  for (i = 0; i < size; i++)
591  sum += FFABS(p->vector_buf[i]);
592  return sum;
593 }
594 
595 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  int bias, vsum_2 = 0, vsum_1 = 0, v36, normalize_bits;
601  int i, tmp;
602 
603  if (size > 0) {
604  vsum_1 = dss_sp_vector_sum(p, size);
605 
606  if (vsum_1 > 0xFFFFF)
607  vsum_1 = 0xFFFFF;
608  }
609 
610  normalize_bits = dss_sp_get_normalize_bits(p->vector_buf, size);
611 
612  dss_sp_scale_vector(p->vector_buf, normalize_bits - 3, size);
613  dss_sp_scale_vector(p->audio_buf, normalize_bits, 15);
614  dss_sp_scale_vector(p->err_buf1, normalize_bits, 15);
615 
616  v36 = p->err_buf1[1];
617 
619  dss_sp_shift_sq_add(tmp_buf, p->audio_buf, p->vector_buf);
620 
622  dss_sp_shift_sq_sub(tmp_buf, p->err_buf1, p->vector_buf);
623 
624  /* lpc_filter can be negative */
625  lpc_filter = lpc_filter >> 1;
626  if (lpc_filter >= 0)
627  lpc_filter = 0;
628 
629  if (size > 1) {
630  for (i = size - 1; i > 0; i--) {
631  tmp = DSS_SP_FORMULA(p->vector_buf[i], lpc_filter,
632  p->vector_buf[i - 1]);
633  p->vector_buf[i] = av_clip_int16(tmp);
634  }
635  }
636 
637  tmp = DSS_SP_FORMULA(p->vector_buf[0], lpc_filter, v36);
638  p->vector_buf[0] = av_clip_int16(tmp);
639 
640  dss_sp_scale_vector(p->vector_buf, -normalize_bits, size);
641  dss_sp_scale_vector(p->audio_buf, -normalize_bits, 15);
642  dss_sp_scale_vector(p->err_buf1, -normalize_bits, 15);
643 
644  if (size > 0)
645  vsum_2 = dss_sp_vector_sum(p, size);
646 
647  if (vsum_2 >= 0x40)
648  tmp = (vsum_1 << 11) / vsum_2;
649  else
650  tmp = 1;
651 
652  bias = 409 * tmp >> 15 << 15;
653  tmp = (bias + 32358 * p->noise_state) >> 15;
654  noise[0] = av_clip_int16(tmp);
655 
656  for (i = 1; i < size; i++) {
657  tmp = (bias + 32358 * noise[i - 1]) >> 15;
658  noise[i] = av_clip_int16(tmp);
659  }
660 
661  p->noise_state = noise[size - 1];
662  for (i = 0; i < size; i++) {
663  tmp = (p->vector_buf[i] * noise[i]) >> 11;
664  dst[i] = av_clip_int16(tmp);
665  }
666 }
667 
669 {
670  int i, offset = 6, counter = 0, a = 0;
671 
672  for (i = 0; i < 6; i++)
673  p->excitation[i] = p->excitation[288 + i];
674 
675  for (i = 0; i < 72 * SUBFRAMES; i++)
676  p->excitation[6 + i] = dst[i];
677 
678  do {
679  int tmp = 0;
680 
681  for (i = 0; i < 6; i++)
682  tmp += p->excitation[offset--] * dss_sp_sinc[a + i * 11];
683 
684  offset += 7;
685 
686  tmp >>= 15;
687  dst[counter] = av_clip_int16(tmp);
688 
689  counter++;
690 
691  a = (a + 1) % 11;
692  if (!a)
693  offset++;
694  } while (offset < FF_ARRAY_ELEMS(p->excitation));
695 }
696 
697 static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
698 {
699  int i;
700 
701  for (i = 0; i < size; i++)
702  dst[i] = av_clip_int16(src[i]);
703 }
704 
706  int16_t *abuf_dst, const uint8_t *abuf_src)
707 {
708  int i, j;
709 
710  dss_sp_unpack_coeffs(p, abuf_src);
711 
713 
715 
716  for (j = 0; j < SUBFRAMES; j++) {
718  p->fparam.pitch_lag[j],
720 
722 
724 
725  for (i = 0; i < 72; i++)
726  p->vector_buf[i] = p->history[72 - i];
727 
729  p->err_buf2, p->vector_buf);
730 
732  &p->working_buffer[j][0], 72);
733  }
734 
735  dss_sp_update_state(p, &p->working_buffer[0][0]);
736 
737  dss_sp_32to16bit(abuf_dst,
738  &p->working_buffer[0][0], 264);
739  return 0;
740 }
741 
743  int *got_frame_ptr, AVPacket *avpkt)
744 {
745  DssSpContext *p = avctx->priv_data;
746  const uint8_t *buf = avpkt->data;
747  int buf_size = avpkt->size;
748 
749  int16_t *out;
750  int ret;
751 
752  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  frame->nb_samples = DSS_SP_SAMPLE_COUNT;
762  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
763  return ret;
764 
765  out = (int16_t *)frame->data[0];
766 
767  dss_sp_decode_one_frame(p, out, buf);
768 
769  *got_frame_ptr = 1;
770 
771  return DSS_SP_FRAME_SIZE;
772 }
773 
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),
782  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
783 };
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:271
DssSpContext::vector_buf
int32_t vector_buf[72]
Definition: dss_sp.c:62
DssSpSubframe::gain
int16_t gain
Definition: dss_sp.c:39
mem_internal.h
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1034
dss_sp_32to16bit
static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
Definition: dss_sp.c:697
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:411
DssSpContext::avctx
AVCodecContext * avctx
Definition: dss_sp.c:53
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:330
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
AVPacket::data
uint8_t * data
Definition: packet.h:374
FFCodec
Definition: codec_internal.h:127
dss_sp_decode_frame
static int dss_sp_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
Definition: dss_sp.c:742
DssSpContext::pulse_dec_mode
int pulse_dec_mode
Definition: dss_sp.c:66
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:493
ff_dss_sp_decoder
const FFCodec ff_dss_sp_decoder
Definition: dss_sp.c:774
DssSpContext::lpc_filter
int32_t lpc_filter[14]
Definition: dss_sp.c:60
DssSpContext::noise_state
int noise_state
Definition: dss_sp.c:63
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:325
dss_sp_convert_coeffs
static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
Definition: dss_sp.c:436
DssSpContext::audio_buf
int32_t audio_buf[15]
Definition: dss_sp.c:58
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:2054
DssSpContext::filter
int32_t filter[15]
Definition: dss_sp.c:61
GetBitContext
Definition: get_bits.h:107
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:75
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:539
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:41
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:306
dss_sp_update_buf
static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
Definition: dss_sp.c:504
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
DssSpSubframe::combined_pulse_pos
int32_t combined_pulse_pos
Definition: dss_sp.c:40
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts_bsf.c:365
dss_sp_unpack_filter
static void dss_sp_unpack_filter(DssSpContext *p)
Definition: dss_sp.c:428
bits
uint8_t bits
Definition: vp3data.h:128
dss_sp_update_state
static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
Definition: dss_sp.c:668
DSS_SP_FRAME_SIZE
#define DSS_SP_FRAME_SIZE
Definition: dss_sp.c:34
decode.h
get_bits.h
DSS_SP_SAMPLE_COUNT
#define DSS_SP_SAMPLE_COUNT
Definition: dss_sp.c:35
dss_sp_decode_init
static av_cold int dss_sp_decode_init(AVCodecContext *avctx)
Definition: dss_sp.c:290
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:272
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:56
av_clip_int16
#define av_clip_int16
Definition: common.h:110
DssSpFrame::sf
struct DssSpSubframe sf[SUBFRAMES]
Definition: dss_sp.c:49
bias
static int bias(int x, int c)
Definition: vqcdec.c:113
dss_sp_add_pulses
static void dss_sp_add_pulses(int32_t *vector_buf, const struct DssSpSubframe *sf)
Definition: dss_sp.c:461
SUBFRAMES
#define SUBFRAMES
Definition: dss_sp.c:31
dss_sp_get_normalize_bits
static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
Definition: dss_sp.c:572
dss_sp_filter_cb
static const int16_t dss_sp_filter_cb[14][32]
Definition: dss_sp.c:174
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:561
index
int index
Definition: gxfenc.c:89
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:103
dss_sp_vector_sum
static int dss_sp_vector_sum(DssSpContext *p, int size)
Definition: dss_sp.c:587
DssSpContext
Definition: dss_sp.c:52
DssSpContext::history
int32_t history[187]
Definition: dss_sp.c:55
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1473
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
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:301
codec_internal.h
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem_internal.h:87
DssSpFrame
Definition: dss_sp.c:45
dss_sp_sinc
static const int32_t dss_sp_sinc[67]
Definition: dss_sp.c:278
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:1050
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:492
DssSpSubframe
Definition: dss_sp.c:38
DSS_SP_FORMULA
#define DSS_SP_FORMULA(a, b, c)
Definition: dss_sp.c:36
dss_sp_unpack_coeffs
static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
Definition: dss_sp.c:304
DssSpSubframe::pulse_val
int16_t pulse_val[7]
Definition: dss_sp.c:42
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:47
DssSpContext::excitation
int32_t excitation[288+6]
Definition: dss_sp.c:54
AV_CODEC_ID_DSS_SP
@ AV_CODEC_ID_DSS_SP
Definition: codec_id.h:504
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:191
avcodec.h
DssSpContext::bits
uint8_t bits[DSS_SP_FRAME_SIZE+AV_INPUT_BUFFER_PADDING_SIZE]
Definition: dss_sp.c:69
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:515
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:705
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
U
#define U(x)
Definition: vpx_arith.h:37
dss_sp_unc_decreasing_array
static const uint16_t dss_sp_unc_decreasing_array[]
Definition: dss_sp.c:266
AVCodecContext
main external API structure.
Definition: avcodec.h:426
channel_layout.h
noise
static int noise(AVBSFContext *ctx, AVPacket *pkt)
Definition: noise_bsf.c:120
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:632
PULSE_MAX
#define PULSE_MAX
Definition: dss_sp.c:32
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:595
DssSpFrame::pitch_lag
int16_t pitch_lag[SUBFRAMES]
Definition: dss_sp.c:48
AV_CHANNEL_LAYOUT_MONO
#define AV_CHANNEL_LAYOUT_MONO
Definition: channel_layout.h:368
AVPacket
This structure stores compressed data.
Definition: packet.h:351
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:453
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
DssSpContext::working_buffer
int32_t working_buffer[SUBFRAMES][72]
Definition: dss_sp.c:57
DssSpContext::err_buf2
int32_t err_buf2[15]
Definition: dss_sp.c:64
dss_sp_pulse_val
static const int16_t dss_sp_pulse_val[8]
Definition: dss_sp.c:257
int32_t
int32_t
Definition: audioconvert.c:56
binary_decreasing_array
static const uint16_t binary_decreasing_array[]
Definition: dss_sp.c:261
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:156
DssSpContext::err_buf1
int32_t err_buf1[15]
Definition: dss_sp.c:59
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:472
DssSpFrame::filter_idx
int16_t filter_idx[14]
Definition: dss_sp.c:46
dss_sp_fixed_cb_gain
static const uint16_t dss_sp_fixed_cb_gain[64]
Definition: dss_sp.c:246