annotate amrnbdec.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents b42e02e9bf2b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1 /*
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
2 * AMR narrowband decoder
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
3 * Copyright (c) 2006-2007 Robert Swain
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
4 * Copyright (c) 2009 Colin McQuillan
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
5 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
6 * This file is part of FFmpeg.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
7 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
12 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
16 * Lesser General Public License for more details.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
17 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
21 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
22
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
23
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
24 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
25 * @file
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
26 * AMR narrowband decoder
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
27 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
28 * This decoder uses floats for simplicity and so is not bit-exact. One
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
29 * difference is that differences in phase can accumulate. The test sequences
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
30 * in 3GPP TS 26.074 can still be useful.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
31 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
32 * - Comparing this file's output to the output of the ref decoder gives a
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
33 * PSNR of 30 to 80. Plotting the output samples shows a difference in
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
34 * phase in some areas.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
35 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
36 * - Comparing both decoders against their input, this decoder gives a similar
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
37 * PSNR. If the test sequence homing frames are removed (this decoder does
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
38 * not detect them), the PSNR is at least as good as the reference on 140
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
39 * out of 169 tests.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
40 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
41
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
42
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
43 #include <string.h>
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
44 #include <math.h>
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
45
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
46 #include "avcodec.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
47 #include "get_bits.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
48 #include "libavutil/common.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
49 #include "celp_math.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
50 #include "celp_filters.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
51 #include "acelp_filters.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
52 #include "acelp_vectors.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
53 #include "acelp_pitch_delay.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
54 #include "lsp.h"
12485
b42e02e9bf2b Move AMR-NB frame unpacking code to a common file so it can be reused in
vitor
parents: 12464
diff changeset
55 #include "amr.h"
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
56
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
57 #include "amrnbdata.h"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
58
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
59 #define AMR_BLOCK_SIZE 160 ///< samples per frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
60 #define AMR_SAMPLE_BOUND 32768.0 ///< threshold for synthesis overflow
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
61
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
62 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
63 * Scale from constructed speech to [-1,1]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
64 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
65 * AMR is designed to produce 16-bit PCM samples (3GPP TS 26.090 4.2) but
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
66 * upscales by two (section 6.2.2).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
67 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
68 * Fundamentally, this scale is determined by energy_mean through
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
69 * the fixed vector contribution to the excitation vector.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
70 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
71 #define AMR_SAMPLE_SCALE (2.0 / 32768.0)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
72
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
73 /** Prediction factor for 12.2kbit/s mode */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
74 #define PRED_FAC_MODE_12k2 0.65
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
75
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
76 #define LSF_R_FAC (8000.0 / 32768.0) ///< LSF residual tables to Hertz
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
77 #define MIN_LSF_SPACING (50.0488 / 8000.0) ///< Ensures stability of LPC filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
78 #define PITCH_LAG_MIN_MODE_12k2 18 ///< Lower bound on decoded lag search in 12.2kbit/s mode
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
79
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
80 /** Initial energy in dB. Also used for bad frames (unimplemented). */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
81 #define MIN_ENERGY -14.0
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
82
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
83 /** Maximum sharpening factor
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
84 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
85 * The specification says 0.8, which should be 13107, but the reference C code
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
86 * uses 13017 instead. (Amusingly the same applies to SHARP_MAX in g729dec.c.)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
87 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
88 #define SHARP_MAX 0.79449462890625
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
89
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
90 /** Number of impulse response coefficients used for tilt factor */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
91 #define AMR_TILT_RESPONSE 22
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
92 /** Tilt factor = 1st reflection coefficient * gamma_t */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
93 #define AMR_TILT_GAMMA_T 0.8
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
94 /** Adaptive gain control factor used in post-filter */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
95 #define AMR_AGC_ALPHA 0.9
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
96
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
97 typedef struct AMRContext {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
98 AMRNBFrame frame; ///< decoded AMR parameters (lsf coefficients, codebook indexes, etc)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
99 uint8_t bad_frame_indicator; ///< bad frame ? 1 : 0
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
100 enum Mode cur_frame_mode;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
101
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
102 int16_t prev_lsf_r[LP_FILTER_ORDER]; ///< residual LSF vector from previous subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
103 double lsp[4][LP_FILTER_ORDER]; ///< lsp vectors from current frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
104 double prev_lsp_sub4[LP_FILTER_ORDER]; ///< lsp vector for the 4th subframe of the previous frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
105
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
106 float lsf_q[4][LP_FILTER_ORDER]; ///< Interpolated LSF vector for fixed gain smoothing
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
107 float lsf_avg[LP_FILTER_ORDER]; ///< vector of averaged lsf vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
108
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
109 float lpc[4][LP_FILTER_ORDER]; ///< lpc coefficient vectors for 4 subframes
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
110
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
111 uint8_t pitch_lag_int; ///< integer part of pitch lag from current subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
112
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
113 float excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1 + AMR_SUBFRAME_SIZE]; ///< current excitation and all necessary excitation history
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
114 float *excitation; ///< pointer to the current excitation vector in excitation_buf
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
115
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
116 float pitch_vector[AMR_SUBFRAME_SIZE]; ///< adaptive code book (pitch) vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
117 float fixed_vector[AMR_SUBFRAME_SIZE]; ///< algebraic codebook (fixed) vector (must be kept zero between frames)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
118
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
119 float prediction_error[4]; ///< quantified prediction errors {20log10(^gamma_gc)} for previous four subframes
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
120 float pitch_gain[5]; ///< quantified pitch gains for the current and previous four subframes
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
121 float fixed_gain[5]; ///< quantified fixed gains for the current and previous four subframes
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
122
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
123 float beta; ///< previous pitch_gain, bounded by [0.0,SHARP_MAX]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
124 uint8_t diff_count; ///< the number of subframes for which diff has been above 0.65
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
125 uint8_t hang_count; ///< the number of subframes since a hangover period started
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
126
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
127 float prev_sparse_fixed_gain; ///< previous fixed gain; used by anti-sparseness processing to determine "onset"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
128 uint8_t prev_ir_filter_nr; ///< previous impulse response filter "impNr": 0 - strong, 1 - medium, 2 - none
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
129 uint8_t ir_filter_onset; ///< flag for impulse response filter strength
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
130
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
131 float postfilter_mem[10]; ///< previous intermediate values in the formant filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
132 float tilt_mem; ///< previous input to tilt compensation filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
133 float postfilter_agc; ///< previous factor used for adaptive gain control
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
134 float high_pass_mem[2]; ///< previous intermediate values in the high-pass filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
135
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
136 float samples_in[LP_FILTER_ORDER + AMR_SUBFRAME_SIZE]; ///< floating point samples
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
137
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
138 } AMRContext;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
139
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
140 /** Double version of ff_weighted_vector_sumf() */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
141 static void weighted_vector_sumd(double *out, const double *in_a,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
142 const double *in_b, double weight_coeff_a,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
143 double weight_coeff_b, int length)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
144 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
145 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
146
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
147 for (i = 0; i < length; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
148 out[i] = weight_coeff_a * in_a[i]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
149 + weight_coeff_b * in_b[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
150 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
151
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
152 static av_cold int amrnb_decode_init(AVCodecContext *avctx)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
153 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
154 AMRContext *p = avctx->priv_data;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
155 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
156
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
157 avctx->sample_fmt = SAMPLE_FMT_FLT;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
158
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
159 // p->excitation always points to the same position in p->excitation_buf
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
160 p->excitation = &p->excitation_buf[PITCH_DELAY_MAX + LP_FILTER_ORDER + 1];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
161
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
162 for (i = 0; i < LP_FILTER_ORDER; i++) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
163 p->prev_lsp_sub4[i] = lsp_sub4_init[i] * 1000 / (float)(1 << 15);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
164 p->lsf_avg[i] = p->lsf_q[3][i] = lsp_avg_init[i] / (float)(1 << 15);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
165 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
166
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
167 for (i = 0; i < 4; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
168 p->prediction_error[i] = MIN_ENERGY;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
169
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
170 return 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
171 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
172
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
173
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
174 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
175 * Unpack an RFC4867 speech frame into the AMR frame mode and parameters.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
176 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
177 * The order of speech bits is specified by 3GPP TS 26.101.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
178 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
179 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
180 * @param buf pointer to the input buffer
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
181 * @param buf_size size of the input buffer
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
182 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
183 * @return the frame mode
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
184 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
185 static enum Mode unpack_bitstream(AMRContext *p, const uint8_t *buf,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
186 int buf_size)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
187 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
188 GetBitContext gb;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
189 enum Mode mode;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
190
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
191 init_get_bits(&gb, buf, buf_size * 8);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
192
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
193 // Decode the first octet.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
194 skip_bits(&gb, 1); // padding bit
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
195 mode = get_bits(&gb, 4); // frame type
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
196 p->bad_frame_indicator = !get_bits1(&gb); // quality bit
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
197 skip_bits(&gb, 2); // two padding bits
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
198
12485
b42e02e9bf2b Move AMR-NB frame unpacking code to a common file so it can be reused in
vitor
parents: 12464
diff changeset
199 if (mode < MODE_DTX)
b42e02e9bf2b Move AMR-NB frame unpacking code to a common file so it can be reused in
vitor
parents: 12464
diff changeset
200 ff_amr_bit_reorder((uint16_t *) &p->frame, sizeof(AMRNBFrame), buf + 1,
b42e02e9bf2b Move AMR-NB frame unpacking code to a common file so it can be reused in
vitor
parents: 12464
diff changeset
201 amr_unpacking_bitmaps_per_mode[mode]);
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
202
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
203 return mode;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
204 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
205
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
206
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
207 /// @defgroup amr_lpc_decoding AMR pitch LPC coefficient decoding functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
208 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
209
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
210 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
211 * Interpolate the LSF vector (used for fixed gain smoothing).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
212 * The interpolation is done over all four subframes even in MODE_12k2.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
213 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
214 * @param[in,out] lsf_q LSFs in [0,1] for each subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
215 * @param[in] lsf_new New LSFs in [0,1] for subframe 4
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
216 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
217 static void interpolate_lsf(float lsf_q[4][LP_FILTER_ORDER], float *lsf_new)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
218 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
219 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
220
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
221 for (i = 0; i < 4; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
222 ff_weighted_vector_sumf(lsf_q[i], lsf_q[3], lsf_new,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
223 0.25 * (3 - i), 0.25 * (i + 1),
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
224 LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
225 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
226
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
227 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
228 * Decode a set of 5 split-matrix quantized lsf indexes into an lsp vector.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
229 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
230 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
231 * @param lsp output LSP vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
232 * @param lsf_no_r LSF vector without the residual vector added
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
233 * @param lsf_quantizer pointers to LSF dictionary tables
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
234 * @param quantizer_offset offset in tables
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
235 * @param sign for the 3 dictionary table
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
236 * @param update store data for computing the next frame's LSFs
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
237 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
238 static void lsf2lsp_for_mode12k2(AMRContext *p, double lsp[LP_FILTER_ORDER],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
239 const float lsf_no_r[LP_FILTER_ORDER],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
240 const int16_t *lsf_quantizer[5],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
241 const int quantizer_offset,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
242 const int sign, const int update)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
243 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
244 int16_t lsf_r[LP_FILTER_ORDER]; // residual LSF vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
245 float lsf_q[LP_FILTER_ORDER]; // quantified LSF vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
246 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
247
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
248 for (i = 0; i < LP_FILTER_ORDER >> 1; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
249 memcpy(&lsf_r[i << 1], &lsf_quantizer[i][quantizer_offset],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
250 2 * sizeof(*lsf_r));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
251
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
252 if (sign) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
253 lsf_r[4] *= -1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
254 lsf_r[5] *= -1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
255 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
256
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
257 if (update)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
258 memcpy(p->prev_lsf_r, lsf_r, LP_FILTER_ORDER * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
259
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
260 for (i = 0; i < LP_FILTER_ORDER; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
261 lsf_q[i] = lsf_r[i] * (LSF_R_FAC / 8000.0) + lsf_no_r[i] * (1.0 / 8000.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
262
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
263 ff_set_min_dist_lsf(lsf_q, MIN_LSF_SPACING, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
264
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
265 if (update)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
266 interpolate_lsf(p->lsf_q, lsf_q);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
267
12464
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 11676
diff changeset
268 ff_acelp_lsf2lspd(lsp, lsf_q, LP_FILTER_ORDER);
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
269 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
270
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
271 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
272 * Decode a set of 5 split-matrix quantized lsf indexes into 2 lsp vectors.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
273 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
274 * @param p pointer to the AMRContext
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
275 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
276 static void lsf2lsp_5(AMRContext *p)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
277 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
278 const uint16_t *lsf_param = p->frame.lsf;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
279 float lsf_no_r[LP_FILTER_ORDER]; // LSFs without the residual vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
280 const int16_t *lsf_quantizer[5];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
281 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
282
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
283 lsf_quantizer[0] = lsf_5_1[lsf_param[0]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
284 lsf_quantizer[1] = lsf_5_2[lsf_param[1]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
285 lsf_quantizer[2] = lsf_5_3[lsf_param[2] >> 1];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
286 lsf_quantizer[3] = lsf_5_4[lsf_param[3]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
287 lsf_quantizer[4] = lsf_5_5[lsf_param[4]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
288
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
289 for (i = 0; i < LP_FILTER_ORDER; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
290 lsf_no_r[i] = p->prev_lsf_r[i] * LSF_R_FAC * PRED_FAC_MODE_12k2 + lsf_5_mean[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
291
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
292 lsf2lsp_for_mode12k2(p, p->lsp[1], lsf_no_r, lsf_quantizer, 0, lsf_param[2] & 1, 0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
293 lsf2lsp_for_mode12k2(p, p->lsp[3], lsf_no_r, lsf_quantizer, 2, lsf_param[2] & 1, 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
294
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
295 // interpolate LSP vectors at subframes 1 and 3
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
296 weighted_vector_sumd(p->lsp[0], p->prev_lsp_sub4, p->lsp[1], 0.5, 0.5, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
297 weighted_vector_sumd(p->lsp[2], p->lsp[1] , p->lsp[3], 0.5, 0.5, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
298 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
299
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
300 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
301 * Decode a set of 3 split-matrix quantized lsf indexes into an lsp vector.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
302 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
303 * @param p pointer to the AMRContext
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
304 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
305 static void lsf2lsp_3(AMRContext *p)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
306 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
307 const uint16_t *lsf_param = p->frame.lsf;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
308 int16_t lsf_r[LP_FILTER_ORDER]; // residual LSF vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
309 float lsf_q[LP_FILTER_ORDER]; // quantified LSF vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
310 const int16_t *lsf_quantizer;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
311 int i, j;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
312
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
313 lsf_quantizer = (p->cur_frame_mode == MODE_7k95 ? lsf_3_1_MODE_7k95 : lsf_3_1)[lsf_param[0]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
314 memcpy(lsf_r, lsf_quantizer, 3 * sizeof(*lsf_r));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
315
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
316 lsf_quantizer = lsf_3_2[lsf_param[1] << (p->cur_frame_mode <= MODE_5k15)];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
317 memcpy(lsf_r + 3, lsf_quantizer, 3 * sizeof(*lsf_r));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
318
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
319 lsf_quantizer = (p->cur_frame_mode <= MODE_5k15 ? lsf_3_3_MODE_5k15 : lsf_3_3)[lsf_param[2]];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
320 memcpy(lsf_r + 6, lsf_quantizer, 4 * sizeof(*lsf_r));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
321
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
322 // calculate mean-removed LSF vector and add mean
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
323 for (i = 0; i < LP_FILTER_ORDER; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
324 lsf_q[i] = (lsf_r[i] + p->prev_lsf_r[i] * pred_fac[i]) * (LSF_R_FAC / 8000.0) + lsf_3_mean[i] * (1.0 / 8000.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
325
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
326 ff_set_min_dist_lsf(lsf_q, MIN_LSF_SPACING, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
327
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
328 // store data for computing the next frame's LSFs
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
329 interpolate_lsf(p->lsf_q, lsf_q);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
330 memcpy(p->prev_lsf_r, lsf_r, LP_FILTER_ORDER * sizeof(*lsf_r));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
331
12464
2dd67ed2f947 Move AMRNB lsf2lsp() function to common code for using in future AMRWB decoder.
vitor
parents: 11676
diff changeset
332 ff_acelp_lsf2lspd(p->lsp[3], lsf_q, LP_FILTER_ORDER);
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
333
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
334 // interpolate LSP vectors at subframes 1, 2 and 3
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
335 for (i = 1; i <= 3; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
336 for(j = 0; j < LP_FILTER_ORDER; j++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
337 p->lsp[i-1][j] = p->prev_lsp_sub4[j] +
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
338 (p->lsp[3][j] - p->prev_lsp_sub4[j]) * 0.25 * i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
339 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
340
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
341 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
342
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
343
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
344 /// @defgroup amr_pitch_vector_decoding AMR pitch vector decoding functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
345 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
346
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
347 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
348 * Like ff_decode_pitch_lag(), but with 1/6 resolution
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
349 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
350 static void decode_pitch_lag_1_6(int *lag_int, int *lag_frac, int pitch_index,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
351 const int prev_lag_int, const int subframe)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
352 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
353 if (subframe == 0 || subframe == 2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
354 if (pitch_index < 463) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
355 *lag_int = (pitch_index + 107) * 10923 >> 16;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
356 *lag_frac = pitch_index - *lag_int * 6 + 105;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
357 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
358 *lag_int = pitch_index - 368;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
359 *lag_frac = 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
360 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
361 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
362 *lag_int = ((pitch_index + 5) * 10923 >> 16) - 1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
363 *lag_frac = pitch_index - *lag_int * 6 - 3;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
364 *lag_int += av_clip(prev_lag_int - 5, PITCH_LAG_MIN_MODE_12k2,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
365 PITCH_DELAY_MAX - 9);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
366 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
367 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
368
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
369 static void decode_pitch_vector(AMRContext *p,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
370 const AMRNBSubframe *amr_subframe,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
371 const int subframe)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
372 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
373 int pitch_lag_int, pitch_lag_frac;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
374 enum Mode mode = p->cur_frame_mode;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
375
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
376 if (p->cur_frame_mode == MODE_12k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
377 decode_pitch_lag_1_6(&pitch_lag_int, &pitch_lag_frac,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
378 amr_subframe->p_lag, p->pitch_lag_int,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
379 subframe);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
380 } else
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
381 ff_decode_pitch_lag(&pitch_lag_int, &pitch_lag_frac,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
382 amr_subframe->p_lag,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
383 p->pitch_lag_int, subframe,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
384 mode != MODE_4k75 && mode != MODE_5k15,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
385 mode <= MODE_6k7 ? 4 : (mode == MODE_7k95 ? 5 : 6));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
386
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
387 p->pitch_lag_int = pitch_lag_int; // store previous lag in a uint8_t
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
388
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
389 pitch_lag_frac <<= (p->cur_frame_mode != MODE_12k2);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
390
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
391 pitch_lag_int += pitch_lag_frac > 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
392
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
393 /* Calculate the pitch vector by interpolating the past excitation at the
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
394 pitch lag using a b60 hamming windowed sinc function. */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
395 ff_acelp_interpolatef(p->excitation, p->excitation + 1 - pitch_lag_int,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
396 ff_b60_sinc, 6,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
397 pitch_lag_frac + 6 - 6*(pitch_lag_frac > 0),
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
398 10, AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
399
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
400 memcpy(p->pitch_vector, p->excitation, AMR_SUBFRAME_SIZE * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
401 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
402
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
403 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
404
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
405
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
406 /// @defgroup amr_algebraic_code_book AMR algebraic code book (fixed) vector decoding functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
407 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
408
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
409 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
410 * Decode a 10-bit algebraic codebook index from a 10.2 kbit/s frame.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
411 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
412 static void decode_10bit_pulse(int code, int pulse_position[8],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
413 int i1, int i2, int i3)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
414 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
415 // coded using 7+3 bits with the 3 LSBs being, individually, the LSB of 1 of
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
416 // the 3 pulses and the upper 7 bits being coded in base 5
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
417 const uint8_t *positions = base_five_table[code >> 3];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
418 pulse_position[i1] = (positions[2] << 1) + ( code & 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
419 pulse_position[i2] = (positions[1] << 1) + ((code >> 1) & 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
420 pulse_position[i3] = (positions[0] << 1) + ((code >> 2) & 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
421 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
422
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
423 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
424 * Decode the algebraic codebook index to pulse positions and signs and
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
425 * construct the algebraic codebook vector for MODE_10k2.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
426 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
427 * @param fixed_index positions of the eight pulses
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
428 * @param fixed_sparse pointer to the algebraic codebook vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
429 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
430 static void decode_8_pulses_31bits(const int16_t *fixed_index,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
431 AMRFixed *fixed_sparse)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
432 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
433 int pulse_position[8];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
434 int i, temp;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
435
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
436 decode_10bit_pulse(fixed_index[4], pulse_position, 0, 4, 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
437 decode_10bit_pulse(fixed_index[5], pulse_position, 2, 6, 5);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
438
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
439 // coded using 5+2 bits with the 2 LSBs being, individually, the LSB of 1 of
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
440 // the 2 pulses and the upper 5 bits being coded in base 5
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
441 temp = ((fixed_index[6] >> 2) * 25 + 12) >> 5;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
442 pulse_position[3] = temp % 5;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
443 pulse_position[7] = temp / 5;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
444 if (pulse_position[7] & 1)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
445 pulse_position[3] = 4 - pulse_position[3];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
446 pulse_position[3] = (pulse_position[3] << 1) + ( fixed_index[6] & 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
447 pulse_position[7] = (pulse_position[7] << 1) + ((fixed_index[6] >> 1) & 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
448
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
449 fixed_sparse->n = 8;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
450 for (i = 0; i < 4; i++) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
451 const int pos1 = (pulse_position[i] << 2) + i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
452 const int pos2 = (pulse_position[i + 4] << 2) + i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
453 const float sign = fixed_index[i] ? -1.0 : 1.0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
454 fixed_sparse->x[i ] = pos1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
455 fixed_sparse->x[i + 4] = pos2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
456 fixed_sparse->y[i ] = sign;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
457 fixed_sparse->y[i + 4] = pos2 < pos1 ? -sign : sign;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
458 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
459 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
460
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
461 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
462 * Decode the algebraic codebook index to pulse positions and signs,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
463 * then construct the algebraic codebook vector.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
464 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
465 * nb of pulses | bits encoding pulses
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
466 * For MODE_4k75 or MODE_5k15, 2 | 1-3, 4-6, 7
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
467 * MODE_5k9, 2 | 1, 2-4, 5-6, 7-9
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
468 * MODE_6k7, 3 | 1-3, 4, 5-7, 8, 9-11
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
469 * MODE_7k4 or MODE_7k95, 4 | 1-3, 4-6, 7-9, 10, 11-13
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
470 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
471 * @param fixed_sparse pointer to the algebraic codebook vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
472 * @param pulses algebraic codebook indexes
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
473 * @param mode mode of the current frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
474 * @param subframe current subframe number
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
475 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
476 static void decode_fixed_sparse(AMRFixed *fixed_sparse, const uint16_t *pulses,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
477 const enum Mode mode, const int subframe)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
478 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
479 assert(MODE_4k75 <= mode && mode <= MODE_12k2);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
480
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
481 if (mode == MODE_12k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
482 ff_decode_10_pulses_35bits(pulses, fixed_sparse, gray_decode, 5, 3);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
483 } else if (mode == MODE_10k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
484 decode_8_pulses_31bits(pulses, fixed_sparse);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
485 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
486 int *pulse_position = fixed_sparse->x;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
487 int i, pulse_subset;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
488 const int fixed_index = pulses[0];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
489
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
490 if (mode <= MODE_5k15) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
491 pulse_subset = ((fixed_index >> 3) & 8) + (subframe << 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
492 pulse_position[0] = ( fixed_index & 7) * 5 + track_position[pulse_subset];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
493 pulse_position[1] = ((fixed_index >> 3) & 7) * 5 + track_position[pulse_subset + 1];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
494 fixed_sparse->n = 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
495 } else if (mode == MODE_5k9) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
496 pulse_subset = ((fixed_index & 1) << 1) + 1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
497 pulse_position[0] = ((fixed_index >> 1) & 7) * 5 + pulse_subset;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
498 pulse_subset = (fixed_index >> 4) & 3;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
499 pulse_position[1] = ((fixed_index >> 6) & 7) * 5 + pulse_subset + (pulse_subset == 3 ? 1 : 0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
500 fixed_sparse->n = pulse_position[0] == pulse_position[1] ? 1 : 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
501 } else if (mode == MODE_6k7) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
502 pulse_position[0] = (fixed_index & 7) * 5;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
503 pulse_subset = (fixed_index >> 2) & 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
504 pulse_position[1] = ((fixed_index >> 4) & 7) * 5 + pulse_subset + 1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
505 pulse_subset = (fixed_index >> 6) & 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
506 pulse_position[2] = ((fixed_index >> 8) & 7) * 5 + pulse_subset + 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
507 fixed_sparse->n = 3;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
508 } else { // mode <= MODE_7k95
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
509 pulse_position[0] = gray_decode[ fixed_index & 7];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
510 pulse_position[1] = gray_decode[(fixed_index >> 3) & 7] + 1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
511 pulse_position[2] = gray_decode[(fixed_index >> 6) & 7] + 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
512 pulse_subset = (fixed_index >> 9) & 1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
513 pulse_position[3] = gray_decode[(fixed_index >> 10) & 7] + pulse_subset + 3;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
514 fixed_sparse->n = 4;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
515 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
516 for (i = 0; i < fixed_sparse->n; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
517 fixed_sparse->y[i] = (pulses[1] >> i) & 1 ? 1.0 : -1.0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
518 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
519 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
520
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
521 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
522 * Apply pitch lag to obtain the sharpened fixed vector (section 6.1.2)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
523 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
524 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
525 * @param subframe unpacked amr subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
526 * @param mode mode of the current frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
527 * @param fixed_sparse sparse respresentation of the fixed vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
528 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
529 static void pitch_sharpening(AMRContext *p, int subframe, enum Mode mode,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
530 AMRFixed *fixed_sparse)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
531 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
532 // The spec suggests the current pitch gain is always used, but in other
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
533 // modes the pitch and codebook gains are joinly quantized (sec 5.8.2)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
534 // so the codebook gain cannot depend on the quantized pitch gain.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
535 if (mode == MODE_12k2)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
536 p->beta = FFMIN(p->pitch_gain[4], 1.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
537
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
538 fixed_sparse->pitch_lag = p->pitch_lag_int;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
539 fixed_sparse->pitch_fac = p->beta;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
540
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
541 // Save pitch sharpening factor for the next subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
542 // MODE_4k75 only updates on the 2nd and 4th subframes - this follows from
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
543 // the fact that the gains for two subframes are jointly quantized.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
544 if (mode != MODE_4k75 || subframe & 1)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
545 p->beta = av_clipf(p->pitch_gain[4], 0.0, SHARP_MAX);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
546 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
547 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
548
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
549
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
550 /// @defgroup amr_gain_decoding AMR gain decoding functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
551 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
552
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
553 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
554 * fixed gain smoothing
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
555 * Note that where the spec specifies the "spectrum in the q domain"
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
556 * in section 6.1.4, in fact frequencies should be used.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
557 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
558 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
559 * @param lsf LSFs for the current subframe, in the range [0,1]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
560 * @param lsf_avg averaged LSFs
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
561 * @param mode mode of the current frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
562 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
563 * @return fixed gain smoothed
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
564 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
565 static float fixed_gain_smooth(AMRContext *p , const float *lsf,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
566 const float *lsf_avg, const enum Mode mode)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
567 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
568 float diff = 0.0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
569 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
570
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
571 for (i = 0; i < LP_FILTER_ORDER; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
572 diff += fabs(lsf_avg[i] - lsf[i]) / lsf_avg[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
573
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
574 // If diff is large for ten subframes, disable smoothing for a 40-subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
575 // hangover period.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
576 p->diff_count++;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
577 if (diff <= 0.65)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
578 p->diff_count = 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
579
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
580 if (p->diff_count > 10) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
581 p->hang_count = 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
582 p->diff_count--; // don't let diff_count overflow
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
583 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
584
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
585 if (p->hang_count < 40) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
586 p->hang_count++;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
587 } else if (mode < MODE_7k4 || mode == MODE_10k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
588 const float smoothing_factor = av_clipf(4.0 * diff - 1.6, 0.0, 1.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
589 const float fixed_gain_mean = (p->fixed_gain[0] + p->fixed_gain[1] +
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
590 p->fixed_gain[2] + p->fixed_gain[3] +
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
591 p->fixed_gain[4]) * 0.2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
592 return smoothing_factor * p->fixed_gain[4] +
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
593 (1.0 - smoothing_factor) * fixed_gain_mean;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
594 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
595 return p->fixed_gain[4];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
596 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
597
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
598 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
599 * Decode pitch gain and fixed gain factor (part of section 6.1.3).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
600 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
601 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
602 * @param amr_subframe unpacked amr subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
603 * @param mode mode of the current frame
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
604 * @param subframe current subframe number
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
605 * @param fixed_gain_factor decoded gain correction factor
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
606 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
607 static void decode_gains(AMRContext *p, const AMRNBSubframe *amr_subframe,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
608 const enum Mode mode, const int subframe,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
609 float *fixed_gain_factor)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
610 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
611 if (mode == MODE_12k2 || mode == MODE_7k95) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
612 p->pitch_gain[4] = qua_gain_pit [amr_subframe->p_gain ]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
613 * (1.0 / 16384.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
614 *fixed_gain_factor = qua_gain_code[amr_subframe->fixed_gain]
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
615 * (1.0 / 2048.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
616 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
617 const uint16_t *gains;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
618
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
619 if (mode >= MODE_6k7) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
620 gains = gains_high[amr_subframe->p_gain];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
621 } else if (mode >= MODE_5k15) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
622 gains = gains_low [amr_subframe->p_gain];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
623 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
624 // gain index is only coded in subframes 0,2 for MODE_4k75
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
625 gains = gains_MODE_4k75[(p->frame.subframe[subframe & 2].p_gain << 1) + (subframe & 1)];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
626 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
627
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
628 p->pitch_gain[4] = gains[0] * (1.0 / 16384.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
629 *fixed_gain_factor = gains[1] * (1.0 / 4096.0);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
630 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
631 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
632
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
633 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
634
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
635
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
636 /// @defgroup amr_pre_processing AMR pre-processing functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
637 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
638
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
639 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
640 * Circularly convolve a sparse fixed vector with a phase dispersion impulse
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
641 * response filter (D.6.2 of G.729 and 6.1.5 of AMR).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
642 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
643 * @param out vector with filter applied
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
644 * @param in source vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
645 * @param filter phase filter coefficients
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
646 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
647 * out[n] = sum(i,0,len-1){ in[i] * filter[(len + n - i)%len] }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
648 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
649 static void apply_ir_filter(float *out, const AMRFixed *in,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
650 const float *filter)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
651 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
652 float filter1[AMR_SUBFRAME_SIZE], //!< filters at pitch lag*1 and *2
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
653 filter2[AMR_SUBFRAME_SIZE];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
654 int lag = in->pitch_lag;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
655 float fac = in->pitch_fac;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
656 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
657
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
658 if (lag < AMR_SUBFRAME_SIZE) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
659 ff_celp_circ_addf(filter1, filter, filter, lag, fac,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
660 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
661
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
662 if (lag < AMR_SUBFRAME_SIZE >> 1)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
663 ff_celp_circ_addf(filter2, filter, filter1, lag, fac,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
664 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
665 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
666
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
667 memset(out, 0, sizeof(float) * AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
668 for (i = 0; i < in->n; i++) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
669 int x = in->x[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
670 float y = in->y[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
671 const float *filterp;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
672
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
673 if (x >= AMR_SUBFRAME_SIZE - lag) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
674 filterp = filter;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
675 } else if (x >= AMR_SUBFRAME_SIZE - (lag << 1)) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
676 filterp = filter1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
677 } else
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
678 filterp = filter2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
679
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
680 ff_celp_circ_addf(out, out, filterp, x, y, AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
681 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
682 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
683
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
684 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
685 * Reduce fixed vector sparseness by smoothing with one of three IR filters.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
686 * Also know as "adaptive phase dispersion".
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
687 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
688 * This implements 3GPP TS 26.090 section 6.1(5).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
689 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
690 * @param p the context
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
691 * @param fixed_sparse algebraic codebook vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
692 * @param fixed_vector unfiltered fixed vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
693 * @param fixed_gain smoothed gain
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
694 * @param out space for modified vector if necessary
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
695 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
696 static const float *anti_sparseness(AMRContext *p, AMRFixed *fixed_sparse,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
697 const float *fixed_vector,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
698 float fixed_gain, float *out)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
699 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
700 int ir_filter_nr;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
701
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
702 if (p->pitch_gain[4] < 0.6) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
703 ir_filter_nr = 0; // strong filtering
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
704 } else if (p->pitch_gain[4] < 0.9) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
705 ir_filter_nr = 1; // medium filtering
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
706 } else
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
707 ir_filter_nr = 2; // no filtering
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
708
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
709 // detect 'onset'
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
710 if (fixed_gain > 2.0 * p->prev_sparse_fixed_gain) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
711 p->ir_filter_onset = 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
712 } else if (p->ir_filter_onset)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
713 p->ir_filter_onset--;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
714
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
715 if (!p->ir_filter_onset) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
716 int i, count = 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
717
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
718 for (i = 0; i < 5; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
719 if (p->pitch_gain[i] < 0.6)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
720 count++;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
721 if (count > 2)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
722 ir_filter_nr = 0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
723
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
724 if (ir_filter_nr > p->prev_ir_filter_nr + 1)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
725 ir_filter_nr--;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
726 } else if (ir_filter_nr < 2)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
727 ir_filter_nr++;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
728
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
729 // Disable filtering for very low level of fixed_gain.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
730 // Note this step is not specified in the technical description but is in
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
731 // the reference source in the function Ph_disp.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
732 if (fixed_gain < 5.0)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
733 ir_filter_nr = 2;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
734
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
735 if (p->cur_frame_mode != MODE_7k4 && p->cur_frame_mode < MODE_10k2
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
736 && ir_filter_nr < 2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
737 apply_ir_filter(out, fixed_sparse,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
738 (p->cur_frame_mode == MODE_7k95 ?
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
739 ir_filters_lookup_MODE_7k95 :
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
740 ir_filters_lookup)[ir_filter_nr]);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
741 fixed_vector = out;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
742 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
743
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
744 // update ir filter strength history
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
745 p->prev_ir_filter_nr = ir_filter_nr;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
746 p->prev_sparse_fixed_gain = fixed_gain;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
747
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
748 return fixed_vector;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
749 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
750
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
751 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
752
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
753
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
754 /// @defgroup amr_synthesis AMR synthesis functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
755 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
756
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
757 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
758 * Conduct 10th order linear predictive coding synthesis.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
759 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
760 * @param p pointer to the AMRContext
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
761 * @param lpc pointer to the LPC coefficients
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
762 * @param fixed_gain fixed codebook gain for synthesis
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
763 * @param fixed_vector algebraic codebook vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
764 * @param samples pointer to the output speech samples
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
765 * @param overflow 16-bit overflow flag
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
766 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
767 static int synthesis(AMRContext *p, float *lpc,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
768 float fixed_gain, const float *fixed_vector,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
769 float *samples, uint8_t overflow)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
770 {
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11648
diff changeset
771 int i;
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
772 float excitation[AMR_SUBFRAME_SIZE];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
773
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
774 // if an overflow has been detected, the pitch vector is scaled down by a
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
775 // factor of 4
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
776 if (overflow)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
777 for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
778 p->pitch_vector[i] *= 0.25;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
779
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
780 ff_weighted_vector_sumf(excitation, p->pitch_vector, fixed_vector,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
781 p->pitch_gain[4], fixed_gain, AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
782
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
783 // emphasize pitch vector contribution
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
784 if (p->pitch_gain[4] > 0.5 && !overflow) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
785 float energy = ff_dot_productf(excitation, excitation,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
786 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
787 float pitch_factor =
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
788 p->pitch_gain[4] *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
789 (p->cur_frame_mode == MODE_12k2 ?
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
790 0.25 * FFMIN(p->pitch_gain[4], 1.0) :
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
791 0.5 * FFMIN(p->pitch_gain[4], SHARP_MAX));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
792
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
793 for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
794 excitation[i] += pitch_factor * p->pitch_vector[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
795
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
796 ff_scale_vector_to_given_sum_of_squares(excitation, excitation, energy,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
797 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
798 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
799
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
800 ff_celp_lp_synthesis_filterf(samples, lpc, excitation, AMR_SUBFRAME_SIZE,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
801 LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
802
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
803 // detect overflow
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
804 for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
805 if (fabsf(samples[i]) > AMR_SAMPLE_BOUND) {
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11648
diff changeset
806 return 1;
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
807 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
808
11652
8b6f3d3b55cb Move clipping of audio samples (for those codecs outputting float) from decoder
rbultje
parents: 11648
diff changeset
809 return 0;
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
810 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
811
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
812 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
813
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
814
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
815 /// @defgroup amr_update AMR update functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
816 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
817
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
818 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
819 * Update buffers and history at the end of decoding a subframe.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
820 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
821 * @param p pointer to the AMRContext
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
822 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
823 static void update_state(AMRContext *p)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
824 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
825 memcpy(p->prev_lsp_sub4, p->lsp[3], LP_FILTER_ORDER * sizeof(p->lsp[3][0]));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
826
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
827 memmove(&p->excitation_buf[0], &p->excitation_buf[AMR_SUBFRAME_SIZE],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
828 (PITCH_DELAY_MAX + LP_FILTER_ORDER + 1) * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
829
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
830 memmove(&p->pitch_gain[0], &p->pitch_gain[1], 4 * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
831 memmove(&p->fixed_gain[0], &p->fixed_gain[1], 4 * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
832
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
833 memmove(&p->samples_in[0], &p->samples_in[AMR_SUBFRAME_SIZE],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
834 LP_FILTER_ORDER * sizeof(float));
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
835 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
836
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
837 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
838
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
839
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
840 /// @defgroup amr_postproc AMR Post processing functions
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
841 /// @{
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
842
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
843 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
844 * Get the tilt factor of a formant filter from its transfer function
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
845 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
846 * @param lpc_n LP_FILTER_ORDER coefficients of the numerator
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
847 * @param lpc_d LP_FILTER_ORDER coefficients of the denominator
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
848 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
849 static float tilt_factor(float *lpc_n, float *lpc_d)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
850 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
851 float rh0, rh1; // autocorrelation at lag 0 and 1
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
852
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
853 // LP_FILTER_ORDER prior zeros are needed for ff_celp_lp_synthesis_filterf
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
854 float impulse_buffer[LP_FILTER_ORDER + AMR_TILT_RESPONSE] = { 0 };
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
855 float *hf = impulse_buffer + LP_FILTER_ORDER; // start of impulse response
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
856
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
857 hf[0] = 1.0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
858 memcpy(hf + 1, lpc_n, sizeof(float) * LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
859 ff_celp_lp_synthesis_filterf(hf, lpc_d, hf, AMR_TILT_RESPONSE,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
860 LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
861
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
862 rh0 = ff_dot_productf(hf, hf, AMR_TILT_RESPONSE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
863 rh1 = ff_dot_productf(hf, hf + 1, AMR_TILT_RESPONSE - 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
864
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
865 // The spec only specifies this check for 12.2 and 10.2 kbit/s
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
866 // modes. But in the ref source the tilt is always non-negative.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
867 return rh1 >= 0.0 ? rh1 / rh0 * AMR_TILT_GAMMA_T : 0.0;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
868 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
869
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
870 /**
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
871 * Perform adaptive post-filtering to enhance the quality of the speech.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
872 * See section 6.2.1.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
873 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
874 * @param p pointer to the AMRContext
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
875 * @param lpc interpolated LP coefficients for this subframe
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
876 * @param buf_out output of the filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
877 */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
878 static void postfilter(AMRContext *p, float *lpc, float *buf_out)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
879 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
880 int i;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
881 float *samples = p->samples_in + LP_FILTER_ORDER; // Start of input
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
882
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
883 float speech_gain = ff_dot_productf(samples, samples,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
884 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
885
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
886 float pole_out[AMR_SUBFRAME_SIZE + LP_FILTER_ORDER]; // Output of pole filter
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
887 const float *gamma_n, *gamma_d; // Formant filter factor table
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
888 float lpc_n[LP_FILTER_ORDER], lpc_d[LP_FILTER_ORDER]; // Transfer function coefficients
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
889
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
890 if (p->cur_frame_mode == MODE_12k2 || p->cur_frame_mode == MODE_10k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
891 gamma_n = ff_pow_0_7;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
892 gamma_d = ff_pow_0_75;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
893 } else {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
894 gamma_n = ff_pow_0_55;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
895 gamma_d = ff_pow_0_7;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
896 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
897
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
898 for (i = 0; i < LP_FILTER_ORDER; i++) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
899 lpc_n[i] = lpc[i] * gamma_n[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
900 lpc_d[i] = lpc[i] * gamma_d[i];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
901 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
902
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
903 memcpy(pole_out, p->postfilter_mem, sizeof(float) * LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
904 ff_celp_lp_synthesis_filterf(pole_out + LP_FILTER_ORDER, lpc_d, samples,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
905 AMR_SUBFRAME_SIZE, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
906 memcpy(p->postfilter_mem, pole_out + AMR_SUBFRAME_SIZE,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
907 sizeof(float) * LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
908
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
909 ff_celp_lp_zero_synthesis_filterf(buf_out, lpc_n,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
910 pole_out + LP_FILTER_ORDER,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
911 AMR_SUBFRAME_SIZE, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
912
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
913 ff_tilt_compensation(&p->tilt_mem, tilt_factor(lpc_n, lpc_d), buf_out,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
914 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
915
11647
26aabf52f578 Split the input/output data arguments to ff_adaptive_gain_control().
rbultje
parents: 11645
diff changeset
916 ff_adaptive_gain_control(buf_out, buf_out, speech_gain, AMR_SUBFRAME_SIZE,
11462
c2e19a511e26 Fix spelling.
rbultje
parents: 11235
diff changeset
917 AMR_AGC_ALPHA, &p->postfilter_agc);
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
918 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
919
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
920 /// @}
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
921
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
922 static int amrnb_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
923 AVPacket *avpkt)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
924 {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
925
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
926 AMRContext *p = avctx->priv_data; // pointer to private data
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
927 const uint8_t *buf = avpkt->data;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
928 int buf_size = avpkt->size;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
929 float *buf_out = data; // pointer to the output data buffer
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
930 int i, subframe;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
931 float fixed_gain_factor;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
932 AMRFixed fixed_sparse = {0}; // fixed vector up to anti-sparseness processing
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
933 float spare_vector[AMR_SUBFRAME_SIZE]; // extra stack space to hold result from anti-sparseness processing
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
934 float synth_fixed_gain; // the fixed gain that synthesis should use
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
935 const float *synth_fixed_vector; // pointer to the fixed vector that synthesis should use
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
936
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
937 p->cur_frame_mode = unpack_bitstream(p, buf, buf_size);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
938 if (p->cur_frame_mode == MODE_DTX) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
939 av_log_missing_feature(avctx, "dtx mode", 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
940 return -1;
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
941 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
942
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
943 if (p->cur_frame_mode == MODE_12k2) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
944 lsf2lsp_5(p);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
945 } else
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
946 lsf2lsp_3(p);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
947
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
948 for (i = 0; i < 4; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
949 ff_acelp_lspd2lpc(p->lsp[i], p->lpc[i], 5);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
950
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
951 for (subframe = 0; subframe < 4; subframe++) {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
952 const AMRNBSubframe *amr_subframe = &p->frame.subframe[subframe];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
953
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
954 decode_pitch_vector(p, amr_subframe, subframe);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
955
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
956 decode_fixed_sparse(&fixed_sparse, amr_subframe->pulses,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
957 p->cur_frame_mode, subframe);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
958
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
959 // The fixed gain (section 6.1.3) depends on the fixed vector
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
960 // (section 6.1.2), but the fixed vector calculation uses
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
961 // pitch sharpening based on the on the pitch gain (section 6.1.3).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
962 // So the correct order is: pitch gain, pitch sharpening, fixed gain.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
963 decode_gains(p, amr_subframe, p->cur_frame_mode, subframe,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
964 &fixed_gain_factor);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
965
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
966 pitch_sharpening(p, subframe, p->cur_frame_mode, &fixed_sparse);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
967
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
968 ff_set_fixed_vector(p->fixed_vector, &fixed_sparse, 1.0,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
969 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
970
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
971 p->fixed_gain[4] =
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
972 ff_amr_set_fixed_gain(fixed_gain_factor,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
973 ff_dot_productf(p->fixed_vector, p->fixed_vector,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
974 AMR_SUBFRAME_SIZE)/AMR_SUBFRAME_SIZE,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
975 p->prediction_error,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
976 energy_mean[p->cur_frame_mode], energy_pred_fac);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
977
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
978 // The excitation feedback is calculated without any processing such
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
979 // as fixed gain smoothing. This isn't mentioned in the specification.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
980 for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
981 p->excitation[i] *= p->pitch_gain[4];
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
982 ff_set_fixed_vector(p->excitation, &fixed_sparse, p->fixed_gain[4],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
983 AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
984
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
985 // In the ref decoder, excitation is stored with no fractional bits.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
986 // This step prevents buzz in silent periods. The ref encoder can
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
987 // emit long sequences with pitch factor greater than one. This
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
988 // creates unwanted feedback if the excitation vector is nonzero.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
989 // (e.g. test sequence T19_795.COD in 3GPP TS 26.074)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
990 for (i = 0; i < AMR_SUBFRAME_SIZE; i++)
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
991 p->excitation[i] = truncf(p->excitation[i]);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
992
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
993 // Smooth fixed gain.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
994 // The specification is ambiguous, but in the reference source, the
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
995 // smoothed value is NOT fed back into later fixed gain smoothing.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
996 synth_fixed_gain = fixed_gain_smooth(p, p->lsf_q[subframe],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
997 p->lsf_avg, p->cur_frame_mode);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
998
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
999 synth_fixed_vector = anti_sparseness(p, &fixed_sparse, p->fixed_vector,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1000 synth_fixed_gain, spare_vector);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1001
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1002 if (synthesis(p, p->lpc[subframe], synth_fixed_gain,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1003 synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 0))
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1004 // overflow detected -> rerun synthesis scaling pitch vector down
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1005 // by a factor of 4, skipping pitch vector contribution emphasis
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1006 // and adaptive gain control
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1007 synthesis(p, p->lpc[subframe], synth_fixed_gain,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1008 synth_fixed_vector, &p->samples_in[LP_FILTER_ORDER], 1);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1009
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1010 postfilter(p, p->lpc[subframe], buf_out + subframe * AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1011
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1012 // update buffers and history
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1013 ff_clear_fixed_vector(p->fixed_vector, &fixed_sparse, AMR_SUBFRAME_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1014 update_state(p);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1015 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1016
11648
0516f4062307 Split input/output data arguments to ff_acelp_apply_order_2_transfer_function().
rbultje
parents: 11647
diff changeset
1017 ff_acelp_apply_order_2_transfer_function(buf_out, buf_out, highpass_zeros,
11676
ceec2fb08b8e amrnbdec: Apply AMR_SAMPLE_SCALE when finishing the decoder output
mstorsjo
parents: 11652
diff changeset
1018 highpass_poles,
ceec2fb08b8e amrnbdec: Apply AMR_SAMPLE_SCALE when finishing the decoder output
mstorsjo
parents: 11652
diff changeset
1019 highpass_gain * AMR_SAMPLE_SCALE,
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1020 p->high_pass_mem, AMR_BLOCK_SIZE);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1021
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1022 /* Update averaged lsf vector (used for fixed gain smoothing).
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1023 *
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1024 * Note that lsf_avg should not incorporate the current frame's LSFs
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1025 * for fixed_gain_smooth.
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1026 * The specification has an incorrect formula: the reference decoder uses
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1027 * qbar(n-1) rather than qbar(n) in section 6.1(4) equation 71. */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1028 ff_weighted_vector_sumf(p->lsf_avg, p->lsf_avg, p->lsf_q[3],
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1029 0.84, 0.16, LP_FILTER_ORDER);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1030
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1031 /* report how many samples we got */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1032 *data_size = AMR_BLOCK_SIZE * sizeof(float);
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1033
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1034 /* return the amount of bytes consumed if everything was OK */
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1035 return frame_sizes_nb[p->cur_frame_mode] + 1; // +7 for rounding and +8 for TOC
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1036 }
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1037
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1038
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1039 AVCodec amrnb_decoder = {
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1040 .name = "amrnb",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11462
diff changeset
1041 .type = AVMEDIA_TYPE_AUDIO,
11235
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1042 .id = CODEC_ID_AMR_NB,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1043 .priv_data_size = sizeof(AMRContext),
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1044 .init = amrnb_decode_init,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1045 .decode = amrnb_decode_frame,
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1046 .long_name = NULL_IF_CONFIG_SMALL("Adaptive Multi-Rate NarrowBand"),
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1047 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_FLT,SAMPLE_FMT_NONE},
5c339e441ace AMR-NB floating-point based decoder.
vitor
parents:
diff changeset
1048 };