2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 ** GNU General Public License for more details.
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 ** Any non-GPL usage of this software or parts of this software is strictly
22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25 ** $Id: ic_predict.c,v 1.23 2004/09/04 14:56:28 menno Exp $
34 #include "ic_predict.h"
38 static void flt_round(float32_t
*pf
)
41 uint32_t tmp
, tmp1
, tmp2
;
44 flg
= tmp
& (uint32_t)0x00008000;
45 tmp
&= (uint32_t)0xffff0000;
47 /* round 1/2 lsb toward infinity */
50 tmp
&= (uint32_t)0xff800000; /* extract exponent and sign */
51 tmp
|= (uint32_t)0x00010000; /* insert 1 lsb */
52 tmp2
= tmp
; /* add 1 lsb and elided one */
53 tmp
&= (uint32_t)0xff800000; /* extract exponent and sign */
55 *pf
= *(float32_t
*)&tmp1
+ *(float32_t
*)&tmp2
- *(float32_t
*)&tmp
;
57 *pf
= *(float32_t
*)&tmp
;
61 static int16_t quant_pred(float32_t x
)
64 uint32_t *tmp
= (uint32_t*)&x
;
66 q
= (int16_t)(*tmp
>>16);
71 static float32_t
inv_quant_pred(int16_t q
)
74 uint32_t *tmp
= (uint32_t*)&x
;
75 *tmp
= ((uint32_t)q
)<<16;
80 static void ic_predict(pred_state
*state
, real_t input
, real_t
*output
, uint8_t pred
)
84 real_t dr1
, predictedvalue
;
92 r
[0] = inv_quant_pred(state
->r
[0]);
93 r
[1] = inv_quant_pred(state
->r
[1]);
94 COR
[0] = inv_quant_pred(state
->COR
[0]);
95 COR
[1] = inv_quant_pred(state
->COR
[1]);
96 VAR
[0] = inv_quant_pred(state
->VAR
[0]);
97 VAR
[1] = inv_quant_pred(state
->VAR
[1]);
107 k1
= COR
[0] * exp_table
[j
] * mnt_table
[i
];
118 if (c
== 0 || v
<= 1)
138 k2
= COR
[1] * exp_table
[j
] * mnt_table
[i
];
148 if (c
== 0 || v
<= 1)
158 predictedvalue
= k1
*r
[0] + k2
*r
[1];
159 flt_round(&predictedvalue
);
160 *output
= input
+ predictedvalue
;
163 /* calculate new state data */
168 VAR
[0] = ALPHA
*VAR
[0] + 0.5f
* (r
[0]*r
[0] + e0
*e0
);
169 COR
[0] = ALPHA
*COR
[0] + r
[0]*e0
;
170 VAR
[1] = ALPHA
*VAR
[1] + 0.5f
* (r
[1]*r
[1] + e1
*e1
);
171 COR
[1] = ALPHA
*COR
[1] + r
[1]*e1
;
173 r
[1] = A
* (r
[0]-dr1
);
176 state
->r
[0] = quant_pred(r
[0]);
177 state
->r
[1] = quant_pred(r
[1]);
178 state
->COR
[0] = quant_pred(COR
[0]);
179 state
->COR
[1] = quant_pred(COR
[1]);
180 state
->VAR
[0] = quant_pred(VAR
[0]);
181 state
->VAR
[1] = quant_pred(VAR
[1]);
184 static void reset_pred_state(pred_state
*state
)
190 state
->VAR
[0] = 0x3F80;
191 state
->VAR
[1] = 0x3F80;
194 void pns_reset_pred_state(ic_stream
*ics
, pred_state
*state
)
197 uint16_t i
, offs
, offs2
;
199 /* prediction only for long blocks */
200 if (ics
->window_sequence
== EIGHT_SHORT_SEQUENCE
)
203 for (g
= 0; g
< ics
->num_window_groups
; g
++)
205 for (b
= 0; b
< ics
->window_group_length
[g
]; b
++)
207 for (sfb
= 0; sfb
< ics
->max_sfb
; sfb
++)
209 if (is_noise(ics
, g
, sfb
))
211 offs
= ics
->swb_offset
[sfb
];
212 offs2
= ics
->swb_offset
[sfb
+1];
214 for (i
= offs
; i
< offs2
; i
++)
215 reset_pred_state(&state
[i
]);
222 void reset_all_predictors(pred_state
*state
, uint16_t frame_len
)
226 for (i
= 0; i
< frame_len
; i
++)
227 reset_pred_state(&state
[i
]);
230 /* intra channel prediction */
231 void ic_prediction(ic_stream
*ics
, real_t
*spec
, pred_state
*state
,
232 uint16_t frame_len
, uint8_t sf_index
)
237 if (ics
->window_sequence
== EIGHT_SHORT_SEQUENCE
)
239 reset_all_predictors(state
, frame_len
);
241 for (sfb
= 0; sfb
< max_pred_sfb(sf_index
); sfb
++)
243 uint16_t low
= ics
->swb_offset
[sfb
];
244 uint16_t high
= ics
->swb_offset
[sfb
+1];
246 for (bin
= low
; bin
< high
; bin
++)
248 ic_predict(&state
[bin
], spec
[bin
], &spec
[bin
],
249 (ics
->predictor_data_present
&& ics
->pred
.prediction_used
[sfb
]));
253 if (ics
->predictor_data_present
)
255 if (ics
->pred
.predictor_reset
)
257 for (bin
= ics
->pred
.predictor_reset_group_number
- 1;
258 bin
< frame_len
; bin
+= 30)
260 reset_pred_state(&state
[bin
]);