1 /*
2 * G.729, G729 Annex D decoders
3 * Copyright (c) 2008 Vladimir Voroshilov
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 #include <inttypes.h>
23 #include <string.h>
24
30
31
41
42 /**
43 * minimum quantized LSF value (3.2.4)
44 * 0.005 in Q13
45 */
47
48 /**
49 * maximum quantized LSF value (3.2.4)
50 * 3.135 in Q13
51 */
52 #define LSFQ_MAX 25681
53
54 /**
55 * minimum LSF distance (3.2.4)
56 * 0.0391 in Q13
57 */
58 #define LSFQ_DIFF_MIN 321
59
60 /// interpolation filter length
61 #define INTERPOL_LEN 11
62
63 /**
64 * minimum gain pitch value (3.8, Equation 47)
65 * 0.2 in (1.14)
66 */
67 #define SHARP_MIN 3277
68
69 /**
70 * maximum gain pitch value (3.8, Equation 47)
71 * (EE) This does not comply with the specification.
72 * Specification says about 0.8, which should be
73 * 13107 in (1.14), but reference C code uses
74 * 13017 (equals to 0.7945) instead of it.
75 */
76 #define SHARP_MAX 13017
77
78 /**
79 * MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13)
80 */
81 #define MR_ENERGY 1018156
82
83 #define DECISION_NOISE 0
84 #define DECISION_INTERMEDIATE 1
85 #define DECISION_VOICE 2
86
92
94 uint8_t ac_index_bits[2];
///< adaptive codebook index for second subframe (size in bits)
101
104
105 /// past excitation signal buffer
107
108 int16_t*
exc;
///< start of past excitation data in buffer
110
111 /// (2.13) LSP quantizer outputs
112 int16_t past_quantizer_output_buf[
MA_NP + 1][10];
113 int16_t* past_quantizer_outputs[
MA_NP + 1];
114
115 int16_t lsfq[10];
///< (2.13) quantized LSF coefficients from previous frame
116 int16_t lsp_buf[2][10];
///< (0.15) LSP coefficients (previous and current frames) (3.2.5)
117 int16_t *lsp[2];
///< pointers to lsp_buf
118
119 int16_t quant_energy[4];
///< (5.10) past quantized energy
120
121 /// previous speech data for LP synthesis filter
122 int16_t syn_filter_data[10];
123
124
125 /// residual signal buffer (used in long-term postfilter)
127
128 /// previous speech data for residual calculation filter
130
131 /// previous speech data for short-term postfilter
133
134 /// (1.14) pitch gain of current and five previous subframes
135 int16_t past_gain_pitch[6];
136
137 /// (14.1) gain code from current and previous subframe
138 int16_t past_gain_code[2];
139
140 /// voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
142
143 int16_t
onset;
///< detected onset level (0-2)
144 int16_t
was_periodic;
///< whether previous frame was declared as periodic or not (4.4)
147 uint16_t
rand_value;
///< random number generator value (4.4.4)
149
150 /// (14.14) high-pass filter data (past input)
152
153 /// high-pass filter data (past output)
156
159 .parity_bit = 1,
162 .fc_signs_bits = 4,
163 .fc_indexes_bits = 13,
164 };
165
168 .parity_bit = 0,
171 .fc_signs_bits = 2,
172 .fc_indexes_bits = 9,
173 };
174
175 /**
176 * @brief pseudo random number generator
177 */
179 {
180 return 31821 * value + 13849;
181 }
182
183 /**
184 * Decodes LSF (Line Spectral Frequencies) from L0-L3 (3.2.4).
185 * @param[out] lsfq (2.13) quantized LSF coefficients
186 * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames
187 * @param ma_predictor switched MA predictor of LSP quantizer
188 * @param vq_1st first stage vector of quantizer
189 * @param vq_2nd_low second stage lower vector of LSP quantizer
190 * @param vq_2nd_high second stage higher vector of LSP quantizer
191 */
193 int16_t ma_predictor,
194 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
195 {
196 int i,j;
197 static const uint8_t min_distance[2]={10, 5};
//(2.13)
198 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
199
200 for (i = 0; i < 5; i++) {
202 quantizer_output[i + 5] =
cb_lsp_1st[vq_1st][i + 5] + cb_lsp_2nd[vq_2nd_high][i + 5];
203 }
204
205 for (j = 0; j < 2; j++) {
206 for (i = 1; i < 10; i++) {
207 int diff = (quantizer_output[i - 1] - quantizer_output[i] + min_distance[j]) >> 1;
208 if (diff > 0) {
209 quantizer_output[i - 1] -=
diff;
210 quantizer_output[i ] +=
diff;
211 }
212 }
213 }
214
215 for (i = 0; i < 10; i++) {
217 for (j = 0; j <
MA_NP; j++)
218 sum += past_quantizer_outputs[j][i] *
cb_ma_predictor[ma_predictor][j][i];
219
220 lsfq[i] = sum >> 15;
221 }
222
224 }
225
226 /**
227 * Restores past LSP quantizer output using LSF from previous frame
228 * @param[in,out] lsfq (2.13) quantized LSF coefficients
229 * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames
230 * @param ma_predictor_prev MA predictor from previous frame
231 * @param lsfq_prev (2.13) quantized LSF coefficients from previous frame
232 */
234 int16_t* past_quantizer_outputs[
MA_NP + 1],
235 int ma_predictor_prev)
236 {
237 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
238 int i,k;
239
240 for (i = 0; i < 10; i++) {
241 int tmp = lsfq[i] << 15;
242
243 for (k = 0; k <
MA_NP; k++)
244 tmp -= past_quantizer_outputs[k][i] *
cb_ma_predictor[ma_predictor_prev][k][i];
245
247 }
248 }
249
250 /**
251 * Constructs new excitation signal and applies phase filter to it
252 * @param[out] out constructed speech signal
253 * @param in original excitation signal
254 * @param fc_cur (2.13) original fixed-codebook vector
255 * @param gain_code (14.1) gain code
256 * @param subframe_size length of the subframe
257 */
261 const int16_t* fc_cur,
262 int dstate,
263 int gain_code,
264 int subframe_size)
265 {
266 int i;
268
270
271 for(i=0; i<subframe_size; i++)
272 {
273 out[i] = in[i];
274 out[i] -= (gain_code * fc_cur[i] + 0x2000) >> 14;
275 out[i] += (gain_code * fc_new[i] + 0x2000) >> 14;
276 }
277 }
278
279 /**
280 * Makes decision about onset in current subframe
281 * @param past_onset decision result of previous subframe
282 * @param past_gain_code gain code of current and previous subframe
283 *
284 * @return onset decision result for current subframe
285 */
287 {
288 if((past_gain_code[0] >> 1) > past_gain_code[1])
289 return 2;
290 else
291 return FFMAX(past_onset-1, 0);
292 }
293
294 /**
295 * Makes decision about voice presence in current subframe
296 * @param onset onset level
297 * @param prev_voice_decision voice decision result from previous subframe
298 * @param past_gain_pitch pitch gain of current and previous subframes
299 *
300 * @return voice decision result for current subframe
301 */
303 {
304 int i, low_gain_pitch_cnt, voice_decision;
305
306 if(past_gain_pitch[0] >= 14745) // 0.9
308 else if (past_gain_pitch[0] <= 9830) // 0.6
310 else
312
313 for(i=0, low_gain_pitch_cnt=0; i<6; i++)
314 if(past_gain_pitch[i] < 9830)
315 low_gain_pitch_cnt++;
316
317 if(low_gain_pitch_cnt > 2 && !onset)
319
320 if(!onset && voice_decision > prev_voice_decision + 1)
321 voice_decision--;
322
324 voice_decision++;
325
326 return voice_decision;
327 }
328
330 {
331 int res = 0;
332
333 while (order--)
334 res += *v1++ * *v2++;
335
336 return res;
337 }
338
340 {
342 int i,k;
343
347 }
349
350 /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
352
354
355 for (k = 0; k <
MA_NP + 1; k++) {
357 for (i = 1; i < 11; i++)
359 }
360
363 memcpy(ctx->
lsp[0],
lsp_init, 10 *
sizeof(int16_t));
364
366
368
369 /* random seed initialization */
371
372 /* quantized prediction error */
373 for(i=0; i<4; i++)
375
378
379 return 0;
380 }
381
384 {
386 int buf_size = avpkt->
size;
387 int16_t *out_frame;
390 int frame_erasure = 0;
///< frame erasure detected during decoding
391 int bad_pitch = 0; ///< parity check failed
392 int i;
393 int16_t *tmp;
396 int16_t lp[2][11]; // (3.12)
397 uint8_t ma_predictor;
///< switched MA predictor of LSP quantizer
398 uint8_t quantizer_1st;
///< first stage vector of quantizer
399 uint8_t quantizer_2nd_lo;
///< second stage lower vector of quantizer (size in bits)
400 uint8_t quantizer_2nd_hi;
///< second stage higher vector of quantizer (size in bits)
401
402 int pitch_delay_int[2]; // pitch delay, integer part
403 int pitch_delay_3x; // pitch delay, multiplied by 3
406 int j, ret;
407 int gain_before, gain_after;
408 int is_periodic = 0; // whether one of the subframes is declared as periodic or not
410
413 return ret;
414 out_frame = (int16_t*) frame->
data[0];
415
416 if (buf_size % 10 == 0) {
419 //Reset voice decision
423 } else if (buf_size == 8) {
427 } else {
430 }
431
432 for (i=0; i < buf_size; i++)
433 frame_erasure |= buf[i];
435
437
442
443 if(frame_erasure)
446 else {
448 ma_predictor,
449 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
451 }
452
455 MA_NP *
sizeof(int16_t*));
457
459
461
463
464 for (i = 0; i < 2; i++) {
465 int gain_corr_factor;
466
467 uint8_t ac_index;
///< adaptive codebook index
468 uint8_t pulses_signs;
///< fixed-codebook vector pulse signs
469 int fc_indexes; ///< fixed-codebook indexes
470 uint8_t gc_1st_index;
///< gain codebook (first stage) index
471 uint8_t gc_2nd_index;
///< gain codebook (second stage) index
472
480
481 if (frame_erasure)
483 else if(!i) {
484 if (bad_pitch)
486 else
488 } else {
491
494 else
496 }
497
498 /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
499 pitch_delay_int[i] = (pitch_delay_3x + 1) / 3;
503 }
504
505 if (frame_erasure) {
508
511 }
512
513
515 switch (packet_type) {
519 fc_indexes, pulses_signs, 3, 3);
520 break;
524 fc_indexes, pulses_signs, 1, 4);
525 break;
526 }
527
528 /*
529 This filter enhances harmonic components of the fixed-codebook vector to
530 improve the quality of the reconstructed speech.
531
532 / fc_v[i], i < pitch_delay
533 fc_v[i] = <
534 \ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
535 */
537 fc + pitch_delay_int[i],
538 fc, 1 << 14,
540 0, 14,
541 SUBFRAME_SIZE - pitch_delay_int[i]);
542
545
546 if (frame_erasure) {
549
550 gain_corr_factor = 0;
551 } else {
556 cb_gain_2nd_6k4[gc_2nd_index][1];
557
558 /* Without check below overflow can occur in ff_acelp_update_past_gain.
559 It is not issue for G.729, because gain_corr_factor in it's case is always
560 greater than 1024, while in G.729D it can be even zero. */
561 gain_corr_factor =
FFMAX(gain_corr_factor, 1024);
562 #ifndef G729_BITEXACT
563 gain_corr_factor >>= 1;
564 #endif
565 } else {
569 cb_gain_2nd_8k[gc_2nd_index][1];
570 }
571
572 /* Decode the fixed-codebook gain. */
577 SUBFRAME_SIZE, 4);
578 #ifdef G729_BITEXACT
579 /*
580 This correction required to get bit-exact result with
581 reference code, because gain_corr_factor in G.729D is
582 two times larger than in original G.729.
583
584 If bit-exact result is not issue then gain_corr_factor
585 can be simpler divided by 2 before call to g729_get_gain_code
586 instead of using correction below.
587 */
589 gain_corr_factor >>= 1;
591 }
592 #endif
593 }
595
596 /* Routine requires rounding to lowest. */
598 ctx->
exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3,
600 (pitch_delay_3x % 3) << 1,
601 10, SUBFRAME_SIZE);
602
604 ctx->
exc + i * SUBFRAME_SIZE, fc,
607 1 << 13, 14, SUBFRAME_SIZE);
608
610
612 synth+10,
613 &lp[i][1],
614 ctx->
exc + i * SUBFRAME_SIZE,
615 SUBFRAME_SIZE,
616 10,
617 1,
618 0,
619 0x800))
620 /* Overflow occurred, downscale excitation signal... */
623
624 /* ... and make synthesis again. */
627
630
632
634 synth+10,
635 &lp[i][1],
636 exc_new,
637 SUBFRAME_SIZE,
638 10,
639 0,
640 0,
641 0x800);
642 } else {
644 synth+10,
645 &lp[i][1],
646 ctx->
exc + i * SUBFRAME_SIZE,
647 SUBFRAME_SIZE,
648 10,
649 0,
650 0,
651 0x800);
652 }
653 /* Save data (without postfilter) for use in next subframe. */
654 memcpy(ctx->
syn_filter_data, synth+SUBFRAME_SIZE, 10 *
sizeof(int16_t));
655
656 /* Calculate gain of unfiltered signal for use in AGC. */
657 gain_before = 0;
659 gain_before +=
FFABS(synth[j+10]);
660
661 /* Call postfilter and also update voicing decision for use in next frame. */
665 &is_periodic,
666 &lp[i][0],
667 pitch_delay_int[0],
671 synth+10,
672 SUBFRAME_SIZE);
673
674 /* Calculate gain of filtered signal for use in AGC. */
675 gain_after = 0;
677 gain_after +=
FFABS(synth[j+10]);
678
680 gain_before,
681 gain_after,
682 synth+10,
683 SUBFRAME_SIZE,
685
686 if (frame_erasure)
688 else
690
691 memcpy(synth+8, ctx->
hpf_z, 2*
sizeof(int16_t));
693 out_frame + i*SUBFRAME_SIZE,
695 synth+10,
696 SUBFRAME_SIZE);
697 memcpy(ctx->
hpf_z, synth+8+SUBFRAME_SIZE, 2*
sizeof(int16_t));
698 }
699
701
702 /* Save signal for use in next frame. */
704
705 *got_frame_ptr = 1;
707 }
708
718 };
uint16_t rand_value
random number generator value (4.4.4)
void ff_acelp_high_pass_filter(int16_t *out, int hpf_f[2], const int16_t *in, int length)
high-pass filtering and upscaling (4.2.5 of G.729).
void ff_acelp_fc_pulse_per_track(int16_t *fc_v, const uint8_t *tab1, const uint8_t *tab2, int pulse_indexes, int pulse_signs, int pulse_count, int bits)
Decode fixed-codebook vector (3.8 and D.5.8 of G.729, 5.7.1 of AMR).
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const int16_t cb_ma_predictor[2][MA_NP][10]
4th order Moving Average (MA) Predictor codebook (3.2.4 of G.729)
int32_t(* scalarproduct_int16)(const int16_t *v1, const int16_t *v2, int len)
Calculate scalar product of two vectors.
#define LSFQ_MIN
minimum quantized LSF value (3.2.4) 0.005 in Q13
This structure describes decoded (raw) audio or video data.
static const int16_t cb_gain_1st_6k4[1<< GC_1ST_IDX_BITS_6K4][2]
gain codebook (first stage), 6.4k mode (D.3.9.2 of G.729)
ptrdiff_t const GLvoid * data
void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order)
Convert LSF to LSP.
int16_t res_filter_data[SUBFRAME_SIZE+10]
previous speech data for residual calculation filter
#define GC_2ND_IDX_BITS_8K
gain codebook (second stage) index, 8k mode (size in bits)
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
static av_cold int init(AVCodecContext *avctx)
const int16_t ff_acelp_interp_filter[61]
low-pass Finite Impulse Response filter coefficients.
#define MR_ENERGY
MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7...
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int buffer_length, int filter_length, int stop_on_overflow, int shift, int rounder)
LP synthesis filter.
int hpf_f[2]
(14.14) high-pass filter data (past input)
const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay with 1/3 precision.
void ff_acelp_reorder_lsf(int16_t *lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order)
(I.F) means fixed-point value with F fractional and I integer bits
av_cold void ff_audiodsp_init(AudioDSPContext *c)
static const G729FormatDescription format_g729_8k
int ff_acelp_decode_8bit_to_1st_delay3(int ac_index)
Decode pitch delay of the first subframe encoded by 8 bits with 1/3 resolution.
int16_t lsp_buf[2][10]
(0.15) LSP coefficients (previous and current frames) (3.2.5)
#define LSFQ_DIFF_MIN
minimum LSF distance (3.2.4) 0.0391 in Q13
int16_t past_quantizer_output_buf[MA_NP+1][10]
(2.13) LSP quantizer outputs
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2, int order)
int16_t * exc
start of past excitation data in buffer
enum AVSampleFormat sample_fmt
audio sample format
const uint8_t ff_fc_4pulses_8bits_track_4[32]
Track|Pulse| Positions 4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78 | | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79
static void g729d_get_new_exc(int16_t *out, const int16_t *in, const int16_t *fc_cur, int dstate, int gain_code, int subframe_size)
Constructs new excitation signal and applies phase filter to it.
int16_t onset
detected onset level (0-2)
int ff_acelp_decode_5_6_bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay of the second subframe encoded by 5 or 6 bits with 1/3 precision.
int16_t past_gain_code[2]
(14.1) gain code from current and previous subframe
bitstream reader API header.
static int16_t g729d_voice_decision(int onset, int prev_voice_decision, const int16_t *past_gain_pitch)
Makes decision about voice presence in current subframe.
int16_t ff_g729_adaptive_gain_control(int gain_before, int gain_after, int16_t *speech, int subframe_size, int16_t gain_prev)
Adaptive gain control (4.2.4)
int16_t * past_quantizer_outputs[MA_NP+1]
static void lsf_decode(int16_t *lsfq, int16_t *past_quantizer_outputs[MA_NP+1], int16_t ma_predictor, int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
Decodes LSF (Line Spectral Frequencies) from L0-L3 (3.2.4).
int16_t hpf_z[2]
high-pass filter data (past output)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int16_t ht_prev_data
previous data for 4.2.3, equation 86
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int16_t lsfq[10]
(2.13) quantized LSF coefficients from previous frame
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define DECISION_INTERMEDIATE
const char * name
Name of the codec implementation.
void ff_celp_convolve_circ(int16_t *fc_out, const int16_t *fc_in, const int16_t *filter, int len)
Circularly convolve fixed vector with a phase dispersion impulse response filter (D.6.2 of G.729 and 6.1.5 of AMR).
static av_cold int decoder_init(AVCodecContext *avctx)
static const int16_t cb_gain_1st_8k[1<< GC_1ST_IDX_BITS_8K][2]
gain codebook (first stage), 8k mode (3.9.2 of G.729)
static const int16_t cb_lsp_2nd[1<< VQ_2ND_BITS][10]
second stage LSP codebook, high and low parts (both 5-dimensional, with 32 entries (3...
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
static const uint16_t fc[]
GLsizei GLboolean const GLfloat * value
#define GC_2ND_IDX_BITS_6K4
gain codebook (second stage) index, 6.4k mode (size in bits)
int16_t residual[SUBFRAME_SIZE+RES_PREV_DATA_SIZE]
residual signal buffer (used in long-term postfilter)
int pitch_delay_int_prev
integer part of previous subframe's pitch delay (4.1.3)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
void ff_acelp_update_past_gain(int16_t *quant_energy, int gain_corr_factor, int log2_ma_pred_order, int erasure)
Update past quantized energies.
void ff_acelp_lp_decode(int16_t *lp_1st, int16_t *lp_2nd, const int16_t *lsp_2nd, const int16_t *lsp_prev, int lp_order)
Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3.2.5 and 3.2.6 of G.729)
static const int16_t cb_ma_predictor_sum_inv[2][10]
12 ...
int ma_predictor_prev
switched MA predictor of LSP quantizer from last good frame
int16_t * lsp[2]
pointers to lsp_buf
int frame_size
Number of samples per channel in an audio frame.
#define SHARP_MIN
minimum gain pitch value (3.8, Equation 47) 0.2 in (1.14)
Libavcodec external API header.
static void lsf_restore_from_previous(int16_t *lsfq, int16_t *past_quantizer_outputs[MA_NP+1], int ma_predictor_prev)
Restores past LSP quantizer output using LSF from previous frame.
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
int16_t past_gain_pitch[6]
(1.14) pitch gain of current and five previous subframes
main external API structure.
static const char * format
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
int16_t quant_energy[4]
(5.10) past quantized energy
static unsigned int get_bits1(GetBitContext *s)
const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
Track|Pulse| Positions 1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75 2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76 3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define INTERPOL_LEN
interpolation filter length
int16_t was_periodic
whether previous frame was declared as periodic or not (4.4)
void ff_g729_postfilter(AudioDSPContext *adsp, int16_t *ht_prev_data, int *voicing, const int16_t *lp_filter_coeffs, int pitch_delay_int, int16_t *residual, int16_t *res_filter_data, int16_t *pos_filter_data, int16_t *speech, int subframe_size)
Signal postfiltering (4.2)
#define MA_NP
Moving Average (MA) prediction order.
const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
Track|Pulse| Positions 2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21 | | 2, 9, 15, 22, 29, 35, 6, 26 | | 4,10, 17, 24, 30, 37, 11, 31 | | 5,12, 19, 25, 32, 39, 16, 36
#define LSFQ_MAX
maximum quantized LSF value (3.2.4) 3.135 in Q13
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define SHARP_MAX
maximum gain pitch value (3.8, Equation 47) (EE) This does not comply with the specification.
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
void ff_acelp_interpolate(int16_t *out, const int16_t *in, const int16_t *filter_coeffs, int precision, int frac_pos, int filter_length, int length)
Generic FIR interpolation routine.
#define VQ_2ND_BITS
second stage vector of quantizer (size in bits)
#define GC_1ST_IDX_BITS_8K
gain codebook (first stage) index, 8k mode (size in bits)
common internal api header.
static const int16_t cb_gain_2nd_6k4[1<< GC_2ND_IDX_BITS_6K4][2]
gain codebook (second stage), 6.4k mode (D.3.9.2 of G.729)
int16_t syn_filter_data[10]
previous speech data for LP synthesis filter
static int g729d_onset_decision(int past_onset, const int16_t *past_gain_code)
Makes decision about onset in current subframe.
int16_t exc_base[2 *SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN]
past excitation signal buffer
#define VQ_1ST_BITS
first stage vector of quantizer (size in bits)
#define GC_1ST_IDX_BITS_6K4
gain codebook (first stage) index, 6.4k mode (size in bits)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
int channels
number of audio channels
static const int16_t cb_ma_predictor_sum[2][10]
15 3 cb_ma_predictor_sum[j][i] = floor( 2 * (1...
static void frame_erasure(EVRCContext *e, float *samples)
static uint16_t g729_prng(uint16_t value)
pseudo random number generator
#define RES_PREV_DATA_SIZE
Amount of past residual signal data stored in buffer.
int16_t voice_decision
voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
static const G729FormatDescription format_g729d_6k4
int16_t pos_filter_data[SUBFRAME_SIZE+10]
previous speech data for short-term postfilter
static const int16_t lsp_init[10]
initial LSP coefficients belongs to virtual frame preceding the first frame of the stream ...
int gain_coeff
(1.14) gain coefficient (4.2.4)
#define FFSWAP(type, a, b)
static const int16_t cb_gain_2nd_8k[1<< GC_2ND_IDX_BITS_8K][2]
gain codebook (second stage), 8k mode (3.9.2 of G.729)
static const int16_t cb_lsp_1st[1<< VQ_1ST_BITS][10]
first stage LSP codebook (10-dimensional, with 128 entries (3.24 of G.729)
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
int16_t ff_acelp_decode_gain_code(AudioDSPContext *adsp, int gain_corr_factor, const int16_t *fc_v, int mr_energy, const int16_t *quant_energy, const int16_t *ma_prediction_coeff, int subframe_size, int ma_pred_order)
Decode the adaptive codebook gain and add correction (4.1.5 and 3.9.1 of G.729).
static const int16_t phase_filter[3][40]
additional "phase" post-processing filter impulse response (D.6.2 of G.729)