annotate Plugins/Input/aac/libfaad2/specrec.c @ 61:fa848bd484d8 trunk

[svn] Move plugins to Plugins/
author nenolod
date Fri, 28 Oct 2005 22:58:11 -0700
parents
children 0a2ad94e8607
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 ** (at your option) any later version.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13 ** GNU General Public License for more details.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
14 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16 ** along with this program; if not, write to the Free Software
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
18 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20 ** forbidden.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24 **
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25 ** $Id: specrec.c,v 1.33 2003/11/12 20:47:59 menno Exp $
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 **/
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29 Spectral reconstruction:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
30 - grouping/sectioning
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31 - inverse quantization
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32 - applying scalefactors
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35 #include "common.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36 #include "structs.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38 #include <string.h>
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
39 #include "specrec.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
40 #include "syntax.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
41 #include "iq_table.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 #include "ms.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43 #include "is.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 #include "pns.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45 #include "tns.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 #include "lt_predict.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47 #include "ic_predict.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48 #ifdef SSR_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 #include "ssr.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 #include "ssr_fb.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
53 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
54 static uint8_t num_swb_512_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
55 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
56 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
57 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
58 static uint8_t num_swb_480_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64 static uint8_t num_swb_960_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 static uint8_t num_swb_1024_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 static uint8_t num_swb_128_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79 static uint16_t swb_offset_1024_96[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 static uint16_t swb_offset_128_96[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
89 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
90
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
91 static uint16_t swb_offset_1024_64[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
93 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
94 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
95 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
96 864, 904, 944, 984, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99 static uint16_t swb_offset_128_64[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
101 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
104
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
105 static uint16_t swb_offset_1024_48[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110 768, 800, 832, 864, 896, 928, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114 static uint16_t swb_offset_512_48[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 428, 460, 512
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
120
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
121 static uint16_t swb_offset_480_48[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 432, 480
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 static uint16_t swb_offset_128_48[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
133
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
134 static uint16_t swb_offset_1024_32[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
136 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
137 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 768, 800, 832, 864, 896, 928, 960, 992, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143 static uint16_t swb_offset_512_32[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 384, 416, 448, 480, 512
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
148 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
149
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150 static uint16_t swb_offset_480_32[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
154 384, 416, 448, 480
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
155 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
156 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 static uint16_t swb_offset_1024_24[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 768, 832, 896, 960, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 static uint16_t swb_offset_512_24[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 448, 480, 512
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 static uint16_t swb_offset_480_24[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
178 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
179 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
180
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
181 static uint16_t swb_offset_128_24[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
186 static uint16_t swb_offset_1024_16[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
187 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
188 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
189 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
190 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
191 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
192
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
193 static uint16_t swb_offset_128_16[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
194 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
195 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
196 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
197
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
198 static uint16_t swb_offset_1024_8[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
199 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
200 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
201 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
202 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
203 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
204
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
205 static uint16_t swb_offset_128_8[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
206 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
207 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
208 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
209
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
210 static uint16_t *swb_offset_1024_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
211 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
212 swb_offset_1024_96, /* 96000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
213 swb_offset_1024_96, /* 88200 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
214 swb_offset_1024_64, /* 64000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
215 swb_offset_1024_48, /* 48000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
216 swb_offset_1024_48, /* 44100 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
217 swb_offset_1024_32, /* 32000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
218 swb_offset_1024_24, /* 24000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
219 swb_offset_1024_24, /* 22050 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
220 swb_offset_1024_16, /* 16000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
221 swb_offset_1024_16, /* 12000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
222 swb_offset_1024_16, /* 11025 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
223 swb_offset_1024_8 /* 8000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
224 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
225
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
226 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
227 static uint16_t *swb_offset_512_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
228 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
229 0, /* 96000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
230 0, /* 88200 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
231 0, /* 64000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
232 swb_offset_512_48, /* 48000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
233 swb_offset_512_48, /* 44100 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
234 swb_offset_512_32, /* 32000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
235 swb_offset_512_24, /* 24000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
236 swb_offset_512_24, /* 22050 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
237 0, /* 16000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
238 0, /* 12000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
239 0, /* 11025 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
240 0 /* 8000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
241 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
242
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
243 static uint16_t *swb_offset_480_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
244 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
245 0, /* 96000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
246 0, /* 88200 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
247 0, /* 64000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
248 swb_offset_480_48, /* 48000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
249 swb_offset_480_48, /* 44100 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
250 swb_offset_480_32, /* 32000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
251 swb_offset_480_24, /* 24000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
252 swb_offset_480_24, /* 22050 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
253 0, /* 16000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
254 0, /* 12000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
255 0, /* 11025 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
256 0 /* 8000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
257 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
258 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
259
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
260 static uint16_t *swb_offset_128_window[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
261 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
262 swb_offset_128_96, /* 96000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
263 swb_offset_128_96, /* 88200 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
264 swb_offset_128_64, /* 64000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
265 swb_offset_128_48, /* 48000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
266 swb_offset_128_48, /* 44100 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
267 swb_offset_128_48, /* 32000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
268 swb_offset_128_24, /* 24000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
269 swb_offset_128_24, /* 22050 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
270 swb_offset_128_16, /* 16000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
271 swb_offset_128_16, /* 12000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
272 swb_offset_128_16, /* 11025 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
273 swb_offset_128_8 /* 8000 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
274 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
275
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
276 #define bit_set(A, B) ((A) & (1<<(B)))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
277
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
278 /* 4.5.2.3.4 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
279 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
280 - determine the number of windows in a window_sequence named num_windows
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
281 - determine the number of window_groups named num_window_groups
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
282 - determine the number of windows in each group named window_group_length[g]
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
283 - determine the total number of scalefactor window bands named num_swb for
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
284 the actual window type
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
285 - determine swb_offset[swb], the offset of the first coefficient in
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
286 scalefactor window band named swb of the window actually used
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
287 - determine sect_sfb_offset[g][section],the offset of the first coefficient
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
288 in section named section. This offset depends on window_sequence and
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
289 scale_factor_grouping and is needed to decode the spectral_data().
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
290 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
291 uint8_t window_grouping_info(faacDecHandle hDecoder, ic_stream *ics)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
292 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
293 uint8_t i, g;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
294
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
295 uint8_t sf_index = hDecoder->sf_index;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
296
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
297 switch (ics->window_sequence) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
298 case ONLY_LONG_SEQUENCE:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
299 case LONG_START_SEQUENCE:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
300 case LONG_STOP_SEQUENCE:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
301 ics->num_windows = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
302 ics->num_window_groups = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
303 ics->window_group_length[ics->num_window_groups-1] = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
304 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
305 if (hDecoder->object_type == LD)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
306 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
307 if (hDecoder->frameLength == 512)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
308 ics->num_swb = num_swb_512_window[sf_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
309 else /* if (hDecoder->frameLength == 480) */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
310 ics->num_swb = num_swb_480_window[sf_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
311 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
312 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
313 if (hDecoder->frameLength == 1024)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
314 ics->num_swb = num_swb_1024_window[sf_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
315 else /* if (hDecoder->frameLength == 960) */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
316 ics->num_swb = num_swb_960_window[sf_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
317 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
318 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
319 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
320
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
321 /* preparation of sect_sfb_offset for long blocks */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
322 /* also copy the last value! */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
323 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
324 if (hDecoder->object_type == LD)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
325 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
326 if (hDecoder->frameLength == 512)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
327 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
328 for (i = 0; i < ics->num_swb; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
329 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
330 ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
331 ics->swb_offset[i] = swb_offset_512_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
332 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
333 } else /* if (hDecoder->frameLength == 480) */ {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
334 for (i = 0; i < ics->num_swb; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
335 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
336 ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
337 ics->swb_offset[i] = swb_offset_480_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
338 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
339 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
340 ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
341 ics->swb_offset[ics->num_swb] = hDecoder->frameLength;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
342 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
343 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
344 for (i = 0; i < ics->num_swb; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
345 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
346 ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
347 ics->swb_offset[i] = swb_offset_1024_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
348 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
349 ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
350 ics->swb_offset[ics->num_swb] = hDecoder->frameLength;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
351 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
352 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
353 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
354 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
355 case EIGHT_SHORT_SEQUENCE:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
356 ics->num_windows = 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
357 ics->num_window_groups = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
358 ics->window_group_length[ics->num_window_groups-1] = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
359 ics->num_swb = num_swb_128_window[sf_index];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
360
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
361 for (i = 0; i < ics->num_swb; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
362 ics->swb_offset[i] = swb_offset_128_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
363 ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
364
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
365 for (i = 0; i < ics->num_windows-1; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
366 if (bit_set(ics->scale_factor_grouping, 6-i) == 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
367 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
368 ics->num_window_groups += 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
369 ics->window_group_length[ics->num_window_groups-1] = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
370 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
371 ics->window_group_length[ics->num_window_groups-1] += 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
372 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
373 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
374
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
375 /* preparation of sect_sfb_offset for short blocks */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
376 for (g = 0; g < ics->num_window_groups; g++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
377 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
378 uint16_t width;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
379 uint8_t sect_sfb = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
380 uint16_t offset = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
381
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
382 for (i = 0; i < ics->num_swb; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
383 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
384 if (i+1 == ics->num_swb)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
385 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
386 width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
387 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
388 width = swb_offset_128_window[sf_index][i+1] -
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
389 swb_offset_128_window[sf_index][i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
390 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
391 width *= ics->window_group_length[g];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
392 ics->sect_sfb_offset[g][sect_sfb++] = offset;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
393 offset += width;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
394 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
395 ics->sect_sfb_offset[g][sect_sfb] = offset;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
396 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
397 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
398 default:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
399 return 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
400 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
401 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
402
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
403 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
404 For ONLY_LONG_SEQUENCE windows (num_window_groups = 1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
405 window_group_length[0] = 1) the spectral data is in ascending spectral
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
406 order.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
407 For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
408 grouping in the following manner:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
409 - Groups are ordered sequentially
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
410 - Within a group, a scalefactor band consists of the spectral data of all
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
411 grouped SHORT_WINDOWs for the associated scalefactor window band. To
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
412 clarify via example, the length of a group is in the range of one to eight
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
413 SHORT_WINDOWs.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
414 - If there are eight groups each with length one (num_window_groups = 8,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
415 window_group_length[0..7] = 1), the result is a sequence of eight spectra,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
416 each in ascending spectral order.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
417 - If there is only one group with length eight (num_window_groups = 1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
418 window_group_length[0] = 8), the result is that spectral data of all eight
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
419 SHORT_WINDOWs is interleaved by scalefactor window bands.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
420 - Within a scalefactor window band, the coefficients are in ascending
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
421 spectral order.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
422 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
423 static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
424 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
425 uint8_t g, sfb, win;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
426 uint16_t width, bin, k, gindex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
427
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
428 real_t tmp_spec[1024] = {0};
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
429
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
430 k = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
431 gindex = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
432
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
433 for (g = 0; g < ics->num_window_groups; g++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
434 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
435 uint16_t j = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
436 uint16_t gincrease = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
437 uint16_t win_inc = ics->swb_offset[ics->num_swb];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
438
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
439 for (sfb = 0; sfb < ics->num_swb; sfb++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
440 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
441 width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
442
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
443 for (win = 0; win < ics->window_group_length[g]; win++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
444 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
445 for (bin = 0; bin < width; bin += 4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
446 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
447 tmp_spec[gindex+(win*win_inc)+j+bin+0] = spec_data[k+0];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
448 tmp_spec[gindex+(win*win_inc)+j+bin+1] = spec_data[k+1];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
449 tmp_spec[gindex+(win*win_inc)+j+bin+2] = spec_data[k+2];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
450 tmp_spec[gindex+(win*win_inc)+j+bin+3] = spec_data[k+3];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
451 gincrease += 4;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
452 k += 4;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
453 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
454 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
455 j += width;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
456 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
457 gindex += gincrease;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
458 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
459
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
460 memcpy(spec_data, tmp_spec, frame_len*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
461 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
462
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
463 #ifndef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
464 void build_tables(real_t *pow2_table)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
465 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
466 uint16_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
467
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
468 /* build pow(2, 0.25*x) table for scalefactors */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
469 for(i = 0; i < POW_TABLE_SIZE; i++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
470 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
471 pow2_table[i] = REAL_CONST(pow(2.0, 0.25 * (i-100)));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
472 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
473 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
474 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
475
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
476 static INLINE real_t iquant(int16_t q, real_t *tab)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
477 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
478 #ifdef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
479 static const real_t errcorr[] = {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
480 REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
481 REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
482 REAL_CONST(0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
483 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
484 real_t x1, x2;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
485 int16_t sgn = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
486
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
487 if (q < 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
488 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
489 q = -q;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
490 sgn = -1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
491 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
492
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
493 if (q < IQ_TABLE_SIZE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
494 return sgn * tab[q];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
495
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
496 /* linear interpolation */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
497 x1 = tab[q>>3];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
498 x2 = tab[(q>>3) + 1];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
499 return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
500 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
501 real_t sgn = REAL_CONST(1.0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
502
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
503 if (q < 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
504 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
505 q = -q;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
506 sgn = REAL_CONST(-1.0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
507 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
508
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
509 if (q < IQ_TABLE_SIZE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
510 return sgn * tab[q];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
511
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
512 return sgn * (real_t)pow(q, 4.0/3.0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
513 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
514 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
515
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
516 static void inverse_quantization(real_t *x_invquant, int16_t *x_quant, uint16_t frame_len)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
517 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
518 int16_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
519 real_t *tab = iq_table;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
520
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
521 for(i = 0; i < frame_len; i+=4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
522 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
523 x_invquant[i] = iquant(x_quant[i], tab);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
524 x_invquant[i+1] = iquant(x_quant[i+1], tab);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
525 x_invquant[i+2] = iquant(x_quant[i+2], tab);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
526 x_invquant[i+3] = iquant(x_quant[i+3], tab);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
527 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
528 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
529
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
530 #ifndef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
531 static INLINE real_t get_scale_factor_gain(uint16_t scale_factor, real_t *pow2_table)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
532 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
533 if (scale_factor < POW_TABLE_SIZE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
534 return pow2_table[scale_factor];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
535 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
536 return REAL_CONST(pow(2.0, 0.25 * (scale_factor - 100)));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
537 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
538 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
539 static real_t pow2_table[] =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
540 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
541 COEF_CONST(0.59460355750136053335874998528024), /* 2^-0.75 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
542 COEF_CONST(0.70710678118654752440084436210485), /* 2^-0.5 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
543 COEF_CONST(0.84089641525371454303112547623321), /* 2^-0.25 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
544 COEF_CONST(1.0),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
545 COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
546 COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
547 COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
548 };
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
549 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
550
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
551 static void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
552 real_t *x_invquant, uint16_t frame_len)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
553 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
554 uint8_t g, sfb;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
555 uint16_t top;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
556 #ifndef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
557 real_t scale;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
558 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
559 int32_t exp, frac;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
560 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
561 uint8_t groups = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
562 uint16_t nshort = frame_len/8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
563
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
564 for (g = 0; g < ics->num_window_groups; g++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
565 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
566 uint16_t k = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
567
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
568 /* using this nshort*groups doesn't hurt long blocks, because
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
569 long blocks only have 1 group, so that means 'groups' is
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
570 always 0 for long blocks
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
571 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
572 for (sfb = 0; sfb < ics->max_sfb; sfb++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
573 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
574 top = ics->sect_sfb_offset[g][sfb+1];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
575
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
576 #ifndef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
577 scale = get_scale_factor_gain(ics->scale_factors[g][sfb], hDecoder->pow2_table);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
578 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
579 exp = (ics->scale_factors[g][sfb] - 100) / 4;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
580 frac = (ics->scale_factors[g][sfb] - 100) % 4;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
581
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
582 /* IMDCT pre-scaling */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
583 if (hDecoder->object_type == LD)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
584 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
585 exp -= 6 /*9*/;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
586 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
587 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
588 exp -= 4 /*7*/;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
589 else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
590 exp -= 7 /*10*/;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
591 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
592 #if (REAL_BITS == 16)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
593 exp--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
594 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
595 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
596
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
597 /* minimum size of a sf band is 4 and always a multiple of 4 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
598 for ( ; k < top; k += 4)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
599 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
600 #ifndef FIXED_POINT
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
601 x_invquant[k+(groups*nshort)] = x_invquant[k+(groups*nshort)] * scale;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
602 x_invquant[k+(groups*nshort)+1] = x_invquant[k+(groups*nshort)+1] * scale;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
603 x_invquant[k+(groups*nshort)+2] = x_invquant[k+(groups*nshort)+2] * scale;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
604 x_invquant[k+(groups*nshort)+3] = x_invquant[k+(groups*nshort)+3] * scale;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
605 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
606 if (exp < 0)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
607 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
608 x_invquant[k+(groups*nshort)] >>= -exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
609 x_invquant[k+(groups*nshort)+1] >>= -exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
610 x_invquant[k+(groups*nshort)+2] >>= -exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
611 x_invquant[k+(groups*nshort)+3] >>= -exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
612 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
613 x_invquant[k+(groups*nshort)] <<= exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
614 x_invquant[k+(groups*nshort)+1] <<= exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
615 x_invquant[k+(groups*nshort)+2] <<= exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
616 x_invquant[k+(groups*nshort)+3] <<= exp;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
617 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
618
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
619 if (frac)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
620 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
621 x_invquant[k+(groups*nshort)] = MUL_C(x_invquant[k+(groups*nshort)],pow2_table[frac + 3]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
622 x_invquant[k+(groups*nshort)+1] = MUL_C(x_invquant[k+(groups*nshort)+1],pow2_table[frac + 3]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
623 x_invquant[k+(groups*nshort)+2] = MUL_C(x_invquant[k+(groups*nshort)+2],pow2_table[frac + 3]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
624 x_invquant[k+(groups*nshort)+3] = MUL_C(x_invquant[k+(groups*nshort)+3],pow2_table[frac + 3]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
625 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
626 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
627 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
628 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
629 groups += ics->window_group_length[g];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
630 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
631 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
632
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
633 void reconstruct_single_channel(faacDecHandle hDecoder, ic_stream *ics,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
634 element *sce, int16_t *spec_data)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
635 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
636 real_t spec_coef[1024];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
637
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
638 /* inverse quantization */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
639 inverse_quantization(spec_coef, spec_data, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
640
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
641 /* apply scalefactors */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
642 apply_scalefactors(hDecoder, ics, spec_coef, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
643
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
644 /* deinterleave short block grouping */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
645 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
646 quant_to_spec(ics, spec_coef, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
647
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
648
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
649 /* pns decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
650 pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
651
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
652 #ifdef MAIN_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
653 /* MAIN object type prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
654 if (hDecoder->object_type == MAIN)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
655 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
656 /* allocate the state only when needed */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
657 if (hDecoder->pred_stat[sce->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
658 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
659 hDecoder->pred_stat[sce->channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
660 reset_all_predictors(hDecoder->pred_stat[sce->channel], hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
661 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
662
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
663 /* intra channel prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
664 ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
665 hDecoder->sf_index);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
666
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
667 /* In addition, for scalefactor bands coded by perceptual
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
668 noise substitution the predictors belonging to the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
669 corresponding spectral coefficients are reset.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
670 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
671 pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
672 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
673 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
674
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
675 #ifdef LTP_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
676 if (is_ltp_ot(hDecoder->object_type))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
677 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
678 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
679 if (hDecoder->object_type == LD)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
680 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
681 if (ics->ltp.data_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
682 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
683 if (ics->ltp.lag_update)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
684 hDecoder->ltp_lag[sce->channel] = ics->ltp.lag;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
685 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
686 ics->ltp.lag = hDecoder->ltp_lag[sce->channel];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
687 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
688 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
689
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
690 /* allocate the state only when needed */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
691 if (hDecoder->lt_pred_stat[sce->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
692 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
693 hDecoder->lt_pred_stat[sce->channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
694 memset(hDecoder->lt_pred_stat[sce->channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
695 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
696
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
697 /* long term prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
698 lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
699 ics->window_shape, hDecoder->window_shape_prev[sce->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
700 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
701 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
702 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
703
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
704 /* tns decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
705 tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
706 spec_coef, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
707
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
708 /* drc decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
709 if (hDecoder->drc->present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
710 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
711 if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
712 drc_decode(hDecoder->drc, spec_coef);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
713 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
714
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
715 if (hDecoder->time_out[sce->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
716 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
717 hDecoder->time_out[sce->channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
718 memset(hDecoder->time_out[sce->channel], 0, hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
719 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
720
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
721 /* filter bank */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
722 #ifdef SSR_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
723 if (hDecoder->object_type != SSR)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
724 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
725 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
726 ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
727 hDecoder->window_shape_prev[sce->channel], spec_coef,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
728 hDecoder->time_out[sce->channel], hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
729 #ifdef SSR_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
730 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
731 if (hDecoder->ssr_overlap[sce->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
732 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
733 hDecoder->ssr_overlap[sce->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
734 memset(hDecoder->ssr_overlap[sce->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
735 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
736 if (hDecoder->prev_fmd[sce->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
737 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
738 uint16_t k;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
739 hDecoder->prev_fmd[sce->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
740 for (k = 0; k < 2*hDecoder->frameLength; k++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
741 hDecoder->prev_fmd[sce->channel][k] = REAL_CONST(-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
742 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
743
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
744 ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
745 hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
746 hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
747 hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
748 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
749 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
750
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
751 /* save window shape for next frame */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
752 hDecoder->window_shape_prev[sce->channel] = ics->window_shape;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
753
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
754 #ifdef LTP_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
755 if (is_ltp_ot(hDecoder->object_type))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
756 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
757 lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
758 hDecoder->time_out[sce->channel]+hDecoder->frameLength, hDecoder->frameLength, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
759 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
760 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
761 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
762
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
763 void reconstruct_channel_pair(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
764 element *cpe, int16_t *spec_data1, int16_t *spec_data2)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
765 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
766 real_t spec_coef1[1024];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
767 real_t spec_coef2[1024];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
768
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
769 /* inverse quantization */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
770 inverse_quantization(spec_coef1, spec_data1, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
771 inverse_quantization(spec_coef2, spec_data2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
772
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
773 /* apply scalefactors */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
774 apply_scalefactors(hDecoder, ics1, spec_coef1, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
775 apply_scalefactors(hDecoder, ics2, spec_coef2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
776
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
777 /* deinterleave short block grouping */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
778 if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
779 quant_to_spec(ics1, spec_coef1, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
780 if (ics2->window_sequence == EIGHT_SHORT_SEQUENCE)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
781 quant_to_spec(ics2, spec_coef2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
782
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
783
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
784 /* pns decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
785 if (ics1->ms_mask_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
786 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
787 pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
788 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
789 pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
790 pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
791 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
792
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
793 /* mid/side decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
794 ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
795
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
796 /* intensity stereo decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
797 is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
798
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
799 #ifdef MAIN_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
800 /* MAIN object type prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
801 if (hDecoder->object_type == MAIN)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
802 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
803 /* allocate the state only when needed */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
804 if (hDecoder->pred_stat[cpe->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
805 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
806 hDecoder->pred_stat[cpe->channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
807 reset_all_predictors(hDecoder->pred_stat[cpe->channel], hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
808 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
809 if (hDecoder->pred_stat[cpe->paired_channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
810 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
811 hDecoder->pred_stat[cpe->paired_channel] = (pred_state*)malloc(hDecoder->frameLength * sizeof(pred_state));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
812 reset_all_predictors(hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
813 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
814
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
815 /* intra channel prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
816 ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
817 hDecoder->sf_index);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
818 ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
819 hDecoder->sf_index);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
820
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
821 /* In addition, for scalefactor bands coded by perceptual
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
822 noise substitution the predictors belonging to the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
823 corresponding spectral coefficients are reset.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
824 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
825 pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
826 pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
827 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
828 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
829
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
830 #ifdef LTP_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
831 if (is_ltp_ot(hDecoder->object_type))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
832 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
833 ltp_info *ltp1 = &(ics1->ltp);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
834 ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp) ;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
835 #ifdef LD_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
836 if (hDecoder->object_type == LD)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
837 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
838 if (ltp1->data_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
839 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
840 if (ltp1->lag_update)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
841 hDecoder->ltp_lag[cpe->channel] = ltp1->lag;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
842 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
843 ltp1->lag = hDecoder->ltp_lag[cpe->channel];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
844 if (ltp2->data_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
845 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
846 if (ltp2->lag_update)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
847 hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
848 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
849 ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
850 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
851 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
852
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
853 /* allocate the state only when needed */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
854 if (hDecoder->lt_pred_stat[cpe->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
855 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
856 hDecoder->lt_pred_stat[cpe->channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
857 memset(hDecoder->lt_pred_stat[cpe->channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
858 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
859 if (hDecoder->lt_pred_stat[cpe->paired_channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
860 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
861 hDecoder->lt_pred_stat[cpe->paired_channel] = (int16_t*)malloc(hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
862 memset(hDecoder->lt_pred_stat[cpe->paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
863 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
864
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
865 /* long term prediction */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
866 lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
867 ics1->window_shape, hDecoder->window_shape_prev[cpe->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
868 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
869 lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
870 ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
871 hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
872 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
873 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
874
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
875 /* tns decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
876 tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
877 spec_coef1, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
878 tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
879 spec_coef2, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
880
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
881 /* drc decoding */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
882 if (hDecoder->drc->present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
883 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
884 if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
885 drc_decode(hDecoder->drc, spec_coef1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
886 if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
887 drc_decode(hDecoder->drc, spec_coef2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
888 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
889
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
890 if (hDecoder->time_out[cpe->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
891 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
892 hDecoder->time_out[cpe->channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
893 memset(hDecoder->time_out[cpe->channel], 0, hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
894 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
895 if (hDecoder->time_out[cpe->paired_channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
896 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
897 hDecoder->time_out[cpe->paired_channel] = (real_t*)malloc(hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
898 memset(hDecoder->time_out[cpe->paired_channel], 0, hDecoder->frameLength*2*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
899 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
900
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
901 /* filter bank */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
902 #ifdef SSR_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
903 if (hDecoder->object_type != SSR)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
904 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
905 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
906 ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
907 hDecoder->window_shape_prev[cpe->channel], spec_coef1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
908 hDecoder->time_out[cpe->channel], hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
909 ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
910 hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
911 hDecoder->time_out[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
912 #ifdef SSR_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
913 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
914 if (hDecoder->ssr_overlap[cpe->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
915 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
916 hDecoder->ssr_overlap[cpe->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
917 memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
918 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
919 if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
920 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
921 hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
922 memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
923 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
924 if (hDecoder->prev_fmd[cpe->channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
925 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
926 uint16_t k;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
927 hDecoder->prev_fmd[cpe->channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
928 for (k = 0; k < 2*hDecoder->frameLength; k++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
929 hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
930 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
931 if (hDecoder->prev_fmd[cpe->paired_channel] == NULL)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
932 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
933 uint16_t k;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
934 hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)malloc(2*hDecoder->frameLength*sizeof(real_t));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
935 for (k = 0; k < 2*hDecoder->frameLength; k++)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
936 hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
937 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
938
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
939 ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
940 hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
941 hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
942 hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
943 ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
944 hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
945 hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
946 hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
947 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
948 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
949
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
950 /* save window shape for next frame */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
951 hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
952 hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
953
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
954 #ifdef LTP_DEC
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
955 if (is_ltp_ot(hDecoder->object_type))
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
956 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
957 lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
958 hDecoder->time_out[cpe->channel]+hDecoder->frameLength, hDecoder->frameLength, hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
959 lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel],
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
960 hDecoder->time_out[cpe->paired_channel]+hDecoder->frameLength, hDecoder->frameLength,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
961 hDecoder->object_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
962 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
963 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
964 }