annotate twinvq.c @ 10483:afad312b9989 libavcodec

Implement AMR gain function that is used by both AMR and SIPR. Based on AMR SoC code by Robert Swain and Colin McQuillan.
author vitor
date Sat, 31 Oct 2009 02:02:30 +0000
parents 38ab367d4231
children 6d653bb57c58
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1 /*
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
2 * TwinVQ decoder
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
3 * Copyright (c) 2009 Vitor Sessak
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
4 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
5 * This file is part of FFmpeg.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
6 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
11 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
15 * Lesser General Public License for more details.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
16 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
20 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
21
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
22 #include "avcodec.h"
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
23 #include "get_bits.h"
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
24 #include "dsputil.h"
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
25
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
26 #include <math.h>
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
27 #include <stdint.h>
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
28
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
29 #include "twinvq_data.h"
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
30
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
31 enum FrameType {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
32 FT_SHORT = 0, ///< Short frame (divided in n sub-blocks)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
33 FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
34 FT_LONG, ///< Long frame (single sub-block + PPC)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
35 FT_PPC, ///< Periodic Peak Component (part of the long frame)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
36 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
37
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
38 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
39 * Parameters and tables that are different for each frame type
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
40 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
41 struct FrameMode {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
42 uint8_t sub; ///< Number subblocks in each frame
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
43 const uint16_t *bark_tab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
44
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
45 /** number of distinct bark scale envelope values */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
46 uint8_t bark_env_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
47
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
48 const int16_t *bark_cb; ///< codebook for the bark scale envelope (BSE)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
49 uint8_t bark_n_coef;///< number of BSE CB coefficients to read
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
50 uint8_t bark_n_bit; ///< number of bits of the BSE coefs
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
51
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
52 //@{
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
53 /** main codebooks for spectrum data */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
54 const int16_t *cb0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
55 const int16_t *cb1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
56 //@}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
57
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
58 uint8_t cb_len_read; ///< number of spectrum coefficients to read
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
59 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
60
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
61 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
62 * Parameters and tables that are different for every combination of
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
63 * bitrate/sample rate
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
64 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
65 typedef struct {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
66 struct FrameMode fmode[3]; ///< frame type-dependant parameters
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
67
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
68 uint16_t size; ///< frame size in samples
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
69 uint8_t n_lsp; ///< number of lsp coefficients
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
70 const float *lspcodebook;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
71
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
72 /* number of bits of the different LSP CB coefficients */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
73 uint8_t lsp_bit0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
74 uint8_t lsp_bit1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
75 uint8_t lsp_bit2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
76
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
77 uint8_t lsp_split; ///< number of CB entries for the LSP decoding
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
78 const int16_t *ppc_shape_cb; ///< PPC shape CB
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
79
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
80 /** number of the bits for the PPC period value */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
81 uint8_t ppc_period_bit;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
82
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
83 uint8_t ppc_shape_bit; ///< number of bits of the PPC shape CB coeffs
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
84 uint8_t ppc_shape_len; ///< size of PPC shape CB
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
85 uint8_t pgain_bit; ///< bits for PPC gain
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
86
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
87 /** constant for peak period to peak width conversion */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
88 uint16_t peak_per2wid;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
89 } ModeTab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
90
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
91 static const ModeTab mode_08_08 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
92 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
93 { 8, bark_tab_s08_64, 10, tab.fcb08s , 1, 5, tab.cb0808s0, tab.cb0808s1, 18},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
94 { 2, bark_tab_m08_256, 20, tab.fcb08m , 2, 5, tab.cb0808m0, tab.cb0808m1, 16},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
95 { 1, bark_tab_l08_512, 30, tab.fcb08l , 3, 6, tab.cb0808l0, tab.cb0808l1, 17}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
96 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
97 512 , 12, tab.lsp08, 1, 5, 3, 3, tab.shape08 , 8, 28, 20, 6, 40
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
98 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
99
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
100 static const ModeTab mode_11_08 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
101 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
102 { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1108s0, tab.cb1108s1, 29},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
103 { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1108m0, tab.cb1108m1, 24},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
104 { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1108l0, tab.cb1108l1, 27}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
105 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
106 512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
107 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
108
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
109 static const ModeTab mode_11_10 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
110 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
111 { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1110s0, tab.cb1110s1, 21},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
112 { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1110m0, tab.cb1110m1, 18},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
113 { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1110l0, tab.cb1110l1, 20}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
114 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
115 512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
116 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
117
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
118 static const ModeTab mode_16_16 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
119 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
120 { 8, bark_tab_s16_128, 10, tab.fcb16s , 1, 5, tab.cb1616s0, tab.cb1616s1, 16},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
121 { 2, bark_tab_m16_512, 20, tab.fcb16m , 2, 5, tab.cb1616m0, tab.cb1616m1, 15},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
122 { 1, bark_tab_l16_1024,30, tab.fcb16l , 3, 6, tab.cb1616l0, tab.cb1616l1, 16}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
123 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
124 1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16 , 9, 56, 60, 7, 180
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
125 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
126
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
127 static const ModeTab mode_22_20 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
128 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
129 { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
130 { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
131 { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
132 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
133 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
134 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
135
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
136 static const ModeTab mode_22_24 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
137 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
138 { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
139 { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
140 { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
141 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
142 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
143 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
144
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
145 static const ModeTab mode_22_32 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
146 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
147 { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
148 { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
149 { 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
150 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
151 512 , 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
152 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
153
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
154 static const ModeTab mode_44_40 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
155 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
156 {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4440s0, tab.cb4440s1, 18},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
157 { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4440m0, tab.cb4440m1, 17},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
158 { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4440l0, tab.cb4440l1, 17}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
159 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
160 2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
161 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
162
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
163 static const ModeTab mode_44_48 = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
164 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
165 {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4448s0, tab.cb4448s1, 15},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
166 { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4448m0, tab.cb4448m1, 14},
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
167 { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4448l0, tab.cb4448l1, 14}
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
168 },
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
169 2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
170 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
171
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
172 typedef struct TwinContext {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
173 AVCodecContext *avctx;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
174 DSPContext dsp;
10199
38ab367d4231 Merge FFTContext and MDCTContext
mru
parents: 10174
diff changeset
175 FFTContext mdct_ctx[3];
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
176
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
177 const ModeTab *mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
178
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
179 // history
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
180 float lsp_hist[2][20]; ///< LSP coefficients of the last frame
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
181 float bark_hist[3][2][40]; ///< BSE coefficients of last frame
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
182
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
183 // bitstream parameters
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
184 int16_t permut[4][4096];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
185 uint8_t length[4][2]; ///< main codebook stride
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
186 uint8_t length_change[4];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
187 uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
188 int bits_main_spec_change[4];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
189 int n_div[4];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
190
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
191 float *spectrum;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
192 float *curr_frame; ///< non-interleaved output
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
193 float *prev_frame; ///< non-interleaved previous frame
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
194 int last_block_pos[2];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
195
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
196 float *cos_tabs[3];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
197
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
198 // scratch buffers
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
199 float *tmp_buf;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
200 } TwinContext;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
201
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
202 #define PPC_SHAPE_CB_SIZE 64
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
203 #define SUB_AMP_MAX 4500.0
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
204 #define MULAW_MU 100.0
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
205 #define GAIN_BITS 8
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
206 #define AMP_MAX 13000.0
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
207 #define SUB_GAIN_BITS 5
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
208 #define WINDOW_TYPE_BITS 4
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
209 #define PGAIN_MU 200
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
210
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
211 /** @note not speed critical, hence not optimized */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
212 static void memset_float(float *buf, float val, int size)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
213 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
214 while (size--)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
215 *buf++ = val;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
216 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
217
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
218 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
219 * Evaluate a single LPC amplitude spectrum envelope coefficient from the line
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
220 * spectrum pairs.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
221 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
222 * @param lsp a vector of the cosinus of the LSP values
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
223 * @param cos_val cos(PI*i/N) where i is the index of the LPC amplitude
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
224 * @param order the order of the LSP (and the size of the *lsp buffer). Must
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
225 * be a multiple of four.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
226 * @return the LPC value
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
227 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
228 * @todo reuse code from vorbis_dec.c: vorbis_floor0_decode
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
229 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
230 static float eval_lpc_spectrum(const float *lsp, float cos_val, int order)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
231 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
232 int j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
233 float p = 0.5f;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
234 float q = 0.5f;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
235 float two_cos_w = 2.0f*cos_val;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
236
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
237 for (j = 0; j + 1 < order; j += 2*2) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
238 // Unroll the loop once since order is a multiple of four
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
239 q *= lsp[j ] - two_cos_w;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
240 p *= lsp[j+1] - two_cos_w;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
241
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
242 q *= lsp[j+2] - two_cos_w;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
243 p *= lsp[j+3] - two_cos_w;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
244 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
245
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
246 p *= p * (2.0f - two_cos_w);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
247 q *= q * (2.0f + two_cos_w);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
248
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
249 return 0.5 / (p + q);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
250 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
251
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
252 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
253 * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
254 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
255 static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
256 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
257 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
258 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
259 int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
260
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
261 for (i = 0; i < size_s/2; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
262 float cos_i = tctx->cos_tabs[0][i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
263 lpc[i] = eval_lpc_spectrum(cos_vals, cos_i, mtab->n_lsp);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
264 lpc[size_s-i-1] = eval_lpc_spectrum(cos_vals, -cos_i, mtab->n_lsp);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
265 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
266 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
267
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
268 static void interpolate(float *out, float v1, float v2, int size)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
269 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
270 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
271 float step = (v1 - v2)/(size + 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
272
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
273 for (i = 0; i < size; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
274 v2 += step;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
275 out[i] = v2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
276 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
277 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
278
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
279 static inline float get_cos(int idx, int part, const float *cos_tab, int size)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
280 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
281 return part ? -cos_tab[size - idx - 1] :
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
282 cos_tab[ idx ];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
283 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
284
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
285 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
286 * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
287 * Probably for speed reasons, the coefficients are evaluated as
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
288 * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ...
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
289 * where s is an evaluated value, i is a value interpolated from the others
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
290 * and b might be either calculated or interpolated, depending on an
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
291 * unexplained condition.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
292 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
293 * @param step the size of a block "siiiibiiii"
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
294 * @param in the cosinus of the LSP data
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
295 * @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
296 (negative cossinus values)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
297 * @param size the size of the whole output
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
298 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
299 static inline void eval_lpcenv_or_interp(TwinContext *tctx,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
300 enum FrameType ftype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
301 float *out, const float *in,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
302 int size, int step, int part)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
303 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
304 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
305 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
306 const float *cos_tab = tctx->cos_tabs[ftype];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
307
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
308 // Fill the 's'
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
309 for (i = 0; i < size; i += step)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
310 out[i] =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
311 eval_lpc_spectrum(in,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
312 get_cos(i, part, cos_tab, size),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
313 mtab->n_lsp);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
314
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
315 // Fill the 'iiiibiiii'
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
316 for (i = step; i <= size - 2*step; i += step) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
317 if (out[i + step] + out[i - step] > 1.95*out[i] ||
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
318 out[i + step] >= out[i - step]) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
319 interpolate(out + i - step + 1, out[i], out[i-step], step - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
320 } else {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
321 out[i - step/2] =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
322 eval_lpc_spectrum(in,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
323 get_cos(i-step/2, part, cos_tab, size),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
324 mtab->n_lsp);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
325 interpolate(out + i - step + 1, out[i-step/2], out[i-step ], step/2 - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
326 interpolate(out + i - step/2 + 1, out[i ], out[i-step/2], step/2 - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
327 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
328 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
329
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
330 interpolate(out + size - 2*step + 1, out[size-step], out[size - 2*step], step - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
331 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
332
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
333 static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
334 const float *buf, float *lpc,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
335 int size, int step)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
336 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
337 eval_lpcenv_or_interp(tctx, ftype, lpc , buf, size/2, step, 0);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
338 eval_lpcenv_or_interp(tctx, ftype, lpc + size/2, buf, size/2, 2*step, 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
339
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
340 interpolate(lpc+size/2-step+1, lpc[size/2], lpc[size/2-step], step);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
341
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
342 memset_float(lpc + size - 2*step + 1, lpc[size - 2*step], 2*step - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
343 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
344
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
345 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
346 * Inverse quantization. Read CB coefficients for cb1 and cb2 from the
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
347 * bitstream, sum the corresponding vectors and write the result to *out
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
348 * after permutation.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
349 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
350 static void dequant(TwinContext *tctx, GetBitContext *gb, float *out,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
351 enum FrameType ftype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
352 const int16_t *cb0, const int16_t *cb1, int cb_len)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
353 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
354 int pos = 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
355 int i, j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
356
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
357 for (i = 0; i < tctx->n_div[ftype]; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
358 int tmp0, tmp1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
359 int sign0 = 1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
360 int sign1 = 1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
361 const int16_t *tab0, *tab1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
362 int length = tctx->length[ftype][i >= tctx->length_change[ftype]];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
363 int bitstream_second_part = (i >= tctx->bits_main_spec_change[ftype]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
364
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
365 int bits = tctx->bits_main_spec[0][ftype][bitstream_second_part];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
366 if (bits == 7) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
367 if (get_bits1(gb))
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
368 sign0 = -1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
369 bits = 6;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
370 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
371 tmp0 = get_bits(gb, bits);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
372
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
373 bits = tctx->bits_main_spec[1][ftype][bitstream_second_part];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
374
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
375 if (bits == 7) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
376 if (get_bits1(gb))
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
377 sign1 = -1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
378
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
379 bits = 6;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
380 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
381 tmp1 = get_bits(gb, bits);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
382
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
383 tab0 = cb0 + tmp0*cb_len;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
384 tab1 = cb1 + tmp1*cb_len;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
385
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
386 for (j = 0; j < length; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
387 out[tctx->permut[ftype][pos+j]] = sign0*tab0[j] + sign1*tab1[j];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
388
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
389 pos += length;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
390 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
391
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
392 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
393
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
394 static inline float mulawinv(float y, float clip, float mu)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
395 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
396 y = av_clipf(y/clip, -1, 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
397 return clip * FFSIGN(y) * (exp(log(1+mu) * fabs(y)) - 1) / mu;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
398 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
399
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
400 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
401 * Evaluate a*b/400 rounded to the nearest integer. When, for example,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
402 * a*b == 200 and the nearest integer is ill-defined, use a table to emulate
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
403 * the following broken float-based implementation used by the binary decoder:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
404 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
405 * \code
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
406 * static int very_broken_op(int a, int b)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
407 * {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
408 * static float test; // Ugh, force gcc to do the division first...
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
409 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
410 * test = a/400.;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
411 * return b * test + 0.5;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
412 * }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
413 * \endcode
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
414 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
415 * @note if this function is replaced by just ROUNDED_DIV(a*b,400.), the stddev
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
416 * between the original file (before encoding with Yamaha encoder) and the
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
417 * decoded output increases, which leads one to believe that the encoder expects
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
418 * exactly this broken calculation.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
419 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
420 static int very_broken_op(int a, int b)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
421 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
422 int x = a*b + 200;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
423 int size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
424 const uint8_t *rtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
425
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
426 if (x%400 || b%5)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
427 return x/400;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
428
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
429 x /= 400;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
430
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
431 size = tabs[b/5].size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
432 rtab = tabs[b/5].tab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
433 return x - rtab[size*av_log2(2*(x - 1)/size)+(x - 1)%size];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
434 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
435
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
436 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
437 * Sum to data a periodic peak of a given period, width and shape.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
438 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
439 * @param period the period of the peak divised by 400.0
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
440 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
441 static void add_peak(int period, int width, const float *shape,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
442 float ppc_gain, float *speech, int len)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
443 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
444 int i, j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
445
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
446 const float *shape_end = shape + len;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
447 int center;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
448
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
449 // First peak centered around zero
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
450 for (i = 0; i < width/2; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
451 speech[i] += ppc_gain * *shape++;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
452
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
453 for (i = 1; i < ROUNDED_DIV(len,width) ; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
454 center = very_broken_op(period, i);
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
455 for (j = -width/2; j < (width+1)/2; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
456 speech[j+center] += ppc_gain * *shape++;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
457 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
458
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
459 // For the last block, be careful not to go beyond the end of the buffer
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
460 center = very_broken_op(period, i);
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
461 for (j = -width/2; j < (width + 1)/2 && shape < shape_end; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
462 speech[j+center] += ppc_gain * *shape++;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
463 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
464
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
465 static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
466 float ppc_gain, float *speech)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
467 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
468 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
469 int isampf = tctx->avctx->sample_rate/1000;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
470 int ibps = tctx->avctx->bit_rate/(1000 * tctx->avctx->channels);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
471 int min_period = ROUNDED_DIV( 40*2*mtab->size, isampf);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
472 int max_period = ROUNDED_DIV(6*40*2*mtab->size, isampf);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
473 int period_range = max_period - min_period;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
474
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
475 // This is actually the period multiplied by 400. It is just linearly coded
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
476 // between its maximum and minimum value.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
477 int period = min_period +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
478 ROUNDED_DIV(period_coef*period_range, (1 << mtab->ppc_period_bit) - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
479 int width;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
480
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
481 if (isampf == 22 && ibps == 32) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
482 // For some unknown reason, NTT decided to code this case differently...
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
483 width = ROUNDED_DIV((period + 800)* mtab->peak_per2wid, 400*mtab->size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
484 } else
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
485 width = (period )* mtab->peak_per2wid/(400*mtab->size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
486
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
487 add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
488 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
489
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
490 static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
491 float *out)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
492 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
493 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
494 int i, j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
495 int sub = mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
496 float step = AMP_MAX / ((1 << GAIN_BITS) - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
497 float sub_step = SUB_AMP_MAX / ((1 << SUB_GAIN_BITS) - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
498
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
499 if (ftype == FT_LONG) {
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
500 for (i = 0; i < tctx->avctx->channels; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
501 out[i] = (1./(1<<13)) *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
502 mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
503 AMP_MAX, MULAW_MU);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
504 } else {
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
505 for (i = 0; i < tctx->avctx->channels; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
506 float val = (1./(1<<23)) *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
507 mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
508 AMP_MAX, MULAW_MU);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
509
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
510 for (j = 0; j < sub; j++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
511 out[i*sub + j] =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
512 val*mulawinv(sub_step* 0.5 +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
513 sub_step* get_bits(gb, SUB_GAIN_BITS),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
514 SUB_AMP_MAX, MULAW_MU);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
515 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
516 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
517 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
518 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
519
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
520 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
521 * Rearrange the LSP coefficients so that they have a minimum distance of
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
522 * min_dist. This function does it exactly as described in section of 3.2.4
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
523 * of the G.729 specification (but interestingly is different from what the
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
524 * reference decoder actually does).
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
525 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
526 static void rearrange_lsp(int order, float *lsp, float min_dist)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
527 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
528 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
529 float min_dist2 = min_dist * 0.5;
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
530 for (i = 1; i < order; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
531 if (lsp[i] - lsp[i-1] < min_dist) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
532 float avg = (lsp[i] + lsp[i-1]) * 0.5;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
533
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
534 lsp[i-1] = avg - min_dist2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
535 lsp[i ] = avg + min_dist2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
536 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
537 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
538
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
539 static void bubblesort(float *lsp, int lp_order)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
540 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
541 int i,j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
542
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
543 /* sort lsp in ascending order. float bubble agorithm,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
544 O(n) if data already sorted, O(n^2) - otherwise */
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
545 for (i = 0; i < lp_order - 1; i++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
546 for (j = i; j >= 0 && lsp[j] > lsp[j+1]; j--)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
547 FFSWAP(float, lsp[j], lsp[j+1]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
548 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
549
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
550 static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
551 int lpc_hist_idx, float *lsp, float *hist)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
552 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
553 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
554 int i, j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
555
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
556 const float *cb = mtab->lspcodebook;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
557 const float *cb2 = cb + (1 << mtab->lsp_bit1)*mtab->n_lsp;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
558 const float *cb3 = cb2 + (1 << mtab->lsp_bit2)*mtab->n_lsp;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
559
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
560 const int8_t funny_rounding[4] = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
561 -2,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
562 mtab->lsp_split == 4 ? -2 : 1,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
563 mtab->lsp_split == 4 ? -2 : 1,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
564 0
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
565 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
566
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
567 j = 0;
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
568 for (i = 0; i < mtab->lsp_split; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
569 int chunk_end = ((i + 1)*mtab->n_lsp + funny_rounding[i])/mtab->lsp_split;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
570 for (; j < chunk_end; j++)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
571 lsp[j] = cb [lpc_idx1 * mtab->n_lsp + j] +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
572 cb2[lpc_idx2[i] * mtab->n_lsp + j];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
573 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
574
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
575 rearrange_lsp(mtab->n_lsp, lsp, 0.0001);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
576
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
577 for (i = 0; i < mtab->n_lsp; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
578 float tmp1 = 1. - cb3[lpc_hist_idx*mtab->n_lsp + i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
579 float tmp2 = hist[i] * cb3[lpc_hist_idx*mtab->n_lsp + i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
580 hist[i] = lsp[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
581 lsp[i] = lsp[i] * tmp1 + tmp2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
582 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
583
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
584 rearrange_lsp(mtab->n_lsp, lsp, 0.0001);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
585 rearrange_lsp(mtab->n_lsp, lsp, 0.000095);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
586 bubblesort(lsp, mtab->n_lsp);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
587 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
588
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
589 static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
590 enum FrameType ftype, float *lpc)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
591 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
592 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
593 int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
594
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
595 for (i = 0; i < tctx->mtab->n_lsp; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
596 lsp[i] = 2*cos(lsp[i]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
597
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
598 switch (ftype) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
599 case FT_LONG:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
600 eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 8);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
601 break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
602 case FT_MEDIUM:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
603 eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 2);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
604 break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
605 case FT_SHORT:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
606 eval_lpcenv(tctx, lsp, lpc);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
607 break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
608 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
609 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
610
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
611 static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
612 float *in, float *prev, int ch)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
613 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
614 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
615 int bsize = mtab->size / mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
616 int size = mtab->size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
617 float *buf1 = tctx->tmp_buf;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
618 int j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
619 int wsize; // Window size
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
620 float *out = tctx->curr_frame + 2*ch*mtab->size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
621 float *out2 = out;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
622 float *prev_buf;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
623 int first_wsize;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
624
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
625 static const uint8_t wtype_to_wsize[] = {0, 0, 2, 2, 2, 1, 0, 1, 1};
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
626 int types_sizes[] = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
627 mtab->size / mtab->fmode[FT_LONG ].sub,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
628 mtab->size / mtab->fmode[FT_MEDIUM].sub,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
629 mtab->size / (2*mtab->fmode[FT_SHORT ].sub),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
630 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
631
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
632 wsize = types_sizes[wtype_to_wsize[wtype]];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
633 first_wsize = wsize;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
634 prev_buf = prev + (size - bsize)/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
635
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
636 for (j = 0; j < mtab->fmode[ftype].sub; j++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
637 int sub_wtype = ftype == FT_MEDIUM ? 8 : wtype;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
638
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
639 if (!j && wtype == 4)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
640 sub_wtype = 4;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
641 else if (j == mtab->fmode[ftype].sub-1 && wtype == 7)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
642 sub_wtype = 7;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
643
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
644 wsize = types_sizes[wtype_to_wsize[sub_wtype]];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
645
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
646 ff_imdct_half(&tctx->mdct_ctx[ftype], buf1 + bsize*j, in + bsize*j);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
647
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
648 tctx->dsp.vector_fmul_window(out2,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
649 prev_buf + (bsize-wsize)/2,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
650 buf1 + bsize*j,
10174
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10108
diff changeset
651 ff_sine_windows[av_log2(wsize)],
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
652 0.0,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
653 wsize/2);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
654 out2 += wsize;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
655
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
656 memcpy(out2, buf1 + bsize*j + wsize/2, (bsize - wsize/2)*sizeof(float));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
657
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
658 out2 += ftype == FT_MEDIUM ? (bsize-wsize)/2 : bsize - wsize;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
659
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
660 prev_buf = buf1 + bsize*j + bsize/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
661 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
662
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
663 tctx->last_block_pos[ch] = (size + first_wsize)/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
664 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
665
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
666 static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
667 float *out)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
668 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
669 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
670 float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
671 int i, j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
672
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
673 for (i = 0; i < tctx->avctx->channels; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
674 imdct_and_window(tctx, ftype, wtype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
675 tctx->spectrum + i*mtab->size,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
676 prev_buf + 2*i*mtab->size,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
677 i);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
678 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
679
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
680 if (tctx->avctx->channels == 2) {
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
681 for (i = 0; i < mtab->size - tctx->last_block_pos[0]; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
682 float f1 = prev_buf[ i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
683 float f2 = prev_buf[2*mtab->size + i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
684 out[2*i ] = f1 + f2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
685 out[2*i + 1] = f1 - f2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
686 }
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
687 for (j = 0; i < mtab->size; j++,i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
688 float f1 = tctx->curr_frame[ j];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
689 float f2 = tctx->curr_frame[2*mtab->size + j];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
690 out[2*i ] = f1 + f2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
691 out[2*i + 1] = f1 - f2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
692 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
693 } else {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
694 memcpy(out, prev_buf,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
695 (mtab->size - tctx->last_block_pos[0]) * sizeof(*out));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
696
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
697 out += mtab->size - tctx->last_block_pos[0];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
698
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
699 memcpy(out, tctx->curr_frame,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
700 (tctx->last_block_pos[0]) * sizeof(*out));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
701 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
702
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
703 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
704
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
705 static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
706 int ch, float *out, float gain, enum FrameType ftype)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
707 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
708 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
709 int i,j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
710 float *hist = tctx->bark_hist[ftype][ch];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
711 float val = ((const float []) {0.4, 0.35, 0.28})[ftype];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
712 int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
713 int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
714 int idx = 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
715
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
716 for (i = 0; i < fw_cb_len; i++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
717 for (j = 0; j < bark_n_coef; j++, idx++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
718 float tmp2 =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
719 mtab->fmode[ftype].bark_cb[fw_cb_len*in[j] + i] * (1./4096);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
720 float st = use_hist ?
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
721 (1. - val) * tmp2 + val*hist[idx] + 1. : tmp2 + 1.;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
722
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
723 hist[idx] = tmp2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
724 if (st < -1.) st = 1.;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
725
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
726 memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
727 out += mtab->fmode[ftype].bark_tab[idx];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
728 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
729
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
730 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
731
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
732 static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
733 float *out, enum FrameType ftype)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
734 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
735 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
736 int channels = tctx->avctx->channels;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
737 int sub = mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
738 int block_size = mtab->size / sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
739 float gain[channels*sub];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
740 float ppc_shape[mtab->ppc_shape_len * channels * 4];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
741 uint8_t bark1[channels][sub][mtab->fmode[ftype].bark_n_coef];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
742 uint8_t bark_use_hist[channels][sub];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
743
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
744 uint8_t lpc_idx1[channels];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
745 uint8_t lpc_idx2[channels][tctx->mtab->lsp_split];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
746 uint8_t lpc_hist_idx[channels];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
747
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
748 int i, j, k;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
749
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
750 dequant(tctx, gb, out, ftype,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
751 mtab->fmode[ftype].cb0, mtab->fmode[ftype].cb1,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
752 mtab->fmode[ftype].cb_len_read);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
753
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
754 for (i = 0; i < channels; i++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
755 for (j = 0; j < sub; j++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
756 for (k = 0; k < mtab->fmode[ftype].bark_n_coef; k++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
757 bark1[i][j][k] =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
758 get_bits(gb, mtab->fmode[ftype].bark_n_bit);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
759
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
760 for (i = 0; i < channels; i++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
761 for (j = 0; j < sub; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
762 bark_use_hist[i][j] = get_bits1(gb);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
763
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
764 dec_gain(tctx, gb, ftype, gain);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
765
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
766 for (i = 0; i < channels; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
767 lpc_hist_idx[i] = get_bits(gb, tctx->mtab->lsp_bit0);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
768 lpc_idx1 [i] = get_bits(gb, tctx->mtab->lsp_bit1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
769
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
770 for (j = 0; j < tctx->mtab->lsp_split; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
771 lpc_idx2[i][j] = get_bits(gb, tctx->mtab->lsp_bit2);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
772 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
773
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
774 if (ftype == FT_LONG) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
775 int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len*channels - 1)/
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
776 tctx->n_div[3];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
777 dequant(tctx, gb, ppc_shape, FT_PPC, mtab->ppc_shape_cb,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
778 mtab->ppc_shape_cb + cb_len_p*PPC_SHAPE_CB_SIZE, cb_len_p);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
779 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
780
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
781 for (i = 0; i < channels; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
782 float *chunk = out + mtab->size * i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
783 float lsp[tctx->mtab->n_lsp];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
784
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
785 for (j = 0; j < sub; j++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
786 dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
787 tctx->tmp_buf, gain[sub*i+j], ftype);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
788
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
789 tctx->dsp.vector_fmul(chunk + block_size*j, tctx->tmp_buf,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
790 block_size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
791
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
792 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
793
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
794 if (ftype == FT_LONG) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
795 float pgain_step = 25000. / ((1 << mtab->pgain_bit) - 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
796 int p_coef = get_bits(gb, tctx->mtab->ppc_period_bit);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
797 int g_coef = get_bits(gb, tctx->mtab->pgain_bit);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
798 float v = 1./8192*
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
799 mulawinv(pgain_step*g_coef+ pgain_step/2, 25000., PGAIN_MU);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
800
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
801 decode_ppc(tctx, p_coef, ppc_shape + i*mtab->ppc_shape_len, v,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
802 chunk);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
803 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
804
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
805 decode_lsp(tctx, lpc_idx1[i], lpc_idx2[i], lpc_hist_idx[i], lsp,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
806 tctx->lsp_hist[i]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
807
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
808 dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
809
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
810 for (j = 0; j < mtab->fmode[ftype].sub; j++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
811 tctx->dsp.vector_fmul(chunk, tctx->tmp_buf, block_size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
812 chunk += block_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
813 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
814 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
815 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
816
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
817 static int twin_decode_frame(AVCodecContext * avctx, void *data,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
818 int *data_size, AVPacket *avpkt)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
819 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
820 const uint8_t *buf = avpkt->data;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
821 int buf_size = avpkt->size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
822 TwinContext *tctx = avctx->priv_data;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
823 GetBitContext gb;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
824 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
825 float *out = data;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
826 enum FrameType ftype;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
827 int window_type;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
828 static const enum FrameType wtype_to_ftype_table[] = {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
829 FT_LONG, FT_LONG, FT_SHORT, FT_LONG,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
830 FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
831 };
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
832
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
833 if (buf_size*8 < avctx->bit_rate*mtab->size/avctx->sample_rate + 8) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
834 av_log(avctx, AV_LOG_ERROR,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
835 "Frame too small (%d bytes). Truncated file?\n", buf_size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
836 *data_size = 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
837 return buf_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
838 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
839
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
840 init_get_bits(&gb, buf, buf_size * 8);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
841 skip_bits(&gb, get_bits(&gb, 8));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
842 window_type = get_bits(&gb, WINDOW_TYPE_BITS);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
843
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
844 if (window_type > 8) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
845 av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
846 return -1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
847 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
848
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
849 ftype = wtype_to_ftype_table[window_type];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
850
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
851 read_and_decode_spectrum(tctx, &gb, tctx->spectrum, ftype);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
852
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
853 imdct_output(tctx, ftype, window_type, out);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
854
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
855 FFSWAP(float*, tctx->curr_frame, tctx->prev_frame);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
856
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
857 if (tctx->avctx->frame_number < 2) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
858 *data_size=0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
859 return buf_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
860 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
861
10104
0fa3d21b317e SSE optimized vector_clipf(). 10% faster TwinVQ decoding.
vitor
parents: 10081
diff changeset
862 tctx->dsp.vector_clipf(out, out, -32700./(1<<15), 32700./(1<<15),
10106
a04aca5587a7 100l, revision 19728 added a bug that broke twinvq decoding. I forgot to
vitor
parents: 10104
diff changeset
863 avctx->channels * mtab->size);
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
864
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
865 *data_size = mtab->size*avctx->channels*4;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
866
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
867 return buf_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
868 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
869
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
870 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
871 * Init IMDCT and windowing tables
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
872 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
873 static av_cold void init_mdct_win(TwinContext *tctx)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
874 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
875 int i,j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
876 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
877 int size_s = mtab->size / mtab->fmode[FT_SHORT].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
878 int size_m = mtab->size / mtab->fmode[FT_MEDIUM].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
879 int channels = tctx->avctx->channels;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
880 float norm = channels == 1 ? 2. : 1.;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
881
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
882 for (i = 0; i < 3; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
883 int bsize = tctx->mtab->size/tctx->mtab->fmode[i].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
884 ff_mdct_init(&tctx->mdct_ctx[i], av_log2(bsize) + 1, 1,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
885 -sqrt(norm/bsize) / (1<<15));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
886 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
887
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
888 tctx->tmp_buf = av_malloc(mtab->size * sizeof(*tctx->tmp_buf));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
889
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
890 tctx->spectrum = av_malloc(2*mtab->size*channels*sizeof(float));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
891 tctx->curr_frame = av_malloc(2*mtab->size*channels*sizeof(float));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
892 tctx->prev_frame = av_malloc(2*mtab->size*channels*sizeof(float));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
893
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
894 for (i = 0; i < 3; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
895 int m = 4*mtab->size/mtab->fmode[i].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
896 double freq = 2*M_PI/m;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
897 tctx->cos_tabs[i] = av_malloc((m/4)*sizeof(*tctx->cos_tabs));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
898
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
899 for (j = 0; j <= m/8; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
900 tctx->cos_tabs[i][j] = cos((2*j + 1)*freq);
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
901 for (j = 1; j < m/8; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
902 tctx->cos_tabs[i][m/4-j] = tctx->cos_tabs[i][j];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
903 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
904
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
905
10174
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10108
diff changeset
906 ff_sine_window_init(ff_sine_windows[av_log2(size_m) ], size_m );
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10108
diff changeset
907 ff_sine_window_init(ff_sine_windows[av_log2(size_s/2) ], size_s/2);
89cd870ca180 Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents: 10108
diff changeset
908 ff_sine_window_init(ff_sine_windows[av_log2(mtab->size)], mtab->size);
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
909 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
910
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
911 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
912 * Interpret the data as if it were a num_blocks x line_len[0] matrix and for
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
913 * each line do a cyclic permutation, i.e.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
914 * abcdefghijklm -> defghijklmabc
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
915 * where the amount to be shifted is evaluated depending on the column.
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
916 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
917 static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
918 int block_size,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
919 const uint8_t line_len[2], int length_div,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
920 enum FrameType ftype)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
921
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
922 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
923 int i,j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
924
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
925 for (i = 0; i < line_len[0]; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
926 int shift;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
927
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
928 if (num_blocks == 1 ||
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
929 (ftype == FT_LONG && num_vect % num_blocks) ||
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
930 (ftype != FT_LONG && num_vect & 1 ) ||
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
931 i == line_len[1]) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
932 shift = 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
933 } else if (ftype == FT_LONG) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
934 shift = i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
935 } else
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
936 shift = i*i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
937
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
938 for (j = 0; j < num_vect && (j+num_vect*i < block_size*num_blocks); j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
939 tab[i*num_vect+j] = i*num_vect + (j + shift) % num_vect;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
940 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
941 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
942
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
943 /**
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
944 * Interpret the input data as in the following table:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
945 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
946 * \verbatim
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
947 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
948 * abcdefgh
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
949 * ijklmnop
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
950 * qrstuvw
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
951 * x123456
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
952 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
953 * \endverbatim
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
954 *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
955 * and transpose it, giving the output
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
956 * aiqxbjr1cks2dlt3emu4fvn5gow6hp
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
957 */
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
958 static void transpose_perm(int16_t *out, int16_t *in, int num_vect,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
959 const uint8_t line_len[2], int length_div)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
960 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
961 int i,j;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
962 int cont= 0;
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
963 for (i = 0; i < num_vect; i++)
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
964 for (j = 0; j < line_len[i >= length_div]; j++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
965 out[cont++] = in[j*num_vect + i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
966 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
967
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
968 static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
969 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
970 int block_size = size/n_blocks;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
971 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
972
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
973 for (i = 0; i < size; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
974 out[i] = block_size * (in[i] % n_blocks) + in[i] / n_blocks;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
975 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
976
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
977 static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
978 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
979 int block_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
980 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
981 int size = tctx->avctx->channels*mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
982 int16_t *tmp_perm = (int16_t *) tctx->tmp_buf;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
983
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
984 if (ftype == FT_PPC) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
985 size = tctx->avctx->channels;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
986 block_size = mtab->ppc_shape_len;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
987 } else
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
988 block_size = mtab->size / mtab->fmode[ftype].sub;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
989
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
990 permutate_in_line(tmp_perm, tctx->n_div[ftype], size,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
991 block_size, tctx->length[ftype],
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
992 tctx->length_change[ftype], ftype);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
993
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
994 transpose_perm(tctx->permut[ftype], tmp_perm, tctx->n_div[ftype],
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
995 tctx->length[ftype], tctx->length_change[ftype]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
996
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
997 linear_perm(tctx->permut[ftype], tctx->permut[ftype], size,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
998 size*block_size);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
999 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1000
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1001 static av_cold void init_bitstream_params(TwinContext *tctx)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1002 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1003 const ModeTab *mtab = tctx->mtab;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1004 int n_ch = tctx->avctx->channels;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1005 int total_fr_bits = tctx->avctx->bit_rate*mtab->size/
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1006 tctx->avctx->sample_rate;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1007
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1008 int lsp_bits_per_block = n_ch*(mtab->lsp_bit0 + mtab->lsp_bit1 +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1009 mtab->lsp_split*mtab->lsp_bit2);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1010
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1011 int ppc_bits = n_ch*(mtab->pgain_bit + mtab->ppc_shape_bit +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1012 mtab->ppc_period_bit);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1013
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1014 int bsize_no_main_cb[3];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1015 int bse_bits[3];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1016 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1017
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
1018 for (i = 0; i < 3; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1019 // +1 for history usage switch
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1020 bse_bits[i] = n_ch *
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1021 (mtab->fmode[i].bark_n_coef * mtab->fmode[i].bark_n_bit + 1);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1022
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1023 bsize_no_main_cb[2] = bse_bits[2] + lsp_bits_per_block + ppc_bits +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1024 WINDOW_TYPE_BITS + n_ch*GAIN_BITS;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1025
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
1026 for (i = 0; i < 2; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1027 bsize_no_main_cb[i] =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1028 lsp_bits_per_block + n_ch*GAIN_BITS + WINDOW_TYPE_BITS +
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1029 mtab->fmode[i].sub*(bse_bits[i] + n_ch*SUB_GAIN_BITS);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1030
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1031 // The remaining bits are all used for the main spectrum coefficients
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
1032 for (i = 0; i < 4; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1033 int bit_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1034 int vect_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1035 int rounded_up, rounded_down, num_rounded_down, num_rounded_up;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1036 if (i == 3) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1037 bit_size = n_ch * mtab->ppc_shape_bit;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1038 vect_size = n_ch * mtab->ppc_shape_len;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1039 } else {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1040 bit_size = total_fr_bits - bsize_no_main_cb[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1041 vect_size = n_ch * mtab->size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1042 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1043
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1044 tctx->n_div[i] = (bit_size + 13) / 14;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1045
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1046 rounded_up = (bit_size + tctx->n_div[i] - 1)/tctx->n_div[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1047 rounded_down = (bit_size )/tctx->n_div[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1048 num_rounded_down = rounded_up * tctx->n_div[i] - bit_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1049 num_rounded_up = tctx->n_div[i] - num_rounded_down;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1050 tctx->bits_main_spec[0][i][0] = (rounded_up + 1)/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1051 tctx->bits_main_spec[1][i][0] = (rounded_up )/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1052 tctx->bits_main_spec[0][i][1] = (rounded_down + 1)/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1053 tctx->bits_main_spec[1][i][1] = (rounded_down )/2;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1054 tctx->bits_main_spec_change[i] = num_rounded_up;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1055
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1056 rounded_up = (vect_size + tctx->n_div[i] - 1)/tctx->n_div[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1057 rounded_down = (vect_size )/tctx->n_div[i];
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1058 num_rounded_down = rounded_up * tctx->n_div[i] - vect_size;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1059 num_rounded_up = tctx->n_div[i] - num_rounded_down;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1060 tctx->length[i][0] = rounded_up;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1061 tctx->length[i][1] = rounded_down;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1062 tctx->length_change[i] = num_rounded_up;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1063 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1064
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
1065 for (i = 0; i < 4; i++)
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1066 construct_perm_table(tctx, i);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1067 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1068
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1069 static av_cold int twin_decode_init(AVCodecContext *avctx)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1070 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1071 TwinContext *tctx = avctx->priv_data;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1072 int isampf = avctx->sample_rate/1000;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1073 int ibps = avctx->bit_rate/(1000 * avctx->channels);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1074
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1075 tctx->avctx = avctx;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1076 avctx->sample_fmt = SAMPLE_FMT_FLT;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1077
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1078 if (avctx->channels > 2) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1079 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n",
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1080 avctx->channels);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1081 return -1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1082 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1083
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1084 switch ((isampf << 8) + ibps) {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1085 case (8 <<8) + 8: tctx->mtab = &mode_08_08; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1086 case (11<<8) + 8: tctx->mtab = &mode_11_08; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1087 case (11<<8) + 10: tctx->mtab = &mode_11_10; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1088 case (16<<8) + 16: tctx->mtab = &mode_16_16; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1089 case (22<<8) + 20: tctx->mtab = &mode_22_20; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1090 case (22<<8) + 24: tctx->mtab = &mode_22_24; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1091 case (22<<8) + 32: tctx->mtab = &mode_22_32; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1092 case (44<<8) + 40: tctx->mtab = &mode_44_40; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1093 case (44<<8) + 48: tctx->mtab = &mode_44_48; break;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1094 default:
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1095 av_log(avctx, AV_LOG_ERROR, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf, isampf);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1096 return -1;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1097 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1098
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1099 dsputil_init(&tctx->dsp, avctx);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1100 init_mdct_win(tctx);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1101 init_bitstream_params(tctx);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1102
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1103 memset_float(tctx->bark_hist[0][0], 0.1, FF_ARRAY_ELEMS(tctx->bark_hist));
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1104
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1105 return 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1106 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1107
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1108 static av_cold int twin_decode_close(AVCodecContext *avctx)
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1109 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1110 TwinContext *tctx = avctx->priv_data;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1111 int i;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1112
10108
eb28ab65409c Formatting K&R fixes
vitor
parents: 10106
diff changeset
1113 for (i = 0; i < 3; i++) {
10075
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1114 ff_mdct_end(&tctx->mdct_ctx[i]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1115 av_free(tctx->cos_tabs[i]);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1116 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1117
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1118
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1119 av_free(tctx->curr_frame);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1120 av_free(tctx->spectrum);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1121 av_free(tctx->prev_frame);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1122 av_free(tctx->tmp_buf);
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1123
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1124 return 0;
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1125 }
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1126
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1127 AVCodec twinvq_decoder =
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1128 {
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1129 "twinvq",
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1130 CODEC_TYPE_AUDIO,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1131 CODEC_ID_TWINVQ,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1132 sizeof(TwinContext),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1133 twin_decode_init,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1134 NULL,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1135 twin_decode_close,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1136 twin_decode_frame,
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1137 .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
e944ff8f487a TwinVQ decoder
vitor
parents:
diff changeset
1138 };