Mercurial > libavcodec.hg
annotate g729dec.c @ 11032:01bd040f8607 libavcodec
Unroll main loop so the edge==0 case is seperate.
This allows many things to be simplified away.
h264 decoder is overall 1% faster with a mbaff sample and
0.1% slower with the cathedral sample, probably because the slow loop
filter code must be loaded into the code cache for each first MB of each
row but isnt used for the following MBs.
author | michael |
---|---|
date | Thu, 28 Jan 2010 01:24:25 +0000 |
parents | 62705926ba33 |
children | 25e209f9153a |
rev | line source |
---|---|
7597 | 1 /* |
2 * G.729 decoder | |
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 #include <stdlib.h> | |
22 #include <inttypes.h> | |
23 #include <limits.h> | |
24 #include <stdio.h> | |
25 #include <string.h> | |
26 #include <math.h> | |
27 #include <assert.h> | |
28 | |
29 #include "avcodec.h" | |
30 #include "libavutil/avutil.h" | |
9428 | 31 #include "get_bits.h" |
7597 | 32 |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
33 #include "g729.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
34 #include "lsp.h" |
8048
ecb1962c12f3
Rename acelp_math.[ch] to celp_math.[ch] to prepare for QCELP decoder merge.
diego
parents:
7872
diff
changeset
|
35 #include "celp_math.h" |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
36 #include "acelp_filters.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
37 #include "acelp_pitch_delay.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
38 #include "acelp_vectors.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
39 #include "g729data.h" |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
40 |
7597 | 41 /** |
7668
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
42 * minimum quantized LSF value (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
43 * 0.005 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
44 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
45 #define LSFQ_MIN 40 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
46 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
47 /** |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
48 * maximum quantized LSF value (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
49 * 3.135 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
50 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
51 #define LSFQ_MAX 25681 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
52 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
53 /** |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
54 * minimum LSF distance (3.2.4) |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
55 * 0.0391 in Q13 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
56 */ |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
57 #define LSFQ_DIFF_MIN 321 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
58 |
bdb1bdcd4cd0
Move from g729.h all definitions which are used only in g729dec.c
voroshil
parents:
7597
diff
changeset
|
59 /** |
7693 | 60 * minimum gain pitch value (3.8, Equation 47) |
61 * 0.2 in (1.14) | |
62 */ | |
63 #define SHARP_MIN 3277 | |
64 | |
65 /** | |
66 * maximum gain pitch value (3.8, Equation 47) | |
67 * (EE) This does not comply with the specification. | |
68 * Specification says about 0.8, which should be | |
69 * 13107 in (1.14), but reference C code uses | |
70 * 13017 (equals to 0.7945) instead of it. | |
71 */ | |
72 #define SHARP_MAX 13017 | |
73 | |
9824 | 74 typedef struct { |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
75 uint8_t ac_index_bits[2]; ///< adaptive codebook index for second subframe (size in bits) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
76 uint8_t parity_bit; ///< parity bit for pitch delay |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
77 uint8_t gc_1st_index_bits; ///< gain codebook (first stage) index (size in bits) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
78 uint8_t gc_2nd_index_bits; ///< gain codebook (second stage) index (size in bits) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
79 uint8_t fc_signs_bits; ///< number of pulses in fixed-codebook vector |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
80 uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
81 } G729FormatDescription; |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
82 |
9876
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
83 typedef struct { |
9888 | 84 int pitch_delay_int_prev; ///< integer part of previous subframe's pitch delay (4.1.3) |
85 | |
9884
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
86 /// (2.13) LSP quantizer outputs |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
87 int16_t past_quantizer_output_buf[MA_NP + 1][10]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
88 int16_t* past_quantizer_outputs[MA_NP + 1]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
89 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
90 int16_t lsfq[10]; ///< (2.13) quantized LSF coefficients from previous frame |
9876
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
91 int16_t lsp_buf[2][10]; ///< (0.15) LSP coefficients (previous and current frames) (3.2.5) |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
92 int16_t *lsp[2]; ///< pointers to lsp_buf |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
93 } G729Context; |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
94 |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
95 static const G729FormatDescription format_g729_8k = { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
96 .ac_index_bits = {8,5}, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
97 .parity_bit = 1, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
98 .gc_1st_index_bits = GC_1ST_IDX_BITS_8K, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
99 .gc_2nd_index_bits = GC_2ND_IDX_BITS_8K, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
100 .fc_signs_bits = 4, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
101 .fc_indexes_bits = 13, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
102 }; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
103 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
104 static const G729FormatDescription format_g729d_6k4 = { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
105 .ac_index_bits = {8,4}, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
106 .parity_bit = 0, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
107 .gc_1st_index_bits = GC_1ST_IDX_BITS_6K4, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
108 .gc_2nd_index_bits = GC_2ND_IDX_BITS_6K4, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
109 .fc_signs_bits = 2, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
110 .fc_indexes_bits = 9, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
111 }; |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
112 |
7693 | 113 /** |
7597 | 114 * \brief pseudo random number generator |
115 */ | |
9820
b72fbafc9408
Internal routine should not use name of standard function.
voroshil
parents:
9819
diff
changeset
|
116 static inline uint16_t g729_prng(uint16_t value) |
7597 | 117 { |
118 return 31821 * value + 13849; | |
119 } | |
120 | |
7773 | 121 /** |
122 * Get parity bit of bit 2..7 | |
123 */ | |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
124 static inline int get_parity(uint8_t value) |
7773 | 125 { |
126 return (0x6996966996696996ULL >> (value >> 2)) & 1; | |
127 } | |
128 | |
9884
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
129 static void lsf_decode(int16_t* lsfq, int16_t* past_quantizer_outputs[MA_NP + 1], |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
130 int16_t ma_predictor, |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
131 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high) |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
132 { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
133 int i,j; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
134 static const uint8_t min_distance[2]={10, 5}; //(2.13) |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
135 int16_t* quantizer_output = past_quantizer_outputs[MA_NP]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
136 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
137 for (i = 0; i < 5; i++) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
138 quantizer_output[i] = cb_lsp_1st[vq_1st][i ] + cb_lsp_2nd[vq_2nd_low ][i ]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
139 quantizer_output[i + 5] = cb_lsp_1st[vq_1st][i + 5] + cb_lsp_2nd[vq_2nd_high][i + 5]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
140 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
141 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
142 for (j = 0; j < 2; j++) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
143 for (i = 1; i < 10; i++) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
144 int diff = (quantizer_output[i - 1] - quantizer_output[i] + min_distance[j]) >> 1; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
145 if (diff > 0) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
146 quantizer_output[i - 1] -= diff; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
147 quantizer_output[i ] += diff; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
148 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
149 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
150 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
151 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
152 for (i = 0; i < 10; i++) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
153 int sum = quantizer_output[i] * cb_ma_predictor_sum[ma_predictor][i]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
154 for (j = 0; j < MA_NP; j++) |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
155 sum += past_quantizer_outputs[j][i] * cb_ma_predictor[ma_predictor][j][i]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
156 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
157 lsfq[i] = sum >> 15; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
158 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
159 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
160 /* Rotate past_quantizer_outputs. */ |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
161 memmove(past_quantizer_outputs + 1, past_quantizer_outputs, MA_NP * sizeof(int16_t*)); |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
162 past_quantizer_outputs[0] = quantizer_output; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
163 |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
164 ff_acelp_reorder_lsf(lsfq, LSFQ_DIFF_MIN, LSFQ_MIN, LSFQ_MAX, 10); |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
165 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
166 |
9853 | 167 static av_cold int decoder_init(AVCodecContext * avctx) |
168 { | |
9884
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
169 G729Context* ctx = avctx->priv_data; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
170 int i,k; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
171 |
9824 | 172 if (avctx->channels != 1) { |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
173 av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels); |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
174 return AVERROR_NOFMT; |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
175 } |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
176 |
9853 | 177 /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */ |
178 avctx->frame_size = SUBFRAME_SIZE << 1; | |
179 | |
9884
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
180 for (k = 0; k < MA_NP + 1; k++) { |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
181 ctx->past_quantizer_outputs[k] = ctx->past_quantizer_output_buf[k]; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
182 for (i = 1; i < 11; i++) |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
183 ctx->past_quantizer_outputs[k][i - 1] = (18717 * i) >> 3; |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
184 } |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
185 |
9876
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
186 ctx->lsp[0] = ctx->lsp_buf[0]; |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
187 ctx->lsp[1] = ctx->lsp_buf[1]; |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
188 memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t)); |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
189 |
9853 | 190 return 0; |
191 } | |
192 | |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
193 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
194 AVPacket *avpkt) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
195 { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
196 const uint8_t *buf = avpkt->data; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
197 int buf_size = avpkt->size; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
198 int16_t *out_frame = data; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
199 GetBitContext gb; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
200 G729FormatDescription format; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
201 int frame_erasure = 0; ///< frame erasure detected during decoding |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
202 int bad_pitch = 0; ///< parity check failed |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
203 int i; |
9876
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
204 G729Context *ctx = avctx->priv_data; |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
205 int16_t lp[2][11]; // (3.12) |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
206 uint8_t ma_predictor; ///< switched MA predictor of LSP quantizer |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
207 uint8_t quantizer_1st; ///< first stage vector of quantizer |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
208 uint8_t quantizer_2nd_lo; ///< second stage lower vector of quantizer (size in bits) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
209 uint8_t quantizer_2nd_hi; ///< second stage higher vector of quantizer (size in bits) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
210 |
9888 | 211 int pitch_delay_int; // pitch delay, integer part |
212 int pitch_delay_3x; // pitch delay, multiplied by 3 | |
213 | |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
214 if (*data_size < SUBFRAME_SIZE << 2) { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
215 av_log(avctx, AV_LOG_ERROR, "Error processing packet: output buffer too small\n"); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
216 return AVERROR(EIO); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
217 } |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
218 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
219 if (buf_size == 10) { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
220 format = format_g729_8k; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
221 av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729 @ 8kbit/s"); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
222 } else if (buf_size == 8) { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
223 format = format_g729d_6k4; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
224 av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729D @ 6.4kbit/s"); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
225 } else { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
226 av_log(avctx, AV_LOG_ERROR, "Packet size %d is unknown.\n", buf_size); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
227 return (AVERROR_NOFMT); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
228 } |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
229 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
230 for (i=0; i < buf_size; i++) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
231 frame_erasure |= buf[i]; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
232 frame_erasure = !frame_erasure; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
233 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
234 init_get_bits(&gb, buf, buf_size); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
235 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
236 ma_predictor = get_bits(&gb, 1); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
237 quantizer_1st = get_bits(&gb, VQ_1ST_BITS); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
238 quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
239 quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
240 |
9884
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
241 lsf_decode(ctx->lsfq, ctx->past_quantizer_outputs, |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
242 ma_predictor, |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
243 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi); |
c2da2b1e1a12
LSF (Line Spectral Frequencies) decoding routine.
voroshil
parents:
9876
diff
changeset
|
244 |
9876
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
245 ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10); |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
246 |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
247 ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10); |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
248 |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
249 FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]); |
2719d29359c6
Convertion of LSF values to coefficients of linear prediction filter
voroshil
parents:
9865
diff
changeset
|
250 |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
251 for (i = 0; i < 2; i++) { |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
252 uint8_t ac_index; ///< adaptive codebook index |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
253 uint8_t pulses_signs; ///< fixed-codebook vector pulse signs |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
254 int fc_indexes; ///< fixed-codebook indexes |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
255 uint8_t gc_1st_index; ///< gain codebook (first stage) index |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
256 uint8_t gc_2nd_index; ///< gain codebook (second stage) index |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
257 |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
258 ac_index = get_bits(&gb, format.ac_index_bits[i]); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
259 if(!i && format.parity_bit) |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
260 bad_pitch = get_parity(ac_index) == get_bits1(&gb); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
261 fc_indexes = get_bits(&gb, format.fc_indexes_bits); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
262 pulses_signs = get_bits(&gb, format.fc_signs_bits); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
263 gc_1st_index = get_bits(&gb, format.gc_1st_index_bits); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
264 gc_2nd_index = get_bits(&gb, format.gc_2nd_index_bits); |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
265 |
9888 | 266 if(!i) { |
267 if (bad_pitch) | |
268 pitch_delay_3x = 3 * ctx->pitch_delay_int_prev; | |
269 else | |
270 pitch_delay_3x = ff_acelp_decode_8bit_to_1st_delay3(ac_index); | |
271 } else { | |
272 int pitch_delay_min = av_clip(ctx->pitch_delay_int_prev - 5, | |
273 PITCH_DELAY_MIN, PITCH_DELAY_MAX - 9); | |
274 | |
275 if(packet_type == FORMAT_G729D_6K4) | |
276 pitch_delay_3x = ff_acelp_decode_4bit_to_2nd_delay3(ac_index, pitch_delay_min); | |
277 else | |
278 pitch_delay_3x = ff_acelp_decode_5_6_bit_to_2nd_delay3(ac_index, pitch_delay_min); | |
279 } | |
280 | |
281 /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */ | |
282 pitch_delay_int = (pitch_delay_3x + 1) / 3; | |
283 | |
9887
b584c223a6a1
Replace pitch_delay_int array with single variable.
voroshil
parents:
9884
diff
changeset
|
284 ff_acelp_weighted_vector_sum(fc + pitch_delay_int, |
b584c223a6a1
Replace pitch_delay_int array with single variable.
voroshil
parents:
9884
diff
changeset
|
285 fc + pitch_delay_int, |
9824 | 286 fc, 1 << 14, |
287 av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX), | |
288 0, 14, | |
9887
b584c223a6a1
Replace pitch_delay_int array with single variable.
voroshil
parents:
9884
diff
changeset
|
289 SUBFRAME_SIZE - pitch_delay_int); |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
290 |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
291 if (frame_erasure) { |
9824 | 292 ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15) |
293 ctx->gain_code = ( 2007 * ctx->gain_code ) >> 11; // 0.98 (0.11) | |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
294 |
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
295 gain_corr_factor = 0; |
9824 | 296 } else { |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
297 ctx->gain_pitch = cb_gain_1st_8k[gc_1st_index][0] + |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
298 cb_gain_2nd_8k[gc_2nd_index][0]; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
299 gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] + |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
300 cb_gain_2nd_8k[gc_2nd_index][1]; |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
301 |
9852
af3cc583501e
Replace MAX_SUBFRAME_SIZE and ctx->subframe_size with SUBFRAME_SIZE,
voroshil
parents:
9824
diff
changeset
|
302 ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE, |
af3cc583501e
Replace MAX_SUBFRAME_SIZE and ctx->subframe_size with SUBFRAME_SIZE,
voroshil
parents:
9824
diff
changeset
|
303 ctx->exc + i * SUBFRAME_SIZE, fc, |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
304 (!voicing && frame_erasure) ? 0 : ctx->gain_pitch, |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
305 ( voicing && frame_erasure) ? 0 : ctx->gain_code, |
9852
af3cc583501e
Replace MAX_SUBFRAME_SIZE and ctx->subframe_size with SUBFRAME_SIZE,
voroshil
parents:
9824
diff
changeset
|
306 1 << 13, 14, SUBFRAME_SIZE); |
9888 | 307 |
308 ctx->pitch_delay_int_prev = pitch_delay_int; | |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
309 } |
7780
b35486af268e
Another set of approved G.729 chunks (from decoder core)
voroshil
parents:
7773
diff
changeset
|
310 |
9865
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
311 *data_size = SUBFRAME_SIZE << 2; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
312 return buf_size; |
498ceea90017
G.729 decoding routine (skeleton, including parameters decoding).
voroshil
parents:
9853
diff
changeset
|
313 } |
7872
18d5d203ba0c
Another set of approved changes for G.729: includes, formats structure,
voroshil
parents:
7802
diff
changeset
|
314 |
7597 | 315 AVCodec g729_decoder = |
316 { | |
317 "g729", | |
318 CODEC_TYPE_AUDIO, | |
319 CODEC_ID_G729, | |
9823 | 320 sizeof(G729Context), |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
321 decoder_init, |
7597 | 322 NULL, |
323 NULL, | |
9819
fbc565735c4d
Remove ff_g729_ and g729_ prefixes from static routines.
voroshil
parents:
9428
diff
changeset
|
324 decode_frame, |
7597 | 325 .long_name = NULL_IF_CONFIG_SMALL("G.729"), |
326 }; |