annotate qcelpdec.c @ 11034:fd5921186064 libavcodec

Make the fast loop filter path work with unavailable left MBs. This prevents the issue with having to switch between slow and fast code paths in each row. 0.5% faster loopfilter for cathedral
author michael
date Thu, 28 Jan 2010 02:15:25 +0000
parents 59be1a7be21f
children 8a4984c5cacc
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 /**
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
409 * Apply generic gain control.
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
410 *
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
411 * @param v_out output vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
412 * @param v_in gain-controlled vector
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
413 * @param v_ref vector to control gain of
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
414 *
9353
70c3982d0bad Move scale factor computation to its own function. Patch by Kenan
reynaldo
parents: 9343
diff changeset
415 * 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
416 */
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
417 static void apply_gain_ctrl(float *v_out, const float *v_ref,
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
418 const float *v_in)
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
419 {
10493
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
420 int i;
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
421
10493
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
422 for (i = 0; i < 160; i += 40)
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
423 ff_scale_vector_to_given_sum_of_squares(v_out + i, v_in + i,
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
424 ff_dot_productf(v_ref + i,
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
425 v_ref + i, 40),
5f2ced30548b Implement ff_scale_vector_to_given_sum_of_squares()
reynaldo
parents: 10011
diff changeset
426 40);
8145
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
427 }
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
428
f27d01aff4af More OKed parts of the QCELP decoder
vitor
parents: 8127
diff changeset
429 /**
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
430 * Apply filter in pitch-subframe steps.
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
431 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
432 * @param memory buffer for the previous state of the filter
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
433 * - must be able to contain 303 elements
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
434 * - the 143 first elements are from the previous state
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
435 * - the next 160 are for output
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
436 * @param v_in input filter vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
437 * @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
438 * @param lag per-subframe lag array, each element is
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
439 * - between 16 and 143 if its corresponding pfrac is 0,
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
440 * - between 16 and 139 otherwise
8192
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
441 * @param pfrac per-subframe boolean array, 1 if the lag is fractional, 0
d6b40db1a747 Trivial, Cosmetics
reynaldo
parents: 8191
diff changeset
442 * otherwise
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
443 *
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
444 * @return filter output vector
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
445 */
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
446 static const float *do_pitchfilter(float memory[303], const float v_in[160],
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
447 const float gain[4], const uint8_t *lag,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
448 const uint8_t pfrac[4])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
449 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
450 int i, j;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
451 float *v_lag, *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
452 const float *v_len;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
453
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
454 v_out = memory + 143; // Output vector starts at memory[143].
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
455
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
456 for(i=0; i<4; i++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
457 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
458 if(gain[i])
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
459 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
460 v_lag = memory + 143 + 40 * i - lag[i];
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
461 for(v_len=v_in+40; v_in<v_len; v_in++)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
462 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
463 if(pfrac[i]) // If it is a fractional lag...
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
464 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
465 for(j=0, *v_out=0.; j<4; j++)
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
466 *v_out += qcelp_hammsinc_table[j] * (v_lag[j-4] + v_lag[3-j]);
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
467 }else
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
468 *v_out = *v_lag;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
469
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
470 *v_out = *v_in + gain[i] * *v_out;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
471
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
472 v_lag++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
473 v_out++;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
474 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
475 }else
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
476 {
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
477 memcpy(v_out, v_in, 40 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
478 v_in += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
479 v_out += 40;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
480 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
481 }
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
482
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
483 memmove(memory, memory + 160, 143 * sizeof(float));
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
484 return memory + 143;
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
485 }
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
486
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
487 /**
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
488 * 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
489 * 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
490 *
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
491 * @param q the context
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
492 * @param cdn_vector the scaled codebook vector
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
493 */
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
494 static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
495 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
496 int i;
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
497 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
498
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
499 if(q->bitrate >= RATE_HALF ||
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
500 q->bitrate == SILENCE ||
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
501 (q->bitrate == I_F_Q && (q->prev_bitrate >= RATE_HALF)))
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
502 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
503
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
504 if(q->bitrate >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
505 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
506
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
507 // Compute gain & lag for the whole frame.
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
508 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
509 {
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
510 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
511
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
512 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
513 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
514 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
515 {
8408
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
516 float max_pitch_gain;
c7e800518b8b Cosmetics by Kenan Gillet. Part 1 of 3 of his 'qcelp: silence handling'
reynaldo
parents: 8289
diff changeset
517
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
518 if (q->bitrate == I_F_Q)
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
519 {
8480
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
520 if (q->erasure_count < 3)
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
521 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
522 else
c0f1e9a9402c COSMETICS Part 3 and final of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8479
diff changeset
523 max_pitch_gain = 0.0;
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
524 }else
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
525 {
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
526 assert(q->bitrate == SILENCE);
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
527 max_pitch_gain = 1.0;
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
528 }
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
529 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
530 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
531
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
532 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
533 }
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
534
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
535 // pitch synthesis filter
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
536 v_synthesis_filtered = do_pitchfilter(q->pitch_synthesis_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
537 cdn_vector, q->pitch_gain,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
538 q->pitch_lag, q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
539
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
540 // pitch prefilter update
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
541 for(i=0; i<4; i++)
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
542 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
543
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
544 v_pre_filtered = do_pitchfilter(q->pitch_pre_filter_mem,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
545 v_synthesis_filtered,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
546 q->pitch_gain, q->pitch_lag,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
547 q->frame.pfrac);
8240
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
548
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
549 apply_gain_ctrl(cdn_vector, v_synthesis_filtered, v_pre_filtered);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
550 }else
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
551 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
552 memcpy(q->pitch_synthesis_filter_mem, cdn_vector + 17,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
553 143 * sizeof(float));
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
554 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
555 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
556 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
557 }
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
d3d0d9cc0e50 Commit last ok'ed parts of QCELP decoder and enable it.
vitor
parents: 8238
diff changeset
560 /**
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
561 * 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
562 * and performs bandwidth expansion.
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
563 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
564 * @param lspf line spectral pair frequencies
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
565 * @param lpc linear predictive coding coefficients
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
566 *
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
567 * @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
568 * 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
569 *
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
570 * 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
571 */
9343
dfe2d348aa50 Add missing static qualifier from function declaration. Patch by Kenan
reynaldo
parents: 9157
diff changeset
572 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
573 {
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
574 double lsp[10];
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
575 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
576 int i;
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
577
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
578 for (i=0; i<10; i++)
10010
18dab2b47db7 Make the LSP naming more consistent
superdump
parents: 9891
diff changeset
579 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
580
10502
f132cde57bbe Do not hardcode filter order in ff_acelp_lspd2lpc()
vitor
parents: 10493
diff changeset
581 ff_acelp_lspd2lpc(lsp, lpc, 5);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
582
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
583 for (i=0; i<10; i++)
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
584 {
9629
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
585 lpc[i] *= bandwidth_expansion_coeff;
3c98f3e1b719 Fix bandwith vs. bandwiDth typo.
diego
parents: 9594
diff changeset
586 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
587 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
588 }
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
589
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
590 /**
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
591 * Interpolates LSP frequencies and computes LPC coefficients
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
592 * for a given bitrate & pitch subframe.
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
593 *
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
594 * 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
595 *
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
596 * @param q the context
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
597 * @param curr_lspf LSP frequencies vector of the current frame
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
598 * @param lpc float vector for the resulting LPC
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
599 * @param subframe_num frame number in decoded stream
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
600 */
10770
59be1a7be21f Reindent after last commit
vitor
parents: 10769
diff changeset
601 static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
59be1a7be21f Reindent after last commit
vitor
parents: 10769
diff changeset
602 float *lpc, const int subframe_num)
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
603 {
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
604 float interpolated_lspf[10];
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
605 float weight;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
606
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
607 if(q->bitrate >= RATE_QUARTER)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
608 weight = 0.25 * (subframe_num + 1);
8191
cc1e8c59f1e8 More OKed parts of the QCELP decoder
vitor
parents: 8151
diff changeset
609 else if(q->bitrate == RATE_OCTAVE && !subframe_num)
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
610 weight = 0.625;
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
611 else
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
612 weight = 1.0;
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
613
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
614 if(weight != 1.0)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
615 {
9156
139d30c8c274 Functional part Kenan Gillet's 'extract and share weighted_vector_sumf'
reynaldo
parents: 9123
diff changeset
616 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
617 weight, 1.0 - weight, 10);
9123
36a5caff8540 Part 2 of 2 of Kenan Gillet's 'make ff_qcelp_lspf2lpc
reynaldo
parents: 8718
diff changeset
618 lspf2lpc(interpolated_lspf, lpc);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
619 }else if(q->bitrate >= RATE_QUARTER ||
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
620 (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
621 lspf2lpc(curr_lspf, lpc);
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
622 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
623 lspf2lpc(q->prev_lspf, lpc);
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
624 }
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
625
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
626 static qcelp_packet_rate buf_size2bitrate(const int buf_size)
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
627 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
628 switch(buf_size)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
629 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
630 case 35: return RATE_FULL;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
631 case 17: return RATE_HALF;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
632 case 8: return RATE_QUARTER;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
633 case 4: return RATE_OCTAVE;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
634 case 1: return SILENCE;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
635 }
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
636
8260
8aa88616d6d8 Silence some ICC warnings. Patch by Vitor Sessak.
reynaldo
parents: 8259
diff changeset
637 return I_F_Q;
8123
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
638 }
cd756806be02 More OKed parts of the QCELP decoder
vitor
parents: 8096
diff changeset
639
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
640 /**
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
641 * 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
642 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
643 * @param avctx the AV codec context
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
644 * @param buf_size length of the buffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
645 * @param buf the bufffer
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
646 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
647 * @return the bitrate on success,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
648 * I_F_Q if the bitrate cannot be satisfactorily determined
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
649 *
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
650 * TIA/EIA/IS-733 2.4.8.7.1
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
651 */
8500
2c3d8a3d902c Silence one warning when compiling with icc:
cehoyos
parents: 8480
diff changeset
652 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
653 const uint8_t **buf)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
654 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
655 qcelp_packet_rate bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
656
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
657 if((bitrate = buf_size2bitrate(buf_size)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
658 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
659 if(bitrate > **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
660 {
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
661 QCELPContext *q = avctx->priv_data;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
662 if (!q->warned_buf_mismatch_bitrate)
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
663 {
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
664 av_log(avctx, AV_LOG_WARNING,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
665 "Claimed bitrate and buffer size mismatch.\n");
8289
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
666 q->warned_buf_mismatch_bitrate = 1;
e4877f9fc823 Avoid the 'Claimed bitrate and buffer size mismatch' warning storm.
reynaldo
parents: 8281
diff changeset
667 }
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
668 bitrate = **buf;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
669 }else if(bitrate < **buf)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
670 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
671 av_log(avctx, AV_LOG_ERROR,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
672 "Buffer is too small for the claimed bitrate.\n");
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
673 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
674 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
675 (*buf)++;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
676 }else if((bitrate = buf_size2bitrate(buf_size + 1)) >= 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
677 {
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
678 av_log(avctx, AV_LOG_WARNING,
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
679 "Bitrate byte is missing, guessing the bitrate from packet size.\n");
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
680 }else
8238
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
681 return I_F_Q;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
682
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
683 if(bitrate == SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
684 {
8479
e818b3c06712 Part 2 of Kenan Gillet's QCELP silence handling patch.
reynaldo
parents: 8408
diff changeset
685 //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
686 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
687 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
688 return bitrate;
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
689 }
93ee77578391 More OKed parts of the QCELP decoder
vitor
parents: 8230
diff changeset
690
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
691 static void warn_insufficient_frame_quality(AVCodecContext *avctx,
8150
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
692 const char *message)
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
693 {
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
694 av_log(avctx, AV_LOG_WARNING, "Frame #%d, IFQ: %s\n", avctx->frame_number,
4da8fc62ae00 Cosmetics
reynaldo
parents: 8145
diff changeset
695 message);
8096
eb55481f35fa OKed parts of the QCELP decoder
vitor
parents:
diff changeset
696 }
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
697
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
698 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
699 AVPacket *avpkt)
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
700 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
701 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9353
diff changeset
702 int buf_size = avpkt->size;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
703 QCELPContext *q = avctx->priv_data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
704 float *outbuffer = data;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
705 int i;
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
706 float quantized_lspf[10], lpc[10];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
707 float gain[16];
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
708 float *formant_mem;
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
709
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
710 if((q->bitrate = determine_bitrate(avctx, buf_size, &buf)) == I_F_Q)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
711 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
712 warn_insufficient_frame_quality(avctx, "bitrate cannot be determined.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
713 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
714 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
715
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
716 if(q->bitrate == RATE_OCTAVE &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
717 (q->first16bits = AV_RB16(buf)) == 0xFFFF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
718 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
719 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
720 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
721 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
722
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
723 if(q->bitrate > SILENCE)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
724 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
725 const QCELPBitmap *bitmaps = qcelp_unpacking_bitmaps_per_rate[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
726 const QCELPBitmap *bitmaps_end = qcelp_unpacking_bitmaps_per_rate[q->bitrate]
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
727 + qcelp_unpacking_bitmaps_lengths[q->bitrate];
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
728 uint8_t *unpacked_data = (uint8_t *)&q->frame;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
729
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
730 init_get_bits(&q->gb, buf, 8*buf_size);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
731
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
732 memset(&q->frame, 0, sizeof(QCELPFrame));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
733
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
734 for(; bitmaps < bitmaps_end; bitmaps++)
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
735 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
736
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
737 // 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
738 if(q->frame.reserved)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
739 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
740 warn_insufficient_frame_quality(avctx, "Wrong data in reserved frame area.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
741 goto erasure;
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_QUARTER &&
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
744 codebook_sanity_check_for_rate_quarter(q->frame.cbgain))
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, "Codebook gain sanity check failed.");
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 >= RATE_HALF)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
751 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
752 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
753 {
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
754 if(q->frame.pfrac[i] && q->frame.plag[i] >= 124)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
755 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
756 warn_insufficient_frame_quality(avctx, "Cannot initialize pitch filter.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
757 goto erasure;
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 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
760 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
761 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
762
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
763 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
764 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
765
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
766 if(decode_lspf(q, quantized_lspf) < 0)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
767 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
768 warn_insufficient_frame_quality(avctx, "Badly received packets in frame.");
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
769 goto erasure;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
770 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
771
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
772
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
773 apply_pitch_filters(q, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
774
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
775 if(q->bitrate == I_F_Q)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
776 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
777 erasure:
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
778 q->bitrate = I_F_Q;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
779 q->erasure_count++;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
780 decode_gain_and_index(q, gain);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
781 compute_svector(q, gain, outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
782 decode_lspf(q, quantized_lspf);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
783 apply_pitch_filters(q, outbuffer);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
784 }else
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
785 q->erasure_count = 0;
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 formant_mem = q->formant_mem + 10;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
788 for(i=0; i<4; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
789 {
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
790 interpolate_lpc(q, quantized_lspf, lpc, i);
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
791 ff_celp_lp_synthesis_filterf(formant_mem, lpc, outbuffer + i * 40, 40,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
792 10);
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
793 formant_mem += 40;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
794 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
795 memcpy(q->formant_mem, q->formant_mem + 160, 10 * sizeof(float));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
796
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
797 // FIXME: postfilter and final gain control should be here.
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
798 // TIA/EIA/IS-733 2.4.8.6
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 formant_mem = q->formant_mem + 10;
8246
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
801 for(i=0; i<160; i++)
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
802 *outbuffer++ = av_clipf(*formant_mem++, QCELP_CLIP_LOWER_BOUND,
75ae6859ac73 Trivial, Cosmetics, mostly brace placement changes
reynaldo
parents: 8240
diff changeset
803 QCELP_CLIP_UPPER_BOUND);
8230
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
804
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
805 memcpy(q->prev_lspf, quantized_lspf, sizeof(q->prev_lspf));
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
806 q->prev_bitrate = q->bitrate;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
807
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
808 *data_size = 160 * sizeof(*outbuffer);
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
809
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
810 return *data_size;
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
811 }
72949bacc1b9 More OKed parts of the QCELP decoder
vitor
parents: 8193
diff changeset
812
8127
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
813 AVCodec qcelp_decoder =
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
814 {
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
815 .name = "qcelp",
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
816 .type = CODEC_TYPE_AUDIO,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
817 .id = CODEC_ID_QCELP,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
818 .init = qcelp_decode_init,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
819 .decode = qcelp_decode_frame,
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
820 .priv_data_size = sizeof(QCELPContext),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
821 .long_name = NULL_IF_CONFIG_SMALL("QCELP / PureVoice"),
3b5256153553 More OKed parts of the QCELP decoder
vitor
parents: 8123
diff changeset
822 };