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.h"
25 #include "libavutil/opt.h"
26 
27 #include "avcodec.h"
28 #include "get_bits.h"
29 #include "internal.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 
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;
294  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
295  avctx->channels = 1;
296  avctx->sample_rate = 11025;
297 
298  memset(p->history, 0, sizeof(p->history));
299  p->pulse_dec_mode = 1;
300  p->avctx = avctx;
301 
302  return 0;
303 }
304 
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 
743 static int dss_sp_decode_frame(AVCodecContext *avctx, void *data,
744  int *got_frame_ptr, AVPacket *avpkt)
745 {
746  DssSpContext *p = avctx->priv_data;
747  AVFrame *frame = data;
748  const uint8_t *buf = avpkt->data;
749  int buf_size = avpkt->size;
750 
751  int16_t *out;
752  int ret;
753 
754  if (buf_size < DSS_SP_FRAME_SIZE) {
755  if (buf_size)
756  av_log(avctx, AV_LOG_WARNING,
757  "Expected %d bytes, got %d - skipping packet.\n",
758  DSS_SP_FRAME_SIZE, buf_size);
759  *got_frame_ptr = 0;
760  return AVERROR_INVALIDDATA;
761  }
762 
763  frame->nb_samples = DSS_SP_SAMPLE_COUNT;
764  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
765  return ret;
766 
767  out = (int16_t *)frame->data[0];
768 
770 
771  *got_frame_ptr = 1;
772 
773  return DSS_SP_FRAME_SIZE;
774 }
775 
777  .name = "dss_sp",
778  .long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
779  .type = AVMEDIA_TYPE_AUDIO,
780  .id = AV_CODEC_ID_DSS_SP,
781  .priv_data_size = sizeof(DssSpContext),
784  .capabilities = AV_CODEC_CAP_DR1,
785 };
AVCodec
AVCodec.
Definition: avcodec.h:3481
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
dss_sp_adaptive_gain
static const uint16_t dss_sp_adaptive_gain[]
Definition: dss_sp.c:271
opt.h
DssSpContext::vector_buf
int32_t vector_buf[72]
Definition: dss_sp.c:62
DssSpSubframe::gain
int16_t gain
Definition: dss_sp.c:39
AVCodecContext::channel_layout
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2276
out
FILE * out
Definition: movenc.c:54
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:2225
dss_sp_32to16bit
static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
Definition: dss_sp.c:698
AV_CH_LAYOUT_MONO
#define AV_CH_LAYOUT_MONO
Definition: channel_layout.h:85
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:53
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:26
internal.h
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
data
const char data[16]
Definition: mxf.c:91
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:659
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: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:58
U
#define U(x)
Definition: vp56_arith.h:37
DssSpContext::filter
int32_t filter[15]
Definition: dss_sp.c:61
GetBitContext
Definition: get_bits.h:61
src
#define src
Definition: vp8dsp.c:254
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:540
mult
static int16_t mult(Float11 *f1, Float11 *f2)
Definition: g726.c:55
DssSpSubframe::pulse_pos
int16_t pulse_pos[7]
Definition: dss_sp.c:41
buf
void * buf
Definition: avisynth_c.h:766
av_cold
#define av_cold
Definition: attributes.h:84
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:42
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:40
dss_sp_unpack_filter
static void dss_sp_unpack_filter(DssSpContext *p)
Definition: dss_sp.c:429
bits
uint8_t bits
Definition: vp3data.h:202
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:34
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
int32_t
int32_t
Definition: audio_convert.c:194
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
DssSpContext::fparam
DssSpFrame fparam
Definition: dss_sp.c:56
DssSpFrame::sf
struct DssSpSubframe sf[SUBFRAMES]
Definition: dss_sp.c:49
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:31
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: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:562
index
int index
Definition: gxfenc.c:89
for
for(j=16;j >0;--j)
Definition: h264pred_template.c:469
dss_sp_vector_sum
static int dss_sp_vector_sum(DssSpContext *p, int size)
Definition: dss_sp.c:588
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:1965
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:981
AVPacket::size
int size
Definition: avcodec.h:1478
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:188
DssSpFrame
Definition: dss_sp.c:45
dss_sp_sinc
static const int32_t dss_sp_sinc[67]
Definition: dss_sp.c:278
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2233
size
int size
Definition: twinvq_data.h:11134
val
const char const char void * val
Definition: avisynth_c.h:863
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
dss_sp_decode_frame
static int dss_sp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: dss_sp.c:743
DssSpSubframe
Definition: dss_sp.c:38
AVCodecContext::channels
int channels
number of audio channels
Definition: avcodec.h:2226
DSS_SP_FORMULA
#define DSS_SP_FORMULA(a, b, c)
Definition: dss_sp.c:36
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:112
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:42
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
common.h
DssSpFrame::sf_adaptive_gain
int16_t sf_adaptive_gain[SUBFRAMES]
Definition: dss_sp.c:47
uint8_t
uint8_t
Definition: audio_convert.c:194
DssSpContext::excitation
int32_t excitation[288+6]
Definition: dss_sp.c:54
AV_CODEC_ID_DSS_SP
@ AV_CODEC_ID_DSS_SP
Definition: avcodec.h:630
AV_SAMPLE_FMT_S16
@ AV_SAMPLE_FMT_S16
signed 16 bits
Definition: samplefmt.h:61
AVCodec::name
const char * name
Name of the codec implementation.
Definition: avcodec.h:3488
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: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: avcodec.h:790
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
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:1565
channel_layout.h
noise
static int noise(AVBSFContext *ctx, AVPacket *pkt)
Definition: noise_bsf.c:38
PULSE_MAX
#define PULSE_MAX
Definition: dss_sp.c:32
mem.h
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:48
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1454
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
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
ff_dss_sp_decoder
AVCodec ff_dss_sp_decoder
Definition: dss_sp.c:776
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:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
int
int
Definition: ffmpeg_filter.c:191
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:473
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