annotate qcelpdec.c @ 10483:afad312b9989 libavcodec

Implement AMR gain function that is used by both AMR and SIPR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Sat, 31 Oct 2009 02:02:30 +0000
parents c1cfa4679371
children 5f2ced30548b
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8603
diff changeset
23 * @file libavcodec/qcelpdec.c
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"
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
40 #include "acelp_vectors.h"
10011
c1cfa4679371 Expose QCELP's floating-point LSP-to-LPC function
superdump
parents: 10010
diff changeset
41 #include "lsp.h"
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
42
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
43 #undef NDEBUG
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
44 #include <assert.h>
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
45
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
46 typedef enum
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
47 {
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
48 I_F_Q = -1, /*!< insufficient frame quality */
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
49 SILENCE,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
50 RATE_OCTAVE,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
51 RATE_QUARTER,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
52 RATE_HALF,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
53 RATE_FULL
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
54 } qcelp_packet_rate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
55
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
56 typedef struct
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
57 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
58 GetBitContext gb;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
59 qcelp_packet_rate bitrate;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
60 QCELPFrame frame; /*!< unpacked data frame */
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
61
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
62 uint8_t erasure_count;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
63 uint8_t octave_count; /*!< count the consecutive RATE_OCTAVE frames */
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
64 float prev_lspf[10];
8247
e8cb66bdae99 Trivial rephrasing, avoids too long line
reynaldo
parents: 8246
diff changeset
65 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
66 float pitch_synthesis_filter_mem[303];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
67 float pitch_pre_filter_mem[303];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
68 float rnd_fir_filter_mem[180];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
69 float formant_mem[170];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
70 float last_codebook_gain;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
71 int prev_g1[2];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
72 int prev_bitrate;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
73 float pitch_gain[4];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
74 uint8_t pitch_lag[4];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
75 uint16_t first16bits;
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
76 uint8_t warned_buf_mismatch_bitrate;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
77 } QCELPContext;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
78
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
79 /**
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
80 * Initialize the speech codec according to the specification.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
81 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
82 * TIA/EIA/IS-733 2.4.9
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
83 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
84 static av_cold int qcelp_decode_init(AVCodecContext *avctx)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
85 {
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
86 QCELPContext *q = avctx->priv_data;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
87 int i;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
88
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
89 avctx->sample_fmt = SAMPLE_FMT_FLT;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
90
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
91 for(i=0; i<10; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
92 q->prev_lspf[i] = (i+1)/11.;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
93
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
94 return 0;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
95 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
96
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
97 /**
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
98 * Decodes the 10 quantized LSP frequencies from the LSPV/LSP
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
99 * transmission codes of any bitrate and checks for badly received packets.
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
100 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
101 * @param q the context
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
102 * @param lspf line spectral pair frequencies
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
103 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
104 * @return 0 on success, -1 if the packet is badly received
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
105 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
106 * 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
107 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
108 static int decode_lspf(QCELPContext *q, float *lspf)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
109 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
110 int i;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
111 float tmp_lspf, smooth, erasure_coeff;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
112 const float *predictors;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
113
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
114 if(q->bitrate == RATE_OCTAVE || q->bitrate == I_F_Q)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
115 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
116 predictors = (q->prev_bitrate != RATE_OCTAVE &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
117 q->prev_bitrate != I_F_Q ?
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
118 q->prev_lspf : q->predictor_lspf);
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)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
121 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
122 q->octave_count++;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
123
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
124 for(i=0; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
125 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
126 q->predictor_lspf[i] =
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
127 lspf[i] = (q->frame.lspv[i] ? QCELP_LSP_SPREAD_FACTOR
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
128 : -QCELP_LSP_SPREAD_FACTOR)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
129 + predictors[i] * QCELP_LSP_OCTAVE_PREDICTOR
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
130 + (i + 1) * ((1 - QCELP_LSP_OCTAVE_PREDICTOR)/11);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
131 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
132 smooth = (q->octave_count < 10 ? .875 : 0.1);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
133 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
134 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
135 erasure_coeff = QCELP_LSP_OCTAVE_PREDICTOR;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
136
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
137 assert(q->bitrate == I_F_Q);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
138
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
139 if(q->erasure_count > 1)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
140 erasure_coeff *= (q->erasure_count < 4 ? 0.9 : 0.7);
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
141
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
142 for(i=0; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
143 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
144 q->predictor_lspf[i] =
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
145 lspf[i] = (i + 1) * ( 1 - erasure_coeff)/11
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
146 + erasure_coeff * predictors[i];
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
147 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
148 smooth = 0.125;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
149 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
150
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
151 // Check the stability of the LSP frequencies.
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
152 lspf[0] = FFMAX(lspf[0], QCELP_LSP_SPREAD_FACTOR);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
153 for(i=1; i<10; i++)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
154 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
155
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
156 lspf[9] = FFMIN(lspf[9], (1.0 - QCELP_LSP_SPREAD_FACTOR));
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
157 for(i=9; i>0; i--)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
158 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
159
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
160 // Low-pass filter the LSP frequencies.
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
161 ff_weighted_vector_sumf(lspf, lspf, q->prev_lspf, smooth, 1.0-smooth, 10);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
162 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
163 {
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
164 q->octave_count = 0;
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 tmp_lspf = 0.;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
167 for(i=0; i<5 ; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
168 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
169 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
170 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
171 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
172
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
173 // Check for badly received packets.
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
174 if(q->bitrate == RATE_QUARTER)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
175 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
176 if(lspf[9] <= .70 || lspf[9] >= .97)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
177 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
178 for(i=3; i<10; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
179 if(fabs(lspf[i] - lspf[i-2]) < .08)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
180 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
181 }else
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
182 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
183 if(lspf[9] <= .66 || lspf[9] >= .985)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
184 return -1;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
185 for(i=4; i<10; i++)
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
186 if (fabs(lspf[i] - lspf[i-4]) < .0931)
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
187 return -1;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
188 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
189 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
190 return 0;
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
191 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
192
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
193 /**
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
194 * Converts codebook transmission codes to GAIN and INDEX.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
195 *
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
196 * @param q the context
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
197 * @param gain array holding the decoded gain
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
198 *
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
199 * TIA/EIA/IS-733 2.4.6.2
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
200 */
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
201 static void decode_gain_and_index(QCELPContext *q,
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
202 float *gain) {
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
203 int i, subframes_count, g1[16];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
204 float slope;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
205
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
206 if(q->bitrate >= RATE_QUARTER)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
207 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
208 switch(q->bitrate)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
209 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
210 case RATE_FULL: subframes_count = 16; break;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
211 case RATE_HALF: subframes_count = 4; break;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
212 default: subframes_count = 5;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
213 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
214 for(i=0; i<subframes_count; i++)
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 g1[i] = 4 * q->frame.cbgain[i];
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
217 if(q->bitrate == RATE_FULL && !((i+1) & 3))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
218 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
219 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
220 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
221
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
222 gain[i] = qcelp_g12ga[g1[i]];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
223
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
224 if(q->frame.cbsign[i])
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
225 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
226 gain[i] = -gain[i];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
227 q->frame.cindex[i] = (q->frame.cindex[i]-89) & 127;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
228 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
229 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
231 q->prev_g1[0] = g1[i-2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
232 q->prev_g1[1] = g1[i-1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
233 q->last_codebook_gain = qcelp_g12ga[g1[i-1]];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
234
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
235 if(q->bitrate == RATE_QUARTER)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
236 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
237 // Provide smoothing of the unvoiced excitation energy.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
238 gain[7] = gain[4];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
239 gain[6] = 0.4*gain[3] + 0.6*gain[4];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
240 gain[5] = gain[3];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
241 gain[4] = 0.8*gain[2] + 0.2*gain[3];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
242 gain[3] = 0.2*gain[1] + 0.8*gain[2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
243 gain[2] = gain[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
244 gain[1] = 0.6*gain[0] + 0.4*gain[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
245 }
9594
a0517e3590fd Properly handle SILENCE frame. Patch by Kenan Gillet.
reynaldo
parents: 9428
diff changeset
246 }else if (q->bitrate != SILENCE)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
247 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
248 if(q->bitrate == RATE_OCTAVE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
249 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
250 g1[0] = 2 * q->frame.cbgain[0]
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
251 + 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
252 subframes_count = 8;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
253 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
254 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
255 assert(q->bitrate == I_F_Q);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
256
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
257 g1[0] = q->prev_g1[1];
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
258 switch(q->erasure_count)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
259 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
260 case 1 : break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
261 case 2 : g1[0] -= 1; break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
262 case 3 : g1[0] -= 2; break;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
263 default: g1[0] -= 6;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
264 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
265 if(g1[0] < 0)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
266 g1[0] = 0;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
267 subframes_count = 4;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
268 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
269 // This interpolation is done to produce smoother background noise.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
270 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
271 for(i=1; i<=subframes_count; i++)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
272 gain[i-1] = q->last_codebook_gain + slope * i;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
273
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
274 q->last_codebook_gain = gain[i-2];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
275 q->prev_g1[0] = q->prev_g1[1];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
276 q->prev_g1[1] = g1[0];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
277 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
278 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
279
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
280 /**
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
281 * If the received packet is Rate 1/4 a further sanity check is made of the
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
282 * codebook gain.
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
283 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
284 * @param cbgain the unpacked cbgain array
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
285 * @return -1 if the sanity check fails, 0 otherwise
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
286 *
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
287 * TIA/EIA/IS-733 2.4.8.7.3
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
288 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
289 static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
290 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
291 int i, diff, prev_diff=0;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
292
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
293 for(i=1; i<5; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
294 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
295 diff = cbgain[i] - cbgain[i-1];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
296 if(FFABS(diff) > 10)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
297 return -1;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
298 else if(FFABS(diff - prev_diff) > 12)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
299 return -1;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
300 prev_diff = diff;
8193
c04182909bd8 Trivial, Cosmetics
reynaldo
parents: 8192
diff changeset
301 }
c04182909bd8 Trivial, Cosmetics
reynaldo
parents: 8192
diff changeset
302 return 0;
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
303 }
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
304
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
305 /**
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
306 * Computes the scaled codebook vector Cdn From INDEX and GAIN
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
307 * for all rates.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
308 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
309 * The specification lacks some information here.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
310 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
311 * 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
312 * 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
313 * 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
314 * 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
315 * 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
316 * RI-compliant results.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
317 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
318 * 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
319 * have to do these calculations per codebook subframe and adjust given
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
320 * equation values accordingly.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
321 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
322 * @param q the context
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
323 * @param gain array holding the 4 pitch subframe gain values
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
324 * @param cdn_vector array for the generated scaled codebook vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
325 */
8253
d1724ad564e7 Removes misleading const qualifier, gets rid of two compiler warnings
reynaldo
parents: 8247
diff changeset
326 static void compute_svector(QCELPContext *q, const float *gain,
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
327 float *cdn_vector)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
328 {
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
329 int i, j, k;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
330 uint16_t cbseed, cindex;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
331 float *rnd, tmp_gain, fir_filter_value;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
332
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
333 switch(q->bitrate)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
334 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
335 case RATE_FULL:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
336 for(i=0; i<16; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
337 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
338 tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
339 cindex = -q->frame.cindex[i];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
340 for(j=0; j<10; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
341 *cdn_vector++ = tmp_gain * qcelp_rate_full_codebook[cindex++ & 127];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
342 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
343 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
344 case RATE_HALF:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
345 for(i=0; i<4; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
346 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
347 tmp_gain = gain[i] * QCELP_RATE_HALF_CODEBOOK_RATIO;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
348 cindex = -q->frame.cindex[i];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
349 for (j = 0; j < 40; j++)
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
350 *cdn_vector++ = tmp_gain * qcelp_rate_half_codebook[cindex++ & 127];
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
351 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
352 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
353 case RATE_QUARTER:
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
354 cbseed = (0x0003 & q->frame.lspv[4])<<14 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
355 (0x003F & q->frame.lspv[3])<< 8 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
356 (0x0060 & q->frame.lspv[2])<< 1 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
357 (0x0007 & q->frame.lspv[1])<< 3 |
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
358 (0x0038 & q->frame.lspv[0])>> 3 ;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
359 rnd = q->rnd_fir_filter_mem + 20;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
360 for(i=0; i<8; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
361 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
362 tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
363 for(k=0; k<20; k++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
364 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
365 cbseed = 521 * cbseed + 259;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
366 *rnd = (int16_t)cbseed;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
367
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
368 // FIR filter
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
369 fir_filter_value = 0.0;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
370 for(j=0; j<10; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
371 fir_filter_value += qcelp_rnd_fir_coefs[j ]
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
372 * (rnd[-j ] + rnd[-20+j]);
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_value += qcelp_rnd_fir_coefs[10] * rnd[-10];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
375 *cdn_vector++ = tmp_gain * fir_filter_value;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
376 rnd++;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
377 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
378 }
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
379 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
380 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
381 case RATE_OCTAVE:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
382 cbseed = q->first16bits;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
383 for(i=0; i<8; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
384 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
385 tmp_gain = gain[i] * (QCELP_SQRT1887 / 32768.0);
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
386 for(j=0; j<20; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
387 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
388 cbseed = 521 * cbseed + 259;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
389 *cdn_vector++ = tmp_gain * (int16_t)cbseed;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
390 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
391 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
392 break;
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
393 case I_F_Q:
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
394 cbseed = -44; // random codebook index
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
395 for(i=0; i<4; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
396 {
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
397 tmp_gain = gain[i] * QCELP_RATE_FULL_CODEBOOK_RATIO;
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
398 for(j=0; j<40; j++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
399 *cdn_vector++ = tmp_gain * qcelp_rate_full_codebook[cbseed++ & 127];
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
400 }
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
401 break;
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
402 case SILENCE:
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
403 memset(cdn_vector, 0, 160 * sizeof(float));
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
404 break;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
405 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
406 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
407
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
408 /**
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
409 * Compute the gain control
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
410 *
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
411 * @param v_in gain-controlled vector
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
412 * @param v_ref vector to control gain of
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
413 *
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
414 * @return gain control
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
415 *
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
416 * FIXME: If v_ref is a zero vector, it energy is zero
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
417 * and the behavior of the gain control is
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
418 * undefined in the specs.
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
419 *
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
420 * TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
421 */
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
422 static float compute_gain_ctrl(const float *v_ref, const float *v_in, const int len)
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
423 {
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
424 float scalefactor = ff_dot_productf(v_in, v_in, len);
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
425
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
426 if(scalefactor)
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
427 scalefactor = sqrt(ff_dot_productf(v_ref, v_ref, len) / scalefactor);
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
428 else
9891
7ad7d4094d1f Rename ff_log_missing_feature() to av_log_missing_feature().
rbultje
parents: 9629
diff changeset
429 av_log_missing_feature(NULL, "Zero energy for gain control", 1);
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
430 return scalefactor;
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
431 }
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
432
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
433 /**
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
434 * Apply generic gain control.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
435 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
436 * @param v_out output vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
437 * @param v_in gain-controlled vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
438 * @param v_ref vector to control gain of
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
439 *
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
440 * 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
441 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
442 static void apply_gain_ctrl(float *v_out, const float *v_ref,
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
443 const float *v_in)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
444 {
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
445 int i, j, len;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
446 float scalefactor;
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
447
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
448 for(i=0, j=0; i<4; i++)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
449 {
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
450 scalefactor = compute_gain_ctrl(v_ref + j, v_in + j, 40);
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
451 for(len=j+40; j<len; j++)
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
452 v_out[j] = scalefactor * v_in[j];
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
453 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
454 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
455
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
456 /**
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
457 * Apply filter in pitch-subframe steps.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
458 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
459 * @param memory buffer for the previous state of the filter
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
460 * - must be able to contain 303 elements
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
461 * - the 143 first elements are from the previous state
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
462 * - the next 160 are for output
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
463 * @param v_in input filter vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
464 * @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
465 * @param lag per-subframe lag array, each element is
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
466 * - between 16 and 143 if its corresponding pfrac is 0,
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
467 * - between 16 and 139 otherwise
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
468 * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
469 * otherwise
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
470 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
471 * @return filter output vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
472 */
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
473 static const float *do_pitchfilter(float memory[303], const float v_in[160],
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
474 const float gain[4], const uint8_t *lag,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
475 const uint8_t pfrac[4])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
476 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
477 int i, j;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
478 float *v_lag, *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
479 const float *v_len;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
480
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
481 v_out = memory + 143; // Output vector starts at memory[143].
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
482
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
483 for(i=0; i<4; i++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
484 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
485 if(gain[i])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
486 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
487 v_lag = memory + 143 + 40 * i - lag[i];
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
488 for(v_len=v_in+40; v_in<v_len; v_in++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
489 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
490 if(pfrac[i]) // If it is a fractional lag...
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
491 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
492 for(j=0, *v_out=0.; j<4; j++)
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
493 *v_out += qcelp_hammsinc_table[j] * (v_lag[j-4] + v_lag[3-j]);
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
494 }else
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
495 *v_out = *v_lag;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
496
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
497 *v_out = *v_in + gain[i] * *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
498
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
499 v_lag++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
500 v_out++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
501 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
502 }else
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
503 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
504 memcpy(v_out, v_in, 40 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
505 v_in += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
506 v_out += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
507 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
508 }
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
509
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
510 memmove(memory, memory + 160, 143 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
511 return memory + 143;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
512 }
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
513
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
514 /**
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
515 * 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
516 * 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
517 *
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
518 * @param q the context
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
519 * @param cdn_vector the scaled codebook vector
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
520 */
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
521 static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
522 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
523 int i;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
524 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
525
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
526 if(q->bitrate >= RATE_HALF ||
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
527 q->bitrate == SILENCE ||
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
528 (q->bitrate == I_F_Q && (q->prev_bitrate >= RATE_HALF)))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
529 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
530
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
531 if(q->bitrate >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
532 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
533
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
534 // Compute gain & lag for the whole frame.
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
535 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
536 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
537 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
538
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
539 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
540 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
541 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
542 {
8408
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
543 float max_pitch_gain;
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
544
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
545 if (q->bitrate == I_F_Q)
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
546 {
8480
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
547 if (q->erasure_count < 3)
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
548 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
549 else
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
550 max_pitch_gain = 0.0;
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
551 }else
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
552 {
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
553 assert(q->bitrate == SILENCE);
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
554 max_pitch_gain = 1.0;
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
555 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
556 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
557 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
558
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
559 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
560 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
561
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
562 // pitch synthesis filter
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
563 v_synthesis_filtered = do_pitchfilter(q->pitch_synthesis_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
564 cdn_vector, q->pitch_gain,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
565 q->pitch_lag, q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
566
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
567 // pitch prefilter update
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
568 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
569 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
570
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
571 v_pre_filtered = do_pitchfilter(q->pitch_pre_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
572 v_synthesis_filtered,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
573 q->pitch_gain, q->pitch_lag,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
574 q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
575
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
576 apply_gain_ctrl(cdn_vector, v_synthesis_filtered, v_pre_filtered);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
577 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
578 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
579 memcpy(q->pitch_synthesis_filter_mem, cdn_vector + 17,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
580 143 * sizeof(float));
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
581 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
582 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
583 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
584 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
585 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
586
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
587 /**
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
588 * Reconstructs LPC coefficients from the line spectral pair frequencies
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
589 * and performs bandwidth expansion.
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
590 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
591 * @param lspf line spectral pair frequencies
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
592 * @param lpc linear predictive coding coefficients
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
593 *
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
594 * @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
595 * 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
596 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
597 * 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
598 */
9343
dfe2d348aa50 Add missing static qualifier from function declaration. Patch by Kenan
reynaldo
parents: 9157
diff changeset
599 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
600 {
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
601 double lsp[10];
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
602 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
603 int i;
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
604
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
605 for (i=0; i<10; i++)
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
606 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
607
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
608 ff_acelp_lspd2lpc(lsp, lpc);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
609
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
610 for (i=0; i<10; i++)
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
611 {
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
612 lpc[i] *= bandwidth_expansion_coeff;
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
613 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
614 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
615 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
616
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
617 /**
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
618 * Interpolates LSP frequencies and computes LPC coefficients
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
619 * for a given bitrate & pitch subframe.
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
620 *
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
621 * 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
622 *
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
623 * @param q the context
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
624 * @param curr_lspf LSP frequencies vector of the current frame
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
625 * @param lpc float vector for the resulting LPC
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
626 * @param subframe_num frame number in decoded stream
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
627 */
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
628 void interpolate_lpc(QCELPContext *q, const float *curr_lspf, float *lpc,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
629 const int subframe_num)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
630 {
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
631 float interpolated_lspf[10];
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
632 float weight;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
633
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
634 if(q->bitrate >= RATE_QUARTER)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
635 weight = 0.25 * (subframe_num + 1);
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
636 else if(q->bitrate == RATE_OCTAVE && !subframe_num)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
637 weight = 0.625;
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
638 else
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
639 weight = 1.0;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
640
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
641 if(weight != 1.0)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
642 {
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
643 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
644 weight, 1.0 - weight, 10);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
645 lspf2lpc(interpolated_lspf, lpc);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
646 }else if(q->bitrate >= RATE_QUARTER ||
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
647 (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
648 lspf2lpc(curr_lspf, lpc);
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
649 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
650 lspf2lpc(q->prev_lspf, lpc);
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
651 }
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
652
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
653 static qcelp_packet_rate buf_size2bitrate(const int buf_size)
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
654 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
655 switch(buf_size)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
656 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
657 case 35: return RATE_FULL;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
658 case 17: return RATE_HALF;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
659 case 8: return RATE_QUARTER;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
660 case 4: return RATE_OCTAVE;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
661 case 1: return SILENCE;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
662 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
663
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
664 return I_F_Q;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
665 }
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
666
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
667 /**
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
668 * 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
669 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
670 * @param avctx the AV codec context
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
671 * @param buf_size length of the buffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
672 * @param buf the bufffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
673 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
674 * @return the bitrate on success,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
675 * I_F_Q if the bitrate cannot be satisfactorily determined
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
676 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
677 * TIA/EIA/IS-733 2.4.8.7.1
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
678 */
8500
2c3d8a3d902c Silence one warning when compiling with icc:
cehoyos
parents: 8480
diff changeset
679 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
680 const uint8_t **buf)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
681 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
682 qcelp_packet_rate bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
683
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
684 if((bitrate = buf_size2bitrate(buf_size)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
685 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
686 if(bitrate > **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
687 {
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
688 QCELPContext *q = avctx->priv_data;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
689 if (!q->warned_buf_mismatch_bitrate)
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
690 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
691 av_log(avctx, AV_LOG_WARNING,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
692 "Claimed bitrate and buffer size mismatch.\n");
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
693 q->warned_buf_mismatch_bitrate = 1;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
694 }
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
695 bitrate = **buf;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
696 }else if(bitrate < **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
697 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
698 av_log(avctx, AV_LOG_ERROR,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
699 "Buffer is too small for the claimed bitrate.\n");
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
700 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
701 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
702 (*buf)++;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
703 }else if((bitrate = buf_size2bitrate(buf_size + 1)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
704 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
705 av_log(avctx, AV_LOG_WARNING,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
706 "Bitrate byte is missing, guessing the bitrate from packet size.\n");
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
707 }else
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
708 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
709
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
710 if(bitrate == SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
711 {
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
712 //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
713 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
714 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
715 return bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
716 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
717
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
718 static void warn_insufficient_frame_quality(AVCodecContext *avctx,
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
719 const char *message)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
720 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
721 av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
722 message);
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
723 }
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
724
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
725 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
726 AVPacket *avpkt)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
727 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
728 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
729 int buf_size = avpkt->size;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
730 QCELPContext *q = avctx->priv_data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
731 float *outbuffer = data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
732 int i;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
733 float quantized_lspf[10], lpc[10];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
734 float gain[16];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
735 float *formant_mem;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
736
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
737 if((q->bitrate = determine_bitrate(avctx, buf_size, &buf)) == I_F_Q)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
738 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
739 warn_insufficient_frame_quality(avctx, "bitrate cannot be determined.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
740 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
741 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
742
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
743 if(q->bitrate == RATE_OCTAVE &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
744 (q->first16bits = AV_RB16(buf)) == 0xFFFF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
745 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
746 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
747 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
748 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
749
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
750 if(q->bitrate > SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
751 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
752 const QCELPBitmap *bitmaps = qcelp_unpacking_bitmaps_per_rate[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
753 const QCELPBitmap *bitmaps_end = qcelp_unpacking_bitmaps_per_rate[q->bitrate]
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
754 + qcelp_unpacking_bitmaps_lengths[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
755 uint8_t *unpacked_data = (uint8_t *)&q->frame;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
756
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
757 init_get_bits(&q->gb, buf, 8*buf_size);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
758
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
759 memset(&q->frame, 0, sizeof(QCELPFrame));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
760
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
761 for(; bitmaps < bitmaps_end; bitmaps++)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
762 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
763
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
764 // 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
765 if(q->frame.reserved)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
766 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
767 warn_insufficient_frame_quality(avctx, "Wrong data in reserved frame area.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
768 goto erasure;
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 if(q->bitrate == RATE_QUARTER &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
771 codebook_sanity_check_for_rate_quarter(q->frame.cbgain))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
772 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
773 warn_insufficient_frame_quality(avctx, "Codebook gain sanity check failed.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
774 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
775 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
776
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
777 if(q->bitrate >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
778 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
779 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
780 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
781 if(q->frame.pfrac[i] && q->frame.plag[i] >= 124)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
782 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
783 warn_insufficient_frame_quality(avctx, "Cannot initialize pitch filter.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
784 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
785 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
786 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
787 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
788 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
789
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
790 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
791 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
792
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
793 if(decode_lspf(q, quantized_lspf) < 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
794 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
795 warn_insufficient_frame_quality(avctx, "Badly received packets in frame.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
796 goto erasure;
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
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
800 apply_pitch_filters(q, 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(q->bitrate == I_F_Q)
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 erasure:
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
805 q->bitrate = I_F_Q;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
806 q->erasure_count++;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
807 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
808 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
809 decode_lspf(q, quantized_lspf);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
810 apply_pitch_filters(q, outbuffer);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
811 }else
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
812 q->erasure_count = 0;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
813
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
814 formant_mem = q->formant_mem + 10;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
815 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
816 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
817 interpolate_lpc(q, quantized_lspf, lpc, i);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
818 ff_celp_lp_synthesis_filterf(formant_mem, lpc, outbuffer + i * 40, 40,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
819 10);
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
820 formant_mem += 40;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
821 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
822 memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
823
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
824 // FIXME: postfilter and final gain control should be here.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
825 // TIA/EIA/IS-733 2.4.8.6
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
826
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
827 formant_mem = q->formant_mem + 10;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
828 for(i=0; i<160; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
829 *outbuffer++ = av_clipf(*formant_mem++, QCELP_CLIP_LOWER_BOUND,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
830 QCELP_CLIP_UPPER_BOUND);
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
831
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
832 memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
833 q->prev_bitrate = q->bitrate;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
834
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
835 *data_size = 160 * sizeof(*outbuffer);
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 return *data_size;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
838 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
839
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
840 AVCodec qcelp_decoder =
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
841 {
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
842 .name = "qcelp",
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
843 .type = CODEC_TYPE_AUDIO,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
844 .id = CODEC_ID_QCELP,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
845 .init = qcelp_decode_init,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
846 .decode = qcelp_decode_frame,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
847 .priv_data_size = sizeof(QCELPContext),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
848 .long_name = NULL_IF_CONFIG_SMALL("QCELP / PureVoice"),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
849 };