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
42
44 I_F_Q = -1,
/**< insufficient frame quality */
51
56
58 uint8_t
octave_count;
/**< count the consecutive RATE_OCTAVE frames */
72
73 /* postfilter */
78
79 /**
80 * Initialize the speech codec according to the specification.
81 *
82 * TIA/EIA/IS-733 2.4.9
83 */
85 {
88
94
95 for (
i = 0;
i < 10;
i++)
97
98 return 0;
99 }
100
101 /**
102 * Decode the 10 quantized LSP frequencies from the LSPV/LSP
103 * transmission codes of any bitrate and check for badly received packets.
104 *
105 * @param q the context
106 * @param lspf line spectral pair frequencies
107 *
108 * @return 0 on success, -1 if the packet is badly received
109 *
110 * TIA/EIA/IS-733 2.4.3.2.6.2-2, 2.4.8.7.3
111 */
113 {
115 float tmp_lspf,
smooth, erasure_coeff;
116 const float *predictors;
117
122
125
126 for (
i = 0;
i < 10;
i++) {
132 }
134 } else {
136
138
141
142 for (
i = 0;
i < 10;
i++) {
144 lspf[
i] = (
i + 1) * (1 - erasure_coeff) / 11 +
145 erasure_coeff * predictors[
i];
146 }
148 }
149
150 // Check the stability of the LSP frequencies.
152 for (
i = 1;
i < 10;
i++)
154
156 for (
i = 9;
i > 0;
i--)
158
159 // Low-pass filter the LSP frequencies.
161 } else {
163
164 tmp_lspf = 0.0;
165 for (
i = 0;
i < 5;
i++) {
168 }
169
170 // Check for badly received packets.
172 if (lspf[9] <= .70 || lspf[9] >= .97)
173 return -1;
174 for (
i = 3;
i < 10;
i++)
175 if (
fabs(lspf[
i] - lspf[
i - 2]) < .08)
176 return -1;
177 } else {
178 if (lspf[9] <= .66 || lspf[9] >= .985)
179 return -1;
180 for (
i = 4;
i < 10;
i++)
181 if (
fabs(lspf[
i] - lspf[
i - 4]) < .0931)
182 return -1;
183 }
184 }
185 return 0;
186 }
187
188 /**
189 * Convert codebook transmission codes to GAIN and INDEX.
190 *
191 * @param q the context
192 * @param gain array holding the decoded gain
193 *
194 * TIA/EIA/IS-733 2.4.6.2
195 */
197 {
198 int i, subframes_count, g1[16];
199 float slope;
200
203 case RATE_FULL: subframes_count = 16;
break;
204 case RATE_HALF: subframes_count = 4;
break;
205 default: subframes_count = 5;
206 }
207 for (
i = 0;
i < subframes_count;
i++) {
210 g1[
i] +=
av_clip((g1[
i - 1] + g1[
i - 2] + g1[
i - 3]) / 3 - 6, 0, 32);
211 }
212
214
218 }
219 }
220
224
226 // Provide smoothing of the unvoiced excitation energy.
227 gain[7] = gain[4];
228 gain[6] = 0.4 * gain[3] + 0.6 * gain[4];
229 gain[5] = gain[3];
230 gain[4] = 0.8 * gain[2] + 0.2 * gain[3];
231 gain[3] = 0.2 * gain[1] + 0.8 * gain[2];
232 gain[2] = gain[1];
233 gain[1] = 0.6 * gain[0] + 0.4 * gain[1];
234 }
239 subframes_count = 8;
240 } else {
242
245 case 1 : break;
246 case 2 : g1[0] -= 1; break;
247 case 3 : g1[0] -= 2; break;
248 default: g1[0] -= 6;
249 }
250 if (g1[0] < 0)
251 g1[0] = 0;
252 subframes_count = 4;
253 }
254 // This interpolation is done to produce smoother background noise.
256 for (
i = 1;
i <= subframes_count;
i++)
258
262 }
263 }
264
265 /**
266 * If the received packet is Rate 1/4 a further sanity check is made of the
267 * codebook gain.
268 *
269 * @param cbgain the unpacked cbgain array
270 * @return -1 if the sanity check fails, 0 otherwise
271 *
272 * TIA/EIA/IS-733 2.4.8.7.3
273 */
275 {
276 int i,
diff, prev_diff = 0;
277
278 for (
i = 1;
i < 5;
i++) {
279 diff = cbgain[
i] - cbgain[
i-1];
281 return -1;
283 return -1;
285 }
286 return 0;
287 }
288
289 /**
290 * Compute the scaled codebook vector Cdn From INDEX and GAIN
291 * for all rates.
292 *
293 * The specification lacks some information here.
294 *
295 * TIA/EIA/IS-733 has an omission on the codebook index determination
296 * formula for RATE_FULL and RATE_HALF frames at section 2.4.8.1.1. It says
297 * you have to subtract the decoded index parameter from the given scaled
298 * codebook vector index 'n' to get the desired circular codebook index, but
299 * it does not mention that you have to clamp 'n' to [0-9] in order to get
300 * RI-compliant results.
301 *
302 * The reason for this mistake seems to be the fact they forgot to mention you
303 * have to do these calculations per codebook subframe and adjust given
304 * equation values accordingly.
305 *
306 * @param q the context
307 * @param gain array holding the 4 pitch subframe gain values
308 * @param cdn_vector array for the generated scaled codebook vector
309 */
311 float *cdn_vector)
312 {
314 uint16_t cbseed, cindex;
315 float *
rnd, tmp_gain, fir_filter_value;
316
319 for (
i = 0;
i < 16;
i++) {
322 for (j = 0; j < 10; j++)
323 *cdn_vector++ = tmp_gain *
325 }
326 break;
328 for (
i = 0;
i < 4;
i++) {
331 for (j = 0; j < 40; j++)
332 *cdn_vector++ = tmp_gain *
334 }
335 break;
337 cbseed = (0x0003 & q->
frame.
lspv[4]) << 14 |
343 for (
i = 0;
i < 8;
i++) {
345 for (k = 0; k < 20; k++) {
346 cbseed = 521 * cbseed + 259;
347 *
rnd = (int16_t) cbseed;
348
349 // FIR filter
350 fir_filter_value = 0.0;
351 for (j = 0; j < 10; j++)
354
356 *cdn_vector++ = tmp_gain * fir_filter_value;
358 }
359 }
361 20 * sizeof(float));
362 break;
365 for (
i = 0;
i < 8;
i++) {
367 for (j = 0; j < 20; j++) {
368 cbseed = 521 * cbseed + 259;
369 *cdn_vector++ = tmp_gain * (int16_t) cbseed;
370 }
371 }
372 break;
374 cbseed = -44; // random codebook index
375 for (
i = 0;
i < 4;
i++) {
377 for (j = 0; j < 40; j++)
378 *cdn_vector++ = tmp_gain *
380 }
381 break;
383 memset(cdn_vector, 0, 160 * sizeof(float));
384 break;
385 }
386 }
387
388 /**
389 * Apply generic gain control.
390 *
391 * @param v_out output vector
392 * @param v_in gain-controlled vector
393 * @param v_ref vector to control gain of
394 *
395 * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
396 */
398 {
400
401 for (
i = 0;
i < 160;
i += 40) {
404 }
405 }
406
407 /**
408 * Apply filter in pitch-subframe steps.
409 *
410 * @param memory buffer for the previous state of the filter
411 * - must be able to contain 303 elements
412 * - the 143 first elements are from the previous state
413 * - the next 160 are for output
414 * @param v_in input filter vector
415 * @param gain per-subframe gain array, each element is between 0.0 and 2.0
416 * @param lag per-subframe lag array, each element is
417 * - between 16 and 143 if its corresponding pfrac is 0,
418 * - between 16 and 139 otherwise
419 * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
420 * otherwise
421 *
422 * @return filter output vector
423 */
425 const float gain[4], const uint8_t *lag,
426 const uint8_t pfrac[4])
427 {
429 float *v_lag, *v_out;
430 const float *v_len;
431
432 v_out = memory + 143; // Output vector starts at memory[143].
433
434 for (
i = 0;
i < 4;
i++) {
436 v_lag = memory + 143 + 40 *
i - lag[
i];
437 for (v_len = v_in + 40; v_in < v_len; v_in++) {
438 if (pfrac[
i]) {
// If it is a fractional lag...
439 for (j = 0, *v_out = 0.0; j < 4; j++)
441 (v_lag[j - 4] + v_lag[3 - j]);
442 } else
443 *v_out = *v_lag;
444
445 *v_out = *v_in + gain[
i] * *v_out;
446
447 v_lag++;
448 v_out++;
449 }
450 } else {
451 memcpy(v_out, v_in, 40 * sizeof(float));
452 v_in += 40;
453 v_out += 40;
454 }
455 }
456
457 memmove(memory, memory + 160, 143 * sizeof(float));
458 return memory + 143;
459 }
460
461 /**
462 * Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
463 * TIA/EIA/IS-733 2.4.5.2, 2.4.8.7.2
464 *
465 * @param q the context
466 * @param cdn_vector the scaled codebook vector
467 */
469 {
471 const float *v_synthesis_filtered, *v_pre_filtered;
472
475
477 // Compute gain & lag for the whole frame.
478 for (
i = 0;
i < 4;
i++) {
480
482 }
483 } else {
484 float max_pitch_gain;
485
489 else
490 max_pitch_gain = 0.0;
491 } else {
493 max_pitch_gain = 1.0;
494 }
495 for (
i = 0;
i < 4;
i++)
497
499 }
500
501 // pitch synthesis filter
505
506 // pitch prefilter update
507 for (
i = 0;
i < 4;
i++)
509
511 v_synthesis_filtered,
514
516 } else {
518 cdn_vector + 17, 143 * sizeof(float));
522 }
523 }
524
525 /**
526 * Reconstruct LPC coefficients from the line spectral pair frequencies
527 * and perform bandwidth expansion.
528 *
529 * @param lspf line spectral pair frequencies
530 * @param lpc linear predictive coding coefficients
531 *
532 * @note: bandwidth_expansion_coeff could be precalculated into a table
533 * but it seems to be slower on x86
534 *
535 * TIA/EIA/IS-733 2.4.3.3.5
536 */
537 static void lspf2lpc(
const float *lspf,
float *lpc)
538 {
539 double lsp[10];
542
543 for (
i = 0;
i < 10;
i++)
544 lsp[
i] = cos(
M_PI * lspf[
i]);
545
547
548 for (
i = 0;
i < 10;
i++) {
549 lpc[
i] *= bandwidth_expansion_coeff;
551 }
552 }
553
554 /**
555 * Interpolate LSP frequencies and compute LPC coefficients
556 * for a given bitrate & pitch subframe.
557 *
558 * TIA/EIA/IS-733 2.4.3.3.4, 2.4.8.7.2
559 *
560 * @param q the context
561 * @param curr_lspf LSP frequencies vector of the current frame
562 * @param lpc float vector for the resulting LPC
563 * @param subframe_num frame number in decoded stream
564 */
566 float *lpc, const int subframe_num)
567 {
568 float interpolated_lspf[10];
570
572 weight = 0.25 * (subframe_num + 1);
575 else
577
587 }
588
590 {
591 switch (buf_size) {
597 }
598
600 }
601
602 /**
603 * Determine the bitrate from the frame size and/or the first byte of the frame.
604 *
605 * @param avctx the AV codec context
606 * @param buf_size length of the buffer
607 * @param buf the buffer
608 *
609 * @return the bitrate on success,
610 * I_F_Q if the bitrate cannot be satisfactorily determined
611 *
612 * TIA/EIA/IS-733 2.4.8.7.1
613 */
615 const int buf_size,
616 const uint8_t **buf)
617 {
619
625 "Claimed bitrate and buffer size mismatch.\n");
627 }
631 "Buffer is too small for the claimed bitrate.\n");
633 }
634 (*buf)++;
637 "Bitrate byte missing, guessing bitrate from packet size.\n");
638 } else
640
642 // FIXME: Remove this warning when tested with samples.
644 }
646 }
647
650 {
653 }
654
656 {
657 static const float pow_0_775[10] = {
658 0.775000, 0.600625, 0.465484, 0.360750, 0.279582,
659 0.216676, 0.167924, 0.130141, 0.100859, 0.078166
660 }, pow_0_625[10] = {
661 0.625000, 0.390625, 0.244141, 0.152588, 0.095367,
662 0.059605, 0.037253, 0.023283, 0.014552, 0.009095
663 };
664 float lpc_s[10], lpc_p[10], pole_out[170], zero_out[160];
665 int n;
666
667 for (n = 0; n < 10; n++) {
668 lpc_s[n] = lpc[n] * pow_0_625[n];
669 lpc_p[n] = lpc[n] * pow_0_775[n];
670 }
671
677
679
683 160),
685 }
686
688 int *got_frame_ptr,
AVPacket *avpkt)
689 {
690 const uint8_t *buf = avpkt->
data;
691 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 */
700 frame->nb_samples = 160;
703 outbuffer = (
float *)
frame->data[0];
704
707 goto erasure;
708 }
709
713 goto erasure;
714 }
715
720 uint8_t *unpacked_data = (uint8_t *)&q->
frame;
721
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 };