annotate libfaad2/ic_predict.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents 59b6fa5b4201
children e83eef58b30a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
1 /*
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
4 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
8 ** (at your option) any later version.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
9 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
13 ** GNU General Public License for more details.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
14 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
16 ** along with this program; if not, write to the Free Software
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
18 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
20 ** forbidden.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
21 **
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
24 **
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
25 ** $Id: ic_predict.c,v 1.23 2004/09/04 14:56:28 menno Exp $
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
26 **/
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
27
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
28 #include "common.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
29 #include "structs.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
30
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
31 #ifdef MAIN_DEC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
32
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
33 #include "syntax.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
34 #include "ic_predict.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
35 #include "pns.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
36
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
37
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
38 static void flt_round(float32_t *pf)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
39 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
40 int32_t flg;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
41 uint32_t tmp, tmp1, tmp2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
42
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
43 tmp = *(uint32_t*)pf;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
44 flg = tmp & (uint32_t)0x00008000;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
45 tmp &= (uint32_t)0xffff0000;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
46 tmp1 = tmp;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
47 /* round 1/2 lsb toward infinity */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
48 if (flg)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
49 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
50 tmp &= (uint32_t)0xff800000; /* extract exponent and sign */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
51 tmp |= (uint32_t)0x00010000; /* insert 1 lsb */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
52 tmp2 = tmp; /* add 1 lsb and elided one */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
53 tmp &= (uint32_t)0xff800000; /* extract exponent and sign */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
54
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
55 *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
56 } else {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
57 *pf = *(float32_t*)&tmp;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
58 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
59 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
60
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
61 static int16_t quant_pred(float32_t x)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
62 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
63 int16_t q;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
64 uint32_t *tmp = (uint32_t*)&x;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
65
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
66 q = (int16_t)(*tmp>>16);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
67
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
68 return q;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
69 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
70
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
71 static float32_t inv_quant_pred(int16_t q)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
72 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
73 float32_t x;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
74 uint32_t *tmp = (uint32_t*)&x;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
75 *tmp = ((uint32_t)q)<<16;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
76
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
77 return x;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
78 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
79
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
80 static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
81 {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
82 uint16_t tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
83 int16_t i, j;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
84 real_t dr1, predictedvalue;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
85 real_t e0, e1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
86 real_t k1, k2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
87
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
88 real_t r[2];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
89 real_t COR[2];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
90 real_t VAR[2];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
91
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
92 r[0] = inv_quant_pred(state->r[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
93 r[1] = inv_quant_pred(state->r[1]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
94 COR[0] = inv_quant_pred(state->COR[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
95 COR[1] = inv_quant_pred(state->COR[1]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
96 VAR[0] = inv_quant_pred(state->VAR[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
97 VAR[1] = inv_quant_pred(state->VAR[1]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
98
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
99
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
100 #if 1
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
101 tmp = state->VAR[0];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
102 j = (tmp >> 7);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
103 i = tmp & 0x7f;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
104 if (j >= 128)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
105 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
106 j -= 128;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
107 k1 = COR[0] * exp_table[j] * mnt_table[i];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
108 } else {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
109 k1 = REAL_CONST(0);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
110 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
111 #else
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
112
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
113 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
114 #define B 0.953125
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
115 real_t c = COR[0];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
116 real_t v = VAR[0];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
117 real_t tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
118 if (c == 0 || v <= 1)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
119 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
120 k1 = 0;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
121 } else {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
122 tmp = B / v;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
123 flt_round(&tmp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
124 k1 = c * tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
125 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
126 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
127 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
128
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
129 if (pred)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
130 {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
131 #if 1
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
132 tmp = state->VAR[1];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
133 j = (tmp >> 7);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
134 i = tmp & 0x7f;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
135 if (j >= 128)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
136 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
137 j -= 128;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
138 k2 = COR[1] * exp_table[j] * mnt_table[i];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
139 } else {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
140 k2 = REAL_CONST(0);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
141 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
142 #else
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
143
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
144 #define B 0.953125
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
145 real_t c = COR[1];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
146 real_t v = VAR[1];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
147 real_t tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
148 if (c == 0 || v <= 1)
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
149 {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
150 k2 = 0;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
151 } else {
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
152 tmp = B / v;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
153 flt_round(&tmp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
154 k2 = c * tmp;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
155 }
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
156 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
157
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
158 predictedvalue = k1*r[0] + k2*r[1];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
159 flt_round(&predictedvalue);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
160 *output = input + predictedvalue;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
161 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
162
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
163 /* calculate new state data */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
164 e0 = *output;
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
165 e1 = e0 - k1*r[0];
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
166 dr1 = k1*e0;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
167
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
168 VAR[0] = ALPHA*VAR[0] + 0.5f * (r[0]*r[0] + e0*e0);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
169 COR[0] = ALPHA*COR[0] + r[0]*e0;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
170 VAR[1] = ALPHA*VAR[1] + 0.5f * (r[1]*r[1] + e1*e1);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
171 COR[1] = ALPHA*COR[1] + r[1]*e1;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
172
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
173 r[1] = A * (r[0]-dr1);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
174 r[0] = A * e0;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
175
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
176 state->r[0] = quant_pred(r[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
177 state->r[1] = quant_pred(r[1]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
178 state->COR[0] = quant_pred(COR[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
179 state->COR[1] = quant_pred(COR[1]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
180 state->VAR[0] = quant_pred(VAR[0]);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
181 state->VAR[1] = quant_pred(VAR[1]);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
182 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
183
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
184 static void reset_pred_state(pred_state *state)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
185 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
186 state->r[0] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
187 state->r[1] = 0;
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
188 state->COR[0] = 0;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
189 state->COR[1] = 0;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
190 state->VAR[0] = 0x3F80;
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
191 state->VAR[1] = 0x3F80;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
192 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
193
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
194 void pns_reset_pred_state(ic_stream *ics, pred_state *state)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
195 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
196 uint8_t sfb, g, b;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
197 uint16_t i, offs, offs2;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
198
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
199 /* prediction only for long blocks */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
200 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
201 return;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
202
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
203 for (g = 0; g < ics->num_window_groups; g++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
204 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
205 for (b = 0; b < ics->window_group_length[g]; b++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
206 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
207 for (sfb = 0; sfb < ics->max_sfb; sfb++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
208 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
209 if (is_noise(ics, g, sfb))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
210 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
211 offs = ics->swb_offset[sfb];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
212 offs2 = ics->swb_offset[sfb+1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
213
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
214 for (i = offs; i < offs2; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
215 reset_pred_state(&state[i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
216 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
217 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
218 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
219 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
220 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
221
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
222 void reset_all_predictors(pred_state *state, uint16_t frame_len)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
223 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
224 uint16_t i;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
225
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
226 for (i = 0; i < frame_len; i++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
227 reset_pred_state(&state[i]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
228 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
229
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
230 /* intra channel prediction */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
231 void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state,
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
232 uint16_t frame_len, uint8_t sf_index)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
233 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
234 uint8_t sfb;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
235 uint16_t bin;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
236
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
237 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
238 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
239 reset_all_predictors(state, frame_len);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
240 } else {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
241 for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++)
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
242 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
243 uint16_t low = ics->swb_offset[sfb];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
244 uint16_t high = ics->swb_offset[sfb+1];
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
245
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
246 for (bin = low; bin < high; bin++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
247 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
248 ic_predict(&state[bin], spec[bin], &spec[bin],
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10725
diff changeset
249 (ics->predictor_data_present && ics->pred.prediction_used[sfb]));
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
250 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
251 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
252
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
253 if (ics->predictor_data_present)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
254 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
255 if (ics->pred.predictor_reset)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
256 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
257 for (bin = ics->pred.predictor_reset_group_number - 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
258 bin < frame_len; bin += 30)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
259 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
260 reset_pred_state(&state[bin]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
261 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
262 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
263 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
264 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
265 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
266
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
267 #endif