annotate amrnbdec.c @ 12483:0159a19bfff7 libavcodec

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