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: rvlc.c,v 1.17 2004/09/04 14:56:28 menno Exp $
28 /* RVLC scalefactor decoding
30 * RVLC works like this:
31 * 1. Only symmetric huffman codewords are used
32 * 2. Total length of the scalefactor data is stored in the bitsream
33 * 3. Scalefactors are DPCM coded
34 * 4. Next to the starting value for DPCM the ending value is also stored
36 * With all this it is possible to read the scalefactor data from 2 sides.
37 * If there is a bit error in the scalefactor data it is possible to start
38 * decoding from the other end of the data, to find all but 1 scalefactor.
51 #ifdef ERROR_RESILIENCE
55 /* static function declarations */
56 static uint8_t rvlc_decode_sf_forward(ic_stream
*ics
,
61 static uint8_t rvlc_decode_sf_reverse(ic_stream
*ics
,
66 static int8_t rvlc_huffman_sf(bitfile
*ld_sf
, bitfile
*ld_esc
,
68 static int8_t rvlc_huffman_esc(bitfile
*ld_esc
, int8_t direction
);
71 uint8_t rvlc_scale_factor_data(ic_stream
*ics
, bitfile
*ld
)
75 ics
->sf_concealment
= faad_get1bit(ld
76 DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment"));
77 ics
->rev_global_gain
= (uint8_t)faad_getbits(ld
, 8
78 DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain"));
80 if (ics
->window_sequence
== EIGHT_SHORT_SEQUENCE
)
83 /* the number of bits used for the huffman codewords */
84 ics
->length_of_rvlc_sf
= (uint16_t)faad_getbits(ld
, bits
85 DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf"));
89 ics
->dpcm_noise_nrg
= (uint16_t)faad_getbits(ld
, 9
90 DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg"));
92 ics
->length_of_rvlc_sf
-= 9;
95 ics
->sf_escapes_present
= faad_get1bit(ld
96 DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present"));
98 if (ics
->sf_escapes_present
)
100 ics
->length_of_rvlc_escapes
= (uint8_t)faad_getbits(ld
, 8
101 DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes"));
106 ics
->dpcm_noise_last_position
= (uint16_t)faad_getbits(ld
, 9
107 DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position"));
113 uint8_t rvlc_decode_scale_factors(ic_stream
*ics
, bitfile
*ld
)
116 uint8_t intensity_used
= 0;
117 uint8_t *rvlc_sf_buffer
= NULL
;
118 uint8_t *rvlc_esc_buffer
= NULL
;
119 bitfile ld_rvlc_sf
, ld_rvlc_esc
;
120 // bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev;
122 if (ics
->length_of_rvlc_sf
> 0)
124 /* We read length_of_rvlc_sf bits here to put it in a
127 rvlc_sf_buffer
= faad_getbitbuffer(ld
, ics
->length_of_rvlc_sf
128 DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf"));
130 faad_initbits(&ld_rvlc_sf
, (void*)rvlc_sf_buffer
, bit2byte(ics
->length_of_rvlc_sf
));
131 // faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer,
132 // ics->length_of_rvlc_sf);
135 if (ics
->sf_escapes_present
)
137 /* We read length_of_rvlc_escapes bits here to put it in a
140 rvlc_esc_buffer
= faad_getbitbuffer(ld
, ics
->length_of_rvlc_escapes
141 DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes"));
143 faad_initbits(&ld_rvlc_esc
, (void*)rvlc_esc_buffer
, bit2byte(ics
->length_of_rvlc_escapes
));
144 // faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer,
145 // ics->length_of_rvlc_escapes);
148 /* decode the rvlc scale factors and escapes */
149 result
= rvlc_decode_sf_forward(ics
, &ld_rvlc_sf
,
150 &ld_rvlc_esc
, &intensity_used
);
151 // result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev,
152 // &ld_rvlc_esc_rev, intensity_used);
155 if (rvlc_esc_buffer
) faad_free(rvlc_esc_buffer
);
156 if (rvlc_sf_buffer
) faad_free(rvlc_sf_buffer
);
158 if (ics
->length_of_rvlc_sf
> 0)
159 faad_endbits(&ld_rvlc_sf
);
160 if (ics
->sf_escapes_present
)
161 faad_endbits(&ld_rvlc_esc
);
166 static uint8_t rvlc_decode_sf_forward(ic_stream
*ics
, bitfile
*ld_sf
, bitfile
*ld_esc
,
167 uint8_t *intensity_used
)
172 int8_t noise_pcm_flag
= 1;
174 int16_t scale_factor
= ics
->global_gain
;
175 int16_t is_position
= 0;
176 int16_t noise_energy
= ics
->global_gain
- 90 - 256;
179 printf("\nglobal_gain: %d\n", ics
->global_gain
);
182 for (g
= 0; g
< ics
->num_window_groups
; g
++)
184 for (sfb
= 0; sfb
< ics
->max_sfb
; sfb
++)
188 ics
->scale_factors
[g
][sfb
] = 0;
190 switch (ics
->sfb_cb
[g
][sfb
])
192 case ZERO_HCB
: /* zero book */
193 ics
->scale_factors
[g
][sfb
] = 0;
195 case INTENSITY_HCB
: /* intensity books */
200 /* decode intensity position */
201 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, +1);
204 ics
->scale_factors
[g
][sfb
] = is_position
;
207 case NOISE_HCB
: /* noise books */
209 /* decode noise energy */
212 int16_t n
= ics
->dpcm_noise_nrg
;
216 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, +1);
220 ics
->scale_factors
[g
][sfb
] = noise_energy
;
223 default: /* spectral books */
225 /* decode scale factor */
226 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, +1);
229 if (scale_factor
< 0)
232 ics
->scale_factors
[g
][sfb
] = scale_factor
;
237 printf("%3d:%4d%4d\n", sfb
, ics
->sfb_cb
[g
][sfb
],
238 ics
->scale_factors
[g
][sfb
]);
254 #if 0 // not used right now, doesn't work correctly yet
255 static uint8_t rvlc_decode_sf_reverse(ic_stream
*ics
, bitfile
*ld_sf
, bitfile
*ld_esc
,
256 uint8_t intensity_used
)
261 int8_t noise_pcm_flag
= 1, is_pcm_flag
= 1, sf_pcm_flag
= 1;
263 int16_t scale_factor
= ics
->rev_global_gain
;
264 int16_t is_position
= 0;
265 int16_t noise_energy
= ics
->rev_global_gain
;
268 printf("\nrev_global_gain: %d\n", ics
->rev_global_gain
);
273 is_position
= rvlc_huffman_sf(ld_sf
, ld_esc
, -1);
275 printf("is_position: %d\n", is_position
);
279 for (g
= ics
->num_window_groups
-1; g
>= 0; g
--)
281 for (sfb
= ics
->max_sfb
-1; sfb
>= 0; sfb
--)
285 ics
->scale_factors
[g
][sfb
] = 0;
287 switch (ics
->sfb_cb
[g
][sfb
])
289 case ZERO_HCB
: /* zero book */
290 ics
->scale_factors
[g
][sfb
] = 0;
292 case INTENSITY_HCB
: /* intensity books */
298 ics
->scale_factors
[g
][sfb
] = is_position
;
300 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, -1);
303 ics
->scale_factors
[g
][sfb
] = (uint8_t)is_position
;
306 case NOISE_HCB
: /* noise books */
308 /* decode noise energy */
312 noise_energy
= ics
->dpcm_noise_last_position
;
314 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, -1);
318 ics
->scale_factors
[g
][sfb
] = (uint8_t)noise_energy
;
320 default: /* spectral books */
322 if (sf_pcm_flag
|| (sfb
== 0))
326 scale_factor
= ics
->global_gain
;
328 /* decode scale factor */
329 t
= rvlc_huffman_sf(ld_sf
, ld_esc
, -1);
333 if (scale_factor
< 0)
336 ics
->scale_factors
[g
][sfb
] = (uint8_t)scale_factor
;
340 printf("%3d:%4d%4d\n", sfb
, ics
->sfb_cb
[g
][sfb
],
341 ics
->scale_factors
[g
][sfb
]);
359 /* index == 99 means not allowed codeword */
360 static rvlc_huff_table book_rvlc
[] = {
361 /*index length codeword */
363 { -1, 3, 5 }, /* 101 */
364 { 1, 3, 7 }, /* 111 */
365 { -2, 4, 9 }, /* 1001 */
366 { -3, 5, 17 }, /* 10001 */
367 { 2, 5, 27 }, /* 11011 */
368 { -4, 6, 33 }, /* 100001 */
369 { 99, 6, 50 }, /* 110010 */
370 { 3, 6, 51 }, /* 110011 */
371 { 99, 6, 52 }, /* 110100 */
372 { -7, 7, 65 }, /* 1000001 */
373 { 99, 7, 96 }, /* 1100000 */
374 { 99, 7, 98 }, /* 1100010 */
375 { 7, 7, 99 }, /* 1100011 */
376 { 4, 7, 107 }, /* 1101011 */
377 { -5, 8, 129 }, /* 10000001 */
378 { 99, 8, 194 }, /* 11000010 */
379 { 5, 8, 195 }, /* 11000011 */
380 { 99, 8, 212 }, /* 11010100 */
381 { 99, 9, 256 }, /* 100000000 */
382 { -6, 9, 257 }, /* 100000001 */
383 { 99, 9, 426 }, /* 110101010 */
384 { 6, 9, 427 }, /* 110101011 */
385 { 99, 10, 0 } /* Shouldn't come this far */
388 static rvlc_huff_table book_escape
[] = {
389 /*index length codeword */
444 { 99, 21, 0 } /* Shouldn't come this far */
447 static int8_t rvlc_huffman_sf(bitfile
*ld_sf
, bitfile
*ld_esc
,
453 rvlc_huff_table
*h
= book_rvlc
;
457 cw
= faad_getbits(ld_sf
, i
DEBUGVAR(1,0,""));
459 cw
= faad_getbits_rev(ld_sf
, i
DEBUGVAR(1,0,""));
469 cw
|= faad_getbits(ld_sf
, j
DEBUGVAR(1,0,""));
471 cw
|= faad_getbits_rev(ld_sf
, j
DEBUGVAR(1,0,""));
476 if (index
== +ESC_VAL
)
478 int8_t esc
= rvlc_huffman_esc(ld_esc
, direction
);
483 printf("esc: %d - ", esc
);
486 if (index
== -ESC_VAL
)
488 int8_t esc
= rvlc_huffman_esc(ld_esc
, direction
);
493 printf("esc: %d - ", esc
);
500 static int8_t rvlc_huffman_esc(bitfile
*ld
,
505 rvlc_huff_table
*h
= book_escape
;
509 cw
= faad_getbits(ld
, i
DEBUGVAR(1,0,""));
511 cw
= faad_getbits_rev(ld
, i
DEBUGVAR(1,0,""));
521 cw
|= faad_getbits(ld
, j
DEBUGVAR(1,0,""));
523 cw
|= faad_getbits_rev(ld
, j
DEBUGVAR(1,0,""));