annotate qcelpdec.c @ 12329:6644e439130d libavcodec

Calculate an exact frame size before writing. Now the buffer size requirements can be known exactly, so larger frame sizes can be safely encoded without buffer overwrite.
author jbr
date Sat, 31 Jul 2010 20:32:12 +0000
parents 3798d134f330
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
1 /*
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
2 * QCELP decoder
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
3 * Copyright (c) 2007 Reynaldo H. Verdejo Pinochet
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
4 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
5 * This file is part of FFmpeg.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
6 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
11 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
15 * Lesser General Public License for more details.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
16 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
20 */
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
21
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
24 * QCELP decoder
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
25 * @author Reynaldo H. Verdejo Pinochet
8151
e2c068cb210a Credit Kenan Gillet for his contributions towards merging the SoC QCELP decoder.
reynaldo
parents: 8150
diff changeset
26 * @remark FFmpeg merging spearheaded by Kenan Gillet
8258
b41482ad0ef5 COSMETICS, add missing remarks crediting Ben and Kenan
reynaldo
parents: 8253
diff changeset
27 * @remark Development mentored by Benjamin Larson
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
28 */
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
29
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
30 #include <stddef.h>
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
31
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
32 #include "avcodec.h"
8281
f93efc084e41 Make av_log_missing_feature an internal function, and change its name
stefano
parents: 8260
diff changeset
33 #include "internal.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
34 #include "get_bits.h"
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
35
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
36 #include "qcelpdata.h"
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
37
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
38 #include "celp_math.h"
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
39 #include "celp_filters.h"
11650
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
40 #include "acelp_filters.h"
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
41 #include "acelp_vectors.h"
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 10010
diff changeset
42 #include "lsp.h"
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
43
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
44 #undef NDEBUG
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
45 #include <assert.h>
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
46
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
47 typedef enum
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
48 {
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
49 I_F_Q = -1, /*!< insufficient frame quality */
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
50 SILENCE,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
51 RATE_OCTAVE,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
52 RATE_QUARTER,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
53 RATE_HALF,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
54 RATE_FULL
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
55 } qcelp_packet_rate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
56
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
57 typedef struct
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
58 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
59 GetBitContext gb;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
60 qcelp_packet_rate bitrate;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
61 QCELPFrame frame; /*!< unpacked data frame */
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
62
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
63 uint8_t erasure_count;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
64 uint8_t octave_count; /*!< count the consecutive RATE_OCTAVE frames */
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
65 float prev_lspf[10];
8247
e8cb66bdae99 Trivial rephrasing, avoids too long line
reynaldo
parents: 8246
diff changeset
66 float predictor_lspf[10];/*!< LSP predictor for RATE_OCTAVE and I_F_Q */
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
67 float pitch_synthesis_filter_mem[303];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
68 float pitch_pre_filter_mem[303];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
69 float rnd_fir_filter_mem[180];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
70 float formant_mem[170];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
71 float last_codebook_gain;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
72 int prev_g1[2];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
73 int prev_bitrate;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
74 float pitch_gain[4];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
75 uint8_t pitch_lag[4];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
76 uint16_t first16bits;
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
77 uint8_t warned_buf_mismatch_bitrate;
11650
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
78
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
79 /* postfilter */
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
80 float postfilter_synth_mem[10];
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
81 float postfilter_agc_mem;
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
82 float postfilter_tilt_mem;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
83 } QCELPContext;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
84
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
85 /**
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
86 * Initialize the speech codec according to the specification.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
87 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
88 * TIA/EIA/IS-733 2.4.9
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
89 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
90 static av_cold int qcelp_decode_init(AVCodecContext *avctx)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
91 {
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
92 QCELPContext *q = avctx->priv_data;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
93 int i;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
94
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
95 avctx->sample_fmt = SAMPLE_FMT_FLT;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
96
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
97 for(i=0; i<10; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
98 q->prev_lspf[i] = (i+1)/11.;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
99
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
100 return 0;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
101 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
102
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
103 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
104 * Decode the 10 quantized LSP frequencies from the LSPV/LSP
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
105 * transmission codes of any bitrate and check for badly received packets.
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
106 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
107 * @param q the context
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
108 * @param lspf line spectral pair frequencies
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
109 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
110 * @return 0 on success, -1 if the packet is badly received
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
111 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
112 * TIA/EIA/IS-733 2.4.3.2.6.2-2, 2.4.8.7.3
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
113 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
114 static int decode_lspf(QCELPContext *q, float *lspf)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
115 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
116 int i;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
117 float tmp_lspf, smooth, erasure_coeff;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
118 const float *predictors;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
119
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
120 if(q->bitrate == RATE_OCTAVE || q->bitrate == I_F_Q)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
121 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
122 predictors = (q->prev_bitrate != RATE_OCTAVE &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
123 q->prev_bitrate != I_F_Q ?
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
124 q->prev_lspf : q->predictor_lspf);
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
125
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
126 if(q->bitrate == RATE_OCTAVE)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
127 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
128 q->octave_count++;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
129
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
130 for(i=0; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
131 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
132 q->predictor_lspf[i] =
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
133 lspf[i] = (q->frame.lspv[i] ? QCELP_LSP_SPREAD_FACTOR
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
134 : -QCELP_LSP_SPREAD_FACTOR)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
135 + predictors[i] * QCELP_LSP_OCTAVE_PREDICTOR
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
136 + (i + 1) * ((1 - QCELP_LSP_OCTAVE_PREDICTOR)/11);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
137 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
138 smooth = (q->octave_count < 10 ? .875 : 0.1);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
139 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
140 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
141 erasure_coeff = QCELP_LSP_OCTAVE_PREDICTOR;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
142
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
143 assert(q->bitrate == I_F_Q);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
144
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
145 if(q->erasure_count > 1)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
146 erasure_coeff *= (q->erasure_count < 4 ? 0.9 : 0.7);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
147
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
148 for(i=0; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
149 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
150 q->predictor_lspf[i] =
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
151 lspf[i] = (i + 1) * ( 1 - erasure_coeff)/11
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
152 + erasure_coeff * predictors[i];
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
153 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
154 smooth = 0.125;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
155 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
156
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
157 // Check the stability of the LSP frequencies.
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
158 lspf[0] = FFMAX(lspf[0], QCELP_LSP_SPREAD_FACTOR);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
159 for(i=1; i<10; i++)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
160 lspf[i] = FFMAX(lspf[i], (lspf[i-1] + QCELP_LSP_SPREAD_FACTOR));
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
161
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
162 lspf[9] = FFMIN(lspf[9], (1.0 - QCELP_LSP_SPREAD_FACTOR));
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
163 for(i=9; i>0; i--)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
164 lspf[i-1] = FFMIN(lspf[i-1], (lspf[i] - QCELP_LSP_SPREAD_FACTOR));
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
165
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
166 // Low-pass filter the LSP frequencies.
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
167 ff_weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
168 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
169 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
170 q->octave_count = 0;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
171
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
172 tmp_lspf = 0.;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
173 for(i=0; i<5 ; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
174 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
175 lspf[2*i+0] = tmp_lspf += qcelp_lspvq[i][q->frame.lspv[i]][0] * 0.0001;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
176 lspf[2*i+1] = tmp_lspf += qcelp_lspvq[i][q->frame.lspv[i]][1] * 0.0001;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
177 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
178
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
179 // Check for badly received packets.
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
180 if(q->bitrate == RATE_QUARTER)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
181 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
182 if(lspf[9] <= .70 || lspf[9] >= .97)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
183 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
184 for(i=3; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
185 if(fabs(lspf[i] - lspf[i-2]) < .08)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
186 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
187 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
188 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
189 if(lspf[9] <= .66 || lspf[9] >= .985)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
190 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
191 for(i=4; i<10; i++)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
192 if (fabs(lspf[i] - lspf[i-4]) < .0931)
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
193 return -1;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
194 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
195 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
196 return 0;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
197 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
198
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
199 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
200 * Convert codebook transmission codes to GAIN and INDEX.
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
201 *
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
202 * @param q the context
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
203 * @param gain array holding the decoded gain
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
204 *
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
205 * TIA/EIA/IS-733 2.4.6.2
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
206 */
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
207 static void decode_gain_and_index(QCELPContext *q,
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
208 float *gain) {
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
209 int i, subframes_count, g1[16];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
210 float slope;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
211
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
212 if(q->bitrate >= RATE_QUARTER)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
213 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
214 switch(q->bitrate)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
215 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
216 case RATE_FULL: subframes_count = 16; break;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
217 case RATE_HALF: subframes_count = 4; break;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
218 default: subframes_count = 5;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
219 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
220 for(i=0; i<subframes_count; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
221 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
222 g1[i] = 4 * q->frame.cbgain[i];
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
223 if(q->bitrate == RATE_FULL && !((i+1) & 3))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
224 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
225 g1[i] += av_clip((g1[i-1] + g1[i-2] + g1[i-3]) / 3 - 6, 0, 32);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
226 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
227
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
228 gain[i] = qcelp_g12ga[g1[i]];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
229
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
230 if(q->frame.cbsign[i])
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
231 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
232 gain[i] = -gain[i];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
233 q->frame.cindex[i] = (q->frame.cindex[i]-89) & 127;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
234 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
235 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
236
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
237 q->prev_g1[0] = g1[i-2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
238 q->prev_g1[1] = g1[i-1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
239 q->last_codebook_gain = qcelp_g12ga[g1[i-1]];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
240
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
241 if(q->bitrate == RATE_QUARTER)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
242 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
243 // Provide smoothing of the unvoiced excitation energy.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
244 gain[7] = gain[4];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
245 gain[6] = 0.4*gain[3] + 0.6*gain[4];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
246 gain[5] = gain[3];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
247 gain[4] = 0.8*gain[2] + 0.2*gain[3];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
248 gain[3] = 0.2*gain[1] + 0.8*gain[2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
249 gain[2] = gain[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
250 gain[1] = 0.6*gain[0] + 0.4*gain[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
251 }
9594
a0517e3590fd Properly handle SILENCE frame. Patch by Kenan Gillet.
reynaldo
parents: 9428
diff changeset
252 }else if (q->bitrate != SILENCE)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
253 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
254 if(q->bitrate == RATE_OCTAVE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
255 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
256 g1[0] = 2 * q->frame.cbgain[0]
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
257 + av_clip((q->prev_g1[0] + q->prev_g1[1]) / 2 - 5, 0, 54);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
258 subframes_count = 8;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
259 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
260 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
261 assert(q->bitrate == I_F_Q);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
262
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
263 g1[0] = q->prev_g1[1];
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
264 switch(q->erasure_count)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
265 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
266 case 1 : break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
267 case 2 : g1[0] -= 1; break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
268 case 3 : g1[0] -= 2; break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
269 default: g1[0] -= 6;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
270 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
271 if(g1[0] < 0)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
272 g1[0] = 0;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
273 subframes_count = 4;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
274 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
275 // This interpolation is done to produce smoother background noise.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
276 slope = 0.5*(qcelp_g12ga[g1[0]] - q->last_codebook_gain) / subframes_count;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
277 for(i=1; i<=subframes_count; i++)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
278 gain[i-1] = q->last_codebook_gain + slope * i;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
279
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
280 q->last_codebook_gain = gain[i-2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
281 q->prev_g1[0] = q->prev_g1[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
282 q->prev_g1[1] = g1[0];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
283 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
284 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
285
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
286 /**
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
287 * If the received packet is Rate 1/4 a further sanity check is made of the
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
288 * codebook gain.
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
289 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
290 * @param cbgain the unpacked cbgain array
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
291 * @return -1 if the sanity check fails, 0 otherwise
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
292 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
293 * TIA/EIA/IS-733 2.4.8.7.3
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
294 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
295 static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
296 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
297 int i, diff, prev_diff=0;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
298
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
299 for(i=1; i<5; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
300 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
301 diff = cbgain[i] - cbgain[i-1];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
302 if(FFABS(diff) > 10)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
303 return -1;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
304 else if(FFABS(diff - prev_diff) > 12)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
305 return -1;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
306 prev_diff = diff;
8193
c04182909bd8 Trivial, Cosmetics
reynaldo
parents: 8192
diff changeset
307 }
c04182909bd8 Trivial, Cosmetics
reynaldo
parents: 8192
diff changeset
308 return 0;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
309 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
310
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
311 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
312 * Compute the scaled codebook vector Cdn From INDEX and GAIN
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
313 * for all rates.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
314 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
315 * The specification lacks some information here.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
316 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
317 * TIA/EIA/IS-733 has an omission on the codebook index determination
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
318 * formula for RATE_FULL and RATE_HALF frames at section 2.4.8.1.1. It says
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
319 * you have to subtract the decoded index parameter from the given scaled
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
320 * codebook vector index 'n' to get the desired circular codebook index, but
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
321 * it does not mention that you have to clamp 'n' to [0-9] in order to get
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
322 * RI-compliant results.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
323 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
324 * The reason for this mistake seems to be the fact they forgot to mention you
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
325 * have to do these calculations per codebook subframe and adjust given
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
326 * equation values accordingly.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
327 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
328 * @param q the context
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
329 * @param gain array holding the 4 pitch subframe gain values
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
330 * @param cdn_vector array for the generated scaled codebook vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
331 */
8253
d1724ad564e7 Removes misleading const qualifier, gets rid of two compiler warnings
reynaldo
parents: 8247
diff changeset
332 static void compute_svector(QCELPContext *q, const float *gain,
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
333 float *cdn_vector)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
334 {
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
335 int i, j, k;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
336 uint16_t cbseed, cindex;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
337 float *rnd, tmp_gain, fir_filter_value;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
338
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
339 switch(q->bitrate)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
340 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
341 case RATE_FULL:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
342 for(i=0; i<16; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
343 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
344 tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
345 cindex = -q->frame.cindex[i];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
346 for(j=0; j<10; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
347 *cdn_vector++ = tmp_gain * qcelp_rate_full_codebook[cindex++ & 127];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
348 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
349 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
350 case RATE_HALF:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
351 for(i=0; i<4; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
352 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
353 tmp_gain = gain[i] * QCELP_RATE_HALF_CODEBOOK_RATIO;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
354 cindex = -q->frame.cindex[i];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
355 for (j = 0; j < 40; j++)
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
356 *cdn_vector++ = tmp_gain * qcelp_rate_half_codebook[cindex++ & 127];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
357 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
358 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
359 case RATE_QUARTER:
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
360 cbseed = (0x0003 & q->frame.lspv[4])<<14 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
361 (0x003F & q->frame.lspv[3])<< 8 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
362 (0x0060 & q->frame.lspv[2])<< 1 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
363 (0x0007 & q->frame.lspv[1])<< 3 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
364 (0x0038 & q->frame.lspv[0])>> 3 ;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
365 rnd = q->rnd_fir_filter_mem + 20;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
366 for(i=0; i<8; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
367 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
368 tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
369 for(k=0; k<20; k++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
370 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
371 cbseed = 521 * cbseed + 259;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
372 *rnd = (int16_t)cbseed;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
373
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
374 // FIR filter
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
375 fir_filter_value = 0.0;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
376 for(j=0; j<10; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
377 fir_filter_value += qcelp_rnd_fir_coefs[j ]
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
378 * (rnd[-j ] + rnd[-20+j]);
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
379
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
380 fir_filter_value += qcelp_rnd_fir_coefs[10] * rnd[-10];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
381 *cdn_vector++ = tmp_gain * fir_filter_value;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
382 rnd++;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
383 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
384 }
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
385 memcpy(q->rnd_fir_filter_mem, q->rnd_fir_filter_mem + 160, 20 * sizeof(float));
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
386 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
387 case RATE_OCTAVE:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
388 cbseed = q->first16bits;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
389 for(i=0; i<8; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
390 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
391 tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
392 for(j=0; j<20; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
393 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
394 cbseed = 521 * cbseed + 259;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
395 *cdn_vector++ = tmp_gain * (int16_t)cbseed;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
396 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
397 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
398 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
399 case I_F_Q:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
400 cbseed = -44; // random codebook index
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
401 for(i=0; i<4; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
402 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
403 tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
404 for(j=0; j<40; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
405 *cdn_vector++ = tmp_gain * qcelp_rate_full_codebook[cbseed++ & 127];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
406 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
407 break;
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
408 case SILENCE:
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
409 memset(cdn_vector, 0, 160 * sizeof(float));
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
410 break;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
411 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
412 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
413
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
414 /**
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
415 * Apply generic gain control.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
416 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
417 * @param v_out output vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
418 * @param v_in gain-controlled vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
419 * @param v_ref vector to control gain of
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
420 *
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
421 * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
422 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
423 static void apply_gain_ctrl(float *v_out, const float *v_ref,
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
424 const float *v_in)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
425 {
10493
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
426 int i;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
427
10493
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
428 for (i = 0; i < 160; i += 40)
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
429 ff_scale_vector_to_given_sum_of_squares(v_out + i, v_in + i,
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
430 ff_dot_productf(v_ref + i,
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
431 v_ref + i, 40),
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
432 40);
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
433 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
434
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
435 /**
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
436 * Apply filter in pitch-subframe steps.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
437 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
438 * @param memory buffer for the previous state of the filter
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
439 * - must be able to contain 303 elements
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
440 * - the 143 first elements are from the previous state
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
441 * - the next 160 are for output
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
442 * @param v_in input filter vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
443 * @param gain per-subframe gain array, each element is between 0.0 and 2.0
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
444 * @param lag per-subframe lag array, each element is
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
445 * - between 16 and 143 if its corresponding pfrac is 0,
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
446 * - between 16 and 139 otherwise
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
447 * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
448 * otherwise
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
449 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
450 * @return filter output vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
451 */
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
452 static const float *do_pitchfilter(float memory[303], const float v_in[160],
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
453 const float gain[4], const uint8_t *lag,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
454 const uint8_t pfrac[4])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
455 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
456 int i, j;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
457 float *v_lag, *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
458 const float *v_len;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
459
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
460 v_out = memory + 143; // Output vector starts at memory[143].
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
461
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
462 for(i=0; i<4; i++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
463 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
464 if(gain[i])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
465 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
466 v_lag = memory + 143 + 40 * i - lag[i];
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
467 for(v_len=v_in+40; v_in<v_len; v_in++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
468 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
469 if(pfrac[i]) // If it is a fractional lag...
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
470 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
471 for(j=0, *v_out=0.; j<4; j++)
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
472 *v_out += qcelp_hammsinc_table[j] * (v_lag[j-4] + v_lag[3-j]);
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
473 }else
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
474 *v_out = *v_lag;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
475
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
476 *v_out = *v_in + gain[i] * *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
477
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
478 v_lag++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
479 v_out++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
480 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
481 }else
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
482 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
483 memcpy(v_out, v_in, 40 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
484 v_in += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
485 v_out += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
486 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
487 }
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
488
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
489 memmove(memory, memory + 160, 143 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
490 return memory + 143;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
491 }
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
492
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
493 /**
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
494 * Apply pitch synthesis filter and pitch prefilter to the scaled codebook vector.
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
495 * TIA/EIA/IS-733 2.4.5.2, 2.4.8.7.2
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
496 *
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
497 * @param q the context
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
498 * @param cdn_vector the scaled codebook vector
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
499 */
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
500 static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
501 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
502 int i;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
503 const float *v_synthesis_filtered, *v_pre_filtered;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
504
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
505 if(q->bitrate >= RATE_HALF ||
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
506 q->bitrate == SILENCE ||
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
507 (q->bitrate == I_F_Q && (q->prev_bitrate >= RATE_HALF)))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
508 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
509
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
510 if(q->bitrate >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
511 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
512
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
513 // Compute gain & lag for the whole frame.
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
514 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
515 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
516 q->pitch_gain[i] = q->frame.plag[i] ? (q->frame.pgain[i] + 1) * 0.25 : 0.0;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
517
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
518 q->pitch_lag[i] = q->frame.plag[i] + 16;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
519 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
520 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
521 {
8408
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
522 float max_pitch_gain;
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
523
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
524 if (q->bitrate == I_F_Q)
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
525 {
8480
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
526 if (q->erasure_count < 3)
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
527 max_pitch_gain = 0.9 - 0.3 * (q->erasure_count - 1);
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
528 else
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
529 max_pitch_gain = 0.0;
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
530 }else
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
531 {
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
532 assert(q->bitrate == SILENCE);
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
533 max_pitch_gain = 1.0;
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
534 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
535 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
536 q->pitch_gain[i] = FFMIN(q->pitch_gain[i], max_pitch_gain);
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
537
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
538 memset(q->frame.pfrac, 0, sizeof(q->frame.pfrac));
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
539 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
540
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
541 // pitch synthesis filter
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
542 v_synthesis_filtered = do_pitchfilter(q->pitch_synthesis_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
543 cdn_vector, q->pitch_gain,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
544 q->pitch_lag, q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
545
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
546 // pitch prefilter update
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
547 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
548 q->pitch_gain[i] = 0.5 * FFMIN(q->pitch_gain[i], 1.0);
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
549
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
550 v_pre_filtered = do_pitchfilter(q->pitch_pre_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
551 v_synthesis_filtered,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
552 q->pitch_gain, q->pitch_lag,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
553 q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
554
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
555 apply_gain_ctrl(cdn_vector, v_synthesis_filtered, v_pre_filtered);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
556 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
557 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
558 memcpy(q->pitch_synthesis_filter_mem, cdn_vector + 17,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
559 143 * sizeof(float));
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
560 memcpy(q->pitch_pre_filter_mem, cdn_vector + 17, 143 * sizeof(float));
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
561 memset(q->pitch_gain, 0, sizeof(q->pitch_gain));
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
562 memset(q->pitch_lag, 0, sizeof(q->pitch_lag));
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
563 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
564 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
565
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
566 /**
12024
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
567 * Reconstruct LPC coefficients from the line spectral pair frequencies
fdafbcef52f5 Fix grammar errors in documentation
mru
parents: 11652
diff changeset
568 * and perform bandwidth expansion.
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
569 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
570 * @param lspf line spectral pair frequencies
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
571 * @param lpc linear predictive coding coefficients
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
572 *
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
573 * @note: bandwidth_expansion_coeff could be precalculated into a table
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
574 * but it seems to be slower on x86
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
575 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
576 * TIA/EIA/IS-733 2.4.3.3.5
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
577 */
9343
dfe2d348aa50 Add missing static qualifier from function declaration. Patch by Kenan
reynaldo
parents: 9157
diff changeset
578 static void lspf2lpc(const float *lspf, float *lpc)
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
579 {
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
580 double lsp[10];
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
581 double bandwidth_expansion_coeff = QCELP_BANDWIDTH_EXPANSION_COEFF;
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
582 int i;
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
583
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
584 for (i=0; i<10; i++)
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
585 lsp[i] = cos(M_PI * lspf[i]);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
586
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10493
diff changeset
587 ff_acelp_lspd2lpc(lsp, lpc, 5);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
588
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
589 for (i=0; i<10; i++)
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
590 {
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
591 lpc[i] *= bandwidth_expansion_coeff;
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
592 bandwidth_expansion_coeff *= QCELP_BANDWIDTH_EXPANSION_COEFF;
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
593 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
594 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
595
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
596 /**
12051
3798d134f330 Grammar fixes
mru
parents: 12024
diff changeset
597 * Interpolate LSP frequencies and compute LPC coefficients
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
598 * for a given bitrate & pitch subframe.
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
599 *
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
600 * TIA/EIA/IS-733 2.4.3.3.4, 2.4.8.7.2
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
601 *
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
602 * @param q the context
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
603 * @param curr_lspf LSP frequencies vector of the current frame
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
604 * @param lpc float vector for the resulting LPC
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
605 * @param subframe_num frame number in decoded stream
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
606 */
10770
59be1a7be21f Reindent after last commit
vitor
parents: 10769
diff changeset
607 static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
59be1a7be21f Reindent after last commit
vitor
parents: 10769
diff changeset
608 float *lpc, const int subframe_num)
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
609 {
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
610 float interpolated_lspf[10];
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
611 float weight;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
612
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
613 if(q->bitrate >= RATE_QUARTER)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
614 weight = 0.25 * (subframe_num + 1);
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
615 else if(q->bitrate == RATE_OCTAVE && !subframe_num)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
616 weight = 0.625;
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
617 else
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
618 weight = 1.0;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
619
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
620 if(weight != 1.0)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
621 {
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
622 ff_weighted_vector_sumf(interpolated_lspf, curr_lspf, q->prev_lspf,
9157
33477a19f89e Cosmetics from Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9156
diff changeset
623 weight, 1.0 - weight, 10);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
624 lspf2lpc(interpolated_lspf, lpc);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
625 }else if(q->bitrate >= RATE_QUARTER ||
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
626 (q->bitrate == I_F_Q && !subframe_num))
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
627 lspf2lpc(curr_lspf, lpc);
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
628 else if(q->bitrate == SILENCE && !subframe_num)
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
629 lspf2lpc(q->prev_lspf, lpc);
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
630 }
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
631
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
632 static qcelp_packet_rate buf_size2bitrate(const int buf_size)
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
633 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
634 switch(buf_size)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
635 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
636 case 35: return RATE_FULL;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
637 case 17: return RATE_HALF;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
638 case 8: return RATE_QUARTER;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
639 case 4: return RATE_OCTAVE;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
640 case 1: return SILENCE;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
641 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
642
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
643 return I_F_Q;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
644 }
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
645
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
646 /**
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
647 * Determine the bitrate from the frame size and/or the first byte of the frame.
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
648 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
649 * @param avctx the AV codec context
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
650 * @param buf_size length of the buffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
651 * @param buf the bufffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
652 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
653 * @return the bitrate on success,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
654 * I_F_Q if the bitrate cannot be satisfactorily determined
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
655 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
656 * TIA/EIA/IS-733 2.4.8.7.1
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
657 */
8500
2c3d8a3d902c Silence one warning when compiling with icc:
cehoyos
parents: 8480
diff changeset
658 static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_size,
8259
437300244051 Add expected const qualifier on 'buf' to match AVCodec.decode's declaration.
reynaldo
parents: 8258
diff changeset
659 const uint8_t **buf)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
660 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
661 qcelp_packet_rate bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
662
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
663 if((bitrate = buf_size2bitrate(buf_size)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
664 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
665 if(bitrate > **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
666 {
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
667 QCELPContext *q = avctx->priv_data;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
668 if (!q->warned_buf_mismatch_bitrate)
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
669 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
670 av_log(avctx, AV_LOG_WARNING,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
671 "Claimed bitrate and buffer size mismatch.\n");
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
672 q->warned_buf_mismatch_bitrate = 1;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
673 }
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
674 bitrate = **buf;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
675 }else if(bitrate < **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
676 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
677 av_log(avctx, AV_LOG_ERROR,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
678 "Buffer is too small for the claimed bitrate.\n");
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
679 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
680 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
681 (*buf)++;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
682 }else if((bitrate = buf_size2bitrate(buf_size + 1)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
683 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
684 av_log(avctx, AV_LOG_WARNING,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
685 "Bitrate byte is missing, guessing the bitrate from packet size.\n");
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
686 }else
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
687 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
688
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
689 if(bitrate == SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
690 {
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
691 //FIXME: Remove experimental warning when tested with samples.
9891
7ad7d4094d1f Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents: 9629
diff changeset
692 av_log_ask_for_sample(avctx, "'Blank frame handling is experimental.");
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
693 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
694 return bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
695 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
696
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
697 static void warn_insufficient_frame_quality(AVCodecContext *avctx,
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
698 const char *message)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
699 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
700 av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
701 message);
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
702 }
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
703
11650
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
704 static void postfilter(QCELPContext *q, float *samples, float *lpc)
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
705 {
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
706 static const float pow_0_775[10] = {
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
707 0.775000, 0.600625, 0.465484, 0.360750, 0.279582,
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
708 0.216676, 0.167924, 0.130141, 0.100859, 0.078166
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
709 }, pow_0_625[10] = {
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
710 0.625000, 0.390625, 0.244141, 0.152588, 0.095367,
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
711 0.059605, 0.037253, 0.023283, 0.014552, 0.009095
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
712 };
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
713 float lpc_s[10], lpc_p[10], pole_out[170], zero_out[160];
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
714 int n;
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
715
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
716 for (n = 0; n < 10; n++) {
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
717 lpc_s[n] = lpc[n] * pow_0_625[n];
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
718 lpc_p[n] = lpc[n] * pow_0_775[n];
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
719 }
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
720
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
721 ff_celp_lp_zero_synthesis_filterf(zero_out, lpc_s,
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
722 q->formant_mem + 10, 160, 10);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
723 memcpy(pole_out, q->postfilter_synth_mem, sizeof(float) * 10);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
724 ff_celp_lp_synthesis_filterf(pole_out + 10, lpc_p, zero_out, 160, 10);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
725 memcpy(q->postfilter_synth_mem, pole_out + 160, sizeof(float) * 10);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
726
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
727 ff_tilt_compensation(&q->postfilter_tilt_mem, 0.3, pole_out + 10, 160);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
728
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
729 ff_adaptive_gain_control(samples, pole_out + 10,
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
730 ff_dot_productf(q->formant_mem + 10, q->formant_mem + 10, 160),
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
731 160, 0.9375, &q->postfilter_agc_mem);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
732 }
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
733
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
734 static int qcelp_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
735 AVPacket *avpkt)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
736 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
737 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
738 int buf_size = avpkt->size;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
739 QCELPContext *q = avctx->priv_data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
740 float *outbuffer = data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
741 int i;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
742 float quantized_lspf[10], lpc[10];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
743 float gain[16];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
744 float *formant_mem;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
745
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
746 if((q->bitrate = determine_bitrate(avctx, buf_size, &buf)) == I_F_Q)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
747 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
748 warn_insufficient_frame_quality(avctx, "bitrate cannot be determined.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
749 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
750 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
751
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
752 if(q->bitrate == RATE_OCTAVE &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
753 (q->first16bits = AV_RB16(buf)) == 0xFFFF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
754 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
755 warn_insufficient_frame_quality(avctx, "Bitrate is 1/8 and first 16 bits are on.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
756 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
757 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
758
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
759 if(q->bitrate > SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
760 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
761 const QCELPBitmap *bitmaps = qcelp_unpacking_bitmaps_per_rate[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
762 const QCELPBitmap *bitmaps_end = qcelp_unpacking_bitmaps_per_rate[q->bitrate]
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
763 + qcelp_unpacking_bitmaps_lengths[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
764 uint8_t *unpacked_data = (uint8_t *)&q->frame;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
765
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
766 init_get_bits(&q->gb, buf, 8*buf_size);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
767
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
768 memset(&q->frame, 0, sizeof(QCELPFrame));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
769
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
770 for(; bitmaps < bitmaps_end; bitmaps++)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
771 unpacked_data[bitmaps->index] |= get_bits(&q->gb, bitmaps->bitlen) << bitmaps->bitpos;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
772
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
773 // Check for erasures/blanks on rates 1, 1/4 and 1/8.
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
774 if(q->frame.reserved)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
775 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
776 warn_insufficient_frame_quality(avctx, "Wrong data in reserved frame area.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
777 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
778 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
779 if(q->bitrate == RATE_QUARTER &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
780 codebook_sanity_check_for_rate_quarter(q->frame.cbgain))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
781 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
782 warn_insufficient_frame_quality(avctx, "Codebook gain sanity check failed.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
783 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
784 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
785
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
786 if(q->bitrate >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
787 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
788 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
789 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
790 if(q->frame.pfrac[i] && q->frame.plag[i] >= 124)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
791 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
792 warn_insufficient_frame_quality(avctx, "Cannot initialize pitch filter.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
793 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
794 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
795 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
796 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
797 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
798
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
799 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
800 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
801
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
802 if(decode_lspf(q, quantized_lspf) < 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
803 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
804 warn_insufficient_frame_quality(avctx, "Badly received packets in frame.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
805 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
806 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
807
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
808
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
809 apply_pitch_filters(q, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
810
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
811 if(q->bitrate == I_F_Q)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
812 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
813 erasure:
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
814 q->bitrate = I_F_Q;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
815 q->erasure_count++;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
816 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
817 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
818 decode_lspf(q, quantized_lspf);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
819 apply_pitch_filters(q, outbuffer);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
820 }else
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
821 q->erasure_count = 0;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
822
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
823 formant_mem = q->formant_mem + 10;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
824 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
825 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
826 interpolate_lpc(q, quantized_lspf, lpc, i);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
827 ff_celp_lp_synthesis_filterf(formant_mem, lpc, outbuffer + i * 40, 40,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
828 10);
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
829 formant_mem += 40;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
830 }
11650
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
831
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
832 // postfilter, as per TIA/EIA/IS-733 2.4.8.6
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
833 postfilter(q, outbuffer, lpc);
3f0bf44cc161 Implement QCELP postfilter.
rbultje
parents: 11644
diff changeset
834
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
835 memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
836
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
837 memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
838 q->prev_bitrate = q->bitrate;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
839
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
840 *data_size = 160 * sizeof(*outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
841
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
842 return *data_size;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
843 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
844
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
845 AVCodec qcelp_decoder =
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
846 {
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
847 .name = "qcelp",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10770
diff changeset
848 .type = AVMEDIA_TYPE_AUDIO,
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
849 .id = CODEC_ID_QCELP,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
850 .init = qcelp_decode_init,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
851 .decode = qcelp_decode_frame,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
852 .priv_data_size = sizeof(QCELPContext),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
853 .long_name = NULL_IF_CONFIG_SMALL("QCELP / PureVoice"),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
854 };