1 /*
2 * QCELP decoder
3 * Copyright (c) 2007 Reynaldo H. Verdejo Pinochet
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
22 /**
23 * @file
24 * QCELP decoder
25 * @author Reynaldo H. Verdejo Pinochet
26 * @remark FFmpeg merging spearheaded by Kenan Gillet
27 * @remark Development mentored by Benjamin Larson
28 */
29
30 #include <stddef.h>
31
43
45 I_F_Q = -1,
/**< insufficient frame quality */
52
57
73
74 /* postfilter */
79
80 /**
81 * Initialize the speech codec according to the specification.
82 *
83 * TIA/EIA/IS-733 2.4.9
84 */
86 {
88 int i;
89
93
94 for (i = 0; i < 10; i++)
96
97 return 0;
98 }
99
100 /**
101 * Decode the 10 quantized LSP frequencies from the LSPV/LSP
102 * transmission codes of any bitrate and check for badly received packets.
103 *
104 * @param q the context
105 * @param lspf line spectral pair frequencies
106 *
107 * @return 0 on success, -1 if the packet is badly received
108 *
109 * TIA/EIA/IS-733 2.4.3.2.6.2-2, 2.4.8.7.3
110 */
112 {
113 int i;
114 float tmp_lspf, smooth, erasure_coeff;
115 const float *predictors;
116
121
124
125 for (i = 0; i < 10; i++) {
131 }
133 } else {
135
137
140
141 for (i = 0; i < 10; i++) {
143 lspf[i] = (i + 1) * (1 - erasure_coeff) / 11 +
144 erasure_coeff * predictors[i];
145 }
146 smooth = 0.125;
147 }
148
149 // Check the stability of the LSP frequencies.
151 for (i = 1; i < 10; i++)
153
155 for (i = 9; i > 0; i--)
157
158 // Low-pass filter the LSP frequencies.
160 } else {
162
163 tmp_lspf = 0.0;
164 for (i = 0; i < 5; i++) {
167 }
168
169 // Check for badly received packets.
171 if (lspf[9] <= .70 || lspf[9] >= .97)
172 return -1;
173 for (i = 3; i < 10; i++)
174 if (fabs(lspf[i] - lspf[i - 2]) < .08)
175 return -1;
176 } else {
177 if (lspf[9] <= .66 || lspf[9] >= .985)
178 return -1;
179 for (i = 4; i < 10; i++)
180 if (fabs(lspf[i] - lspf[i - 4]) < .0931)
181 return -1;
182 }
183 }
184 return 0;
185 }
186
187 /**
188 * Convert codebook transmission codes to GAIN and INDEX.
189 *
190 * @param q the context
191 * @param gain array holding the decoded gain
192 *
193 * TIA/EIA/IS-733 2.4.6.2
194 */
196 {
197 int i, subframes_count, g1[16];
198 float slope;
199
202 case RATE_FULL: subframes_count = 16;
break;
203 case RATE_HALF: subframes_count = 4;
break;
204 default: subframes_count = 5;
205 }
206 for (i = 0; i < subframes_count; i++) {
209 g1[i] += av_clip((g1[i - 1] + g1[i - 2] + g1[i - 3]) / 3 - 6, 0, 32);
210 }
211
213
215 gain[i] = -gain[i];
217 }
218 }
219
223
225 // Provide smoothing of the unvoiced excitation energy.
226 gain[7] = gain[4];
227 gain[6] = 0.4 * gain[3] + 0.6 * gain[4];
228 gain[5] = gain[3];
229 gain[4] = 0.8 * gain[2] + 0.2 * gain[3];
230 gain[3] = 0.2 * gain[1] + 0.8 * gain[2];
231 gain[2] = gain[1];
232 gain[1] = 0.6 * gain[0] + 0.4 * gain[1];
233 }
238 subframes_count = 8;
239 } else {
241
244 case 1 : break;
245 case 2 : g1[0] -= 1; break;
246 case 3 : g1[0] -= 2; break;
247 default: g1[0] -= 6;
248 }
249 if (g1[0] < 0)
250 g1[0] = 0;
251 subframes_count = 4;
252 }
253 // This interpolation is done to produce smoother background noise.
255 for (i = 1; i <= subframes_count; i++)
257
261 }
262 }
263
264 /**
265 * If the received packet is Rate 1/4 a further sanity check is made of the
266 * codebook gain.
267 *
268 * @param cbgain the unpacked cbgain array
269 * @return -1 if the sanity check fails, 0 otherwise
270 *
271 * TIA/EIA/IS-733 2.4.8.7.3
272 */
274 {
275 int i,
diff, prev_diff = 0;
276
277 for (i = 1; i < 5; i++) {
278 diff = cbgain[i] - cbgain[i-1];
279 if (
FFABS(diff) > 10)
280 return -1;
281 else if (
FFABS(diff - prev_diff) > 12)
282 return -1;
284 }
285 return 0;
286 }
287
288 /**
289 * Compute the scaled codebook vector Cdn From INDEX and GAIN
290 * for all rates.
291 *
292 * The specification lacks some information here.
293 *
294 * TIA/EIA/IS-733 has an omission on the codebook index determination
295 * formula for RATE_FULL and RATE_HALF frames at section 2.4.8.1.1. It says
296 * you have to subtract the decoded index parameter from the given scaled
297 * codebook vector index 'n' to get the desired circular codebook index, but
298 * it does not mention that you have to clamp 'n' to [0-9] in order to get
299 * RI-compliant results.
300 *
301 * The reason for this mistake seems to be the fact they forgot to mention you
302 * have to do these calculations per codebook subframe and adjust given
303 * equation values accordingly.
304 *
305 * @param q the context
306 * @param gain array holding the 4 pitch subframe gain values
307 * @param cdn_vector array for the generated scaled codebook vector
308 */
310 float *cdn_vector)
311 {
312 int i, j, k;
313 uint16_t cbseed, cindex;
314 float *rnd, tmp_gain, fir_filter_value;
315
318 for (i = 0; i < 16; i++) {
321 for (j = 0; j < 10; j++)
322 *cdn_vector++ = tmp_gain *
324 }
325 break;
327 for (i = 0; i < 4; i++) {
330 for (j = 0; j < 40; j++)
331 *cdn_vector++ = tmp_gain *
333 }
334 break;
336 cbseed = (0x0003 & q->
frame.
lspv[4]) << 14 |
342 for (i = 0; i < 8; i++) {
344 for (k = 0; k < 20; k++) {
345 cbseed = 521 * cbseed + 259;
346 *rnd = (int16_t) cbseed;
347
348 // FIR filter
349 fir_filter_value = 0.0;
350 for (j = 0; j < 10; j++)
352 (rnd[-j] + rnd[-20+j]);
353
355 *cdn_vector++ = tmp_gain * fir_filter_value;
356 rnd++;
357 }
358 }
360 20 * sizeof(float));
361 break;
364 for (i = 0; i < 8; i++) {
366 for (j = 0; j < 20; j++) {
367 cbseed = 521 * cbseed + 259;
368 *cdn_vector++ = tmp_gain * (int16_t) cbseed;
369 }
370 }
371 break;
373 cbseed = -44; // random codebook index
374 for (i = 0; i < 4; i++) {
376 for (j = 0; j < 40; j++)
377 *cdn_vector++ = tmp_gain *
379 }
380 break;
382 memset(cdn_vector, 0, 160 * sizeof(float));
383 break;
384 }
385 }
386
387 /**
388 * Apply generic gain control.
389 *
390 * @param v_out output vector
391 * @param v_in gain-controlled vector
392 * @param v_ref vector to control gain of
393 *
394 * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
395 */
397 {
398 int i;
399
400 for (i = 0; i < 160; i += 40) {
403 }
404 }
405
406 /**
407 * Apply filter in pitch-subframe steps.
408 *
409 * @param memory buffer for the previous state of the filter
410 * - must be able to contain 303 elements
411 * - the 143 first elements are from the previous state
412 * - the next 160 are for output
413 * @param v_in input filter vector
414 * @param gain per-subframe gain array, each element is between 0.0 and 2.0
415 * @param lag per-subframe lag array, each element is
416 * - between 16 and 143 if its corresponding pfrac is 0,
417 * - between 16 and 139 otherwise
418 * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
419 * otherwise
420 *
421 * @return filter output vector
422 */
424 const float gain[4],
const uint8_t *lag,
426 {
427 int i, j;
428 float *v_lag, *v_out;
429 const float *v_len;
430
431 v_out = memory + 143; // Output vector starts at memory[143].
432
433 for (i = 0; i < 4; i++) {
434 if (gain[i]) {
435 v_lag = memory + 143 + 40 * i - lag[i];
436 for (v_len = v_in + 40; v_in < v_len; v_in++) {
437 if (pfrac[i]) { // If it is a fractional lag...
438 for (j = 0, *v_out = 0.0; j < 4; j++)
440 (v_lag[j - 4] + v_lag[3 - j]);
441 } else
442 *v_out = *v_lag;
443
444 *v_out = *v_in + gain[i] * *v_out;
445
446 v_lag++;
447 v_out++;
448 }
449 } else {
450 memcpy(v_out, v_in, 40 * sizeof(float));
451 v_in += 40;
452 v_out += 40;
453 }
454 }
455
456 memmove(memory, memory + 160, 143 * sizeof(float));
457 return memory + 143;
458 }
459
460 /**
461 * Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
462 * TIA/EIA/IS-733 2.4.5.2, 2.4.8.7.2
463 *
464 * @param q the context
465 * @param cdn_vector the scaled codebook vector
466 */
468 {
469 int i;
470 const float *v_synthesis_filtered, *v_pre_filtered;
471
474
476 // Compute gain & lag for the whole frame.
477 for (i = 0; i < 4; i++) {
479
481 }
482 } else {
483 float max_pitch_gain;
484
488 else
489 max_pitch_gain = 0.0;
490 } else {
492 max_pitch_gain = 1.0;
493 }
494 for (i = 0; i < 4; i++)
496
498 }
499
500 // pitch synthesis filter
504
505 // pitch prefilter update
506 for (i = 0; i < 4; i++)
508
510 v_synthesis_filtered,
513
515 } else {
517 cdn_vector + 17, 143 * sizeof(float));
521 }
522 }
523
524 /**
525 * Reconstruct LPC coefficients from the line spectral pair frequencies
526 * and perform bandwidth expansion.
527 *
528 * @param lspf line spectral pair frequencies
529 * @param lpc linear predictive coding coefficients
530 *
531 * @note: bandwidth_expansion_coeff could be precalculated into a table
532 * but it seems to be slower on x86
533 *
534 * TIA/EIA/IS-733 2.4.3.3.5
535 */
536 static void lspf2lpc(
const float *lspf,
float *lpc)
537 {
538 double lsp[10];
540 int i;
541
542 for (i = 0; i < 10; i++)
543 lsp[i] = cos(
M_PI * lspf[i]);
544
546
547 for (i = 0; i < 10; i++) {
548 lpc[i] *= bandwidth_expansion_coeff;
550 }
551 }
552
553 /**
554 * Interpolate LSP frequencies and compute LPC coefficients
555 * for a given bitrate & pitch subframe.
556 *
557 * TIA/EIA/IS-733 2.4.3.3.4, 2.4.8.7.2
558 *
559 * @param q the context
560 * @param curr_lspf LSP frequencies vector of the current frame
561 * @param lpc float vector for the resulting LPC
562 * @param subframe_num frame number in decoded stream
563 */
565 float *lpc, const int subframe_num)
566 {
567 float interpolated_lspf[10];
569
571 weight = 0.25 * (subframe_num + 1);
573 weight = 0.625;
574 else
575 weight = 1.0;
576
577 if (weight != 1.0) {
579 weight, 1.0 - weight, 10);
586 }
587
589 {
590 switch (buf_size) {
596 }
597
599 }
600
601 /**
602 * Determine the bitrate from the frame size and/or the first byte of the frame.
603 *
604 * @param avctx the AV codec context
605 * @param buf_size length of the buffer
606 * @param buf the bufffer
607 *
608 * @return the bitrate on success,
609 * I_F_Q if the bitrate cannot be satisfactorily determined
610 *
611 * TIA/EIA/IS-733 2.4.8.7.1
612 */
614 const int buf_size,
616 {
618
620 if (bitrate > **buf) {
624 "Claimed bitrate and buffer size mismatch.\n");
626 }
628 } else if (bitrate < **buf) {
630 "Buffer is too small for the claimed bitrate.\n");
632 }
633 (*buf)++;
636 "Bitrate byte missing, guessing bitrate from packet size.\n");
637 } else
639
641 // FIXME: Remove this warning when tested with samples.
643 }
644 return bitrate;
645 }
646
648 const char *message)
649 {
652 }
653
655 {
656 static const float pow_0_775[10] = {
657 0.775000, 0.600625, 0.465484, 0.360750, 0.279582,
658 0.216676, 0.167924, 0.130141, 0.100859, 0.078166
659 }, pow_0_625[10] = {
660 0.625000, 0.390625, 0.244141, 0.152588, 0.095367,
661 0.059605, 0.037253, 0.023283, 0.014552, 0.009095
662 };
663 float lpc_s[10], lpc_p[10], pole_out[170], zero_out[160];
665
666 for (n = 0; n < 10; n++) {
667 lpc_s[
n] = lpc[
n] * pow_0_625[
n];
668 lpc_p[
n] = lpc[
n] * pow_0_775[
n];
669 }
670
676
678
682 160),
684 }
685
687 int *got_frame_ptr,
AVPacket *avpkt)
688 {
690 int buf_size = avpkt->
size;
693 float *outbuffer;
695 float quantized_lspf[10], lpc[10];
696 float gain[16];
697 float *formant_mem;
698
699 /* get output buffer */
703 outbuffer = (
float *)frame->
data[0];
704
707 goto erasure;
708 }
709
713 goto erasure;
714 }
715
721
723 return ret;
724
726
727 for (; bitmaps < bitmaps_end; bitmaps++)
729
730 // Check for erasures/blanks on rates 1, 1/4 and 1/8.
733 goto erasure;
734 }
738 goto erasure;
739 }
740
742 for (i = 0; i < 4; i++) {
745 goto erasure;
746 }
747 }
748 }
749 }
750
753
756 goto erasure;
757 }
758
760
762 erasure:
769 } else
771
773 for (i = 0; i < 4; i++) {
776 outbuffer + i * 40, 40, 10);
777 formant_mem += 40;
778 }
779
780 // postfilter, as per TIA/EIA/IS-733 2.4.8.6
782
784
787
788 *got_frame_ptr = 1;
789
790 return buf_size;
791 }
792
802 };