FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
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) (((((a) << 15) + (b) * (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++)
434  p->lpc_filter[i] = dss_sp_filter_cb[i][p->fparam.filter_idx[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] *
469  dss_sp_pulse_val[sf->pulse_val[i]] +
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] << 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] * filter_buf[i];
528 
529  for (i = 14; i > 0; i--)
530  error_buf[i] = error_buf[i - 1];
531 
532  tmp = (tmp + 4096) >> 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 
764  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
765  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed.\n");
766  return ret;
767  }
768 
769  out = (int16_t *)frame->data[0];
770 
771  dss_sp_decode_one_frame(p, out, buf);
772 
773  *got_frame_ptr = 1;
774 
775  return DSS_SP_FRAME_SIZE;
776 }
777 
779  .name = "dss_sp",
780  .long_name = NULL_IF_CONFIG_SMALL("Digital Speech Standard - Standard Play mode (DSS SP)"),
781  .type = AVMEDIA_TYPE_AUDIO,
782  .id = AV_CODEC_ID_DSS_SP,
783  .priv_data_size = sizeof(DssSpContext),
786  .capabilities = AV_CODEC_CAP_DR1,
787 };
DssSpFrame fparam
Definition: dss_sp.c:56
const char const char void * val
Definition: avisynth_c.h:634
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:181
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:101
AVCodec ff_dss_sp_decoder
Definition: dss_sp.c:778
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:260
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
memory handling functions
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static const uint16_t dss_sp_adaptive_gain[]
Definition: dss_sp.c:271
int size
Definition: avcodec.h:1468
AVCodecContext * avctx
Definition: dss_sp.c:53
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:53
static void dss_sp_32to16bit(int16_t *dst, int32_t *src, int size)
Definition: dss_sp.c:698
static void dss_sp_gen_exc(int32_t *vector, int32_t *prev_exc, int pitch_lag, int gain)
Definition: dss_sp.c:473
static const uint32_t dss_sp_combinatorial_table[PULSE_MAX][72]
Definition: dss_sp.c:75
AVCodec.
Definition: avcodec.h:3392
uint8_t bits[DSS_SP_FRAME_SIZE+AV_INPUT_BUFFER_PADDING_SIZE]
Definition: dss_sp.c:69
int32_t combined_pulse_pos
Definition: dss_sp.c:40
static void dss_sp_unpack_filter(DssSpContext *p)
Definition: dss_sp.c:429
#define DSS_SP_FRAME_SIZE
Definition: dss_sp.c:34
uint8_t bits
Definition: crc.c:295
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:2295
uint8_t
#define av_cold
Definition: attributes.h:82
static void dss_sp_shift_sq_add(const int32_t *filter_buf, int32_t *audio_buf, int32_t *dst)
Definition: dss_sp.c:540
AVOptions.
int32_t vector_buf[72]
Definition: dss_sp.c:62
static void dss_sp_convert_coeffs(int32_t *lpc_filter, int32_t *coeffs)
Definition: dss_sp.c:437
static AVFrame * frame
static void dss_sp_update_buf(int32_t *hist, int32_t *vector)
Definition: dss_sp.c:505
uint8_t * data
Definition: avcodec.h:1467
int32_t err_buf2[15]
Definition: dss_sp.c:64
bitstream reader API header.
int32_t excitation[288+6]
Definition: dss_sp.c:54
ptrdiff_t size
Definition: opengl_enc.c:101
#define SUBFRAMES
Definition: dss_sp.c:31
#define av_log(a,...)
int32_t lpc_filter[14]
Definition: dss_sp.c:60
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
static int dss_sp_vector_sum(DssSpContext *p, int size)
Definition: dss_sp.c:588
static void dss_sp_add_pulses(int32_t *vector_buf, const struct DssSpSubframe *sf)
Definition: dss_sp.c:462
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:176
int32_t history[187]
Definition: dss_sp.c:55
const char * name
Name of the codec implementation.
Definition: avcodec.h:3399
static int dss_sp_get_normalize_bits(int32_t *vector_buf, int16_t size)
Definition: dss_sp.c:573
static const int16_t dss_sp_filter_cb[14][32]
Definition: dss_sp.c:174
static const uint8_t offset[127][2]
Definition: vf_spp.c:92
#define DSS_SP_SAMPLE_COUNT
Definition: dss_sp.c:35
static av_cold int dss_sp_decode_init(AVCodecContext *avctx)
Definition: dss_sp.c:290
uint64_t channel_layout
Audio channel layout.
Definition: avcodec.h:2338
audio channel layout utility functions
#define DSS_SP_FORMULA(a, b, c)
Definition: dss_sp.c:36
struct DssSpSubframe sf[SUBFRAMES]
Definition: dss_sp.c:49
static const int32_t dss_sp_sinc[67]
Definition: dss_sp.c:278
static void dss_sp_update_state(DssSpContext *p, int32_t *dst)
Definition: dss_sp.c:669
int32_t
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
int16_t pulse_pos[7]
Definition: dss_sp.c:41
int32_t audio_buf[15]
Definition: dss_sp.c:58
#define src
Definition: vp9dsp.c:530
#define FF_ARRAY_ELEMS(a)
FILE * out
Definition: movenc-test.c:54
int pulse_dec_mode
Definition: dss_sp.c:66
static int noise(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe)
Definition: noise_bsf.c:28
Libavcodec external API header.
static const uint16_t dss_sp_unc_decreasing_array[]
Definition: dss_sp.c:266
int sample_rate
samples per second
Definition: avcodec.h:2287
main external API structure.
Definition: avcodec.h:1532
static void dss_sp_vec_mult(const int32_t *src, int32_t *dst, const int16_t *mult)
Definition: dss_sp.c:562
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: utils.c:894
void * buf
Definition: avisynth_c.h:553
static int16_t mult(Float11 *f1, Float11 *f2)
Definition: g726.c:55
#define PULSE_MAX
Definition: dss_sp.c:32
int index
Definition: gxfenc.c:89
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:418
static void dss_sp_unpack_coeffs(DssSpContext *p, const uint8_t *src)
Definition: dss_sp.c:305
static void dss_sp_sf_synthesis(DssSpContext *p, int32_t lpc_filter, int32_t *dst, int size)
Definition: dss_sp.c:596
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:345
int16_t sf_adaptive_gain[SUBFRAMES]
Definition: dss_sp.c:47
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:192
int noise_state
Definition: dss_sp.c:63
static void dss_sp_scale_vector(int32_t *vec, int bits, int size)
Definition: dss_sp.c:493
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
Definition: ccaption_dec.c:572
static int dss_sp_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: dss_sp.c:743
common internal api header.
int32_t err_buf1[15]
Definition: dss_sp.c:59
common internal and external API header
signed 16 bits
Definition: samplefmt.h:62
int32_t filter[15]
Definition: dss_sp.c:61
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
Definition: avcodec.h:635
int32_t working_buffer[SUBFRAMES][72]
Definition: dss_sp.c:57
void * priv_data
Definition: avcodec.h:1574
static const int16_t coeffs[]
int channels
number of audio channels
Definition: avcodec.h:2288
int16_t pitch_lag[SUBFRAMES]
Definition: dss_sp.c:48
int16_t filter_idx[14]
Definition: dss_sp.c:46
static void dss_sp_shift_sq_sub(const int32_t *filter_buf, int32_t *error_buf, int32_t *dst)
Definition: dss_sp.c:516
int16_t gain
Definition: dss_sp.c:39
static int dss_sp_decode_one_frame(DssSpContext *p, int16_t *abuf_dst, const uint8_t *abuf_src)
Definition: dss_sp.c:706
int16_t pulse_val[7]
Definition: dss_sp.c:42
static const uint16_t dss_sp_fixed_cb_gain[64]
Definition: dss_sp.c:246
#define AV_CH_LAYOUT_MONO
static const int16_t dss_sp_pulse_val[8]
Definition: dss_sp.c:257
This structure stores compressed data.
Definition: avcodec.h:1444
static const uint16_t binary_decreasing_array[]
Definition: dss_sp.c:261
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:235
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:856
for(j=16;j >0;--j)