annotate twinvq.c @ 11352:6e0af2cfdcfe libavcodec

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