annotate libfaad2/rvlc.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +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: 10989
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: rvlc.c,v 1.17 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 /* RVLC scalefactor decoding
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
29 *
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
30 * RVLC works like this:
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
31 * 1. Only symmetric huffman codewords are used
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
32 * 2. Total length of the scalefactor data is stored in the bitsream
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
33 * 3. Scalefactors are DPCM coded
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
34 * 4. Next to the starting value for DPCM the ending value is also stored
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
35 *
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
36 * With all this it is possible to read the scalefactor data from 2 sides.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
37 * If there is a bit error in the scalefactor data it is possible to start
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
38 * decoding from the other end of the data, to find all but 1 scalefactor.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
39 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
40
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
41 #include "common.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
42 #include "structs.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
43
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
44 #include <stdlib.h>
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
45
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
46 #include "syntax.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
47 #include "bits.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
48 #include "rvlc.h"
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
49
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
50
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
51 #ifdef ERROR_RESILIENCE
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
52
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
53 //#define PRINT_RVLC
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: 10989
diff changeset
55 /* static function declarations */
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
56 static uint8_t rvlc_decode_sf_forward(ic_stream *ics,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
57 bitfile *ld_sf,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
58 bitfile *ld_esc,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
59 uint8_t *is_used);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
60 #if 0
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
61 static uint8_t rvlc_decode_sf_reverse(ic_stream *ics,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
62 bitfile *ld_sf,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
63 bitfile *ld_esc,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
64 uint8_t is_used);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
65 #endif
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
66 static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc,
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
67 int8_t direction);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
68 static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
69
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
70
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
71 uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
72 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
73 uint8_t bits = 9;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
74
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
75 ics->sf_concealment = faad_get1bit(ld
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
76 DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment"));
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
77 ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
78 DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
79
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
80 if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
81 bits = 11;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
82
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
83 /* the number of bits used for the huffman codewords */
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
84 ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
85 DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
86
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
87 if (ics->noise_used)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
88 {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
89 ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
90 DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
91
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
92 ics->length_of_rvlc_sf -= 9;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
93 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
94
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
95 ics->sf_escapes_present = faad_get1bit(ld
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
96 DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
97
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
98 if (ics->sf_escapes_present)
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: 10989
diff changeset
100 ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
101 DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
102 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
103
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
104 if (ics->noise_used)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
105 {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
106 ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
107 DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
108 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
109
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
110 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
111 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
112
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
113 uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
114 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
115 uint8_t result;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
116 uint8_t intensity_used = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
117 uint8_t *rvlc_sf_buffer = NULL;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
118 uint8_t *rvlc_esc_buffer = NULL;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
119 bitfile ld_rvlc_sf, ld_rvlc_esc;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
120 // bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
121
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
122 if (ics->length_of_rvlc_sf > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
123 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
124 /* We read length_of_rvlc_sf bits here to put it in a
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
125 seperate bitfile.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
126 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
127 rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
128 DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
129
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
130 faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
131 // faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
132 // ics->length_of_rvlc_sf);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
133 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
134
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
135 if (ics->sf_escapes_present)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
136 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
137 /* We read length_of_rvlc_escapes bits here to put it in a
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
138 seperate bitfile.
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
139 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
140 rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
141 DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes"));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
142
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
143 faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
144 // faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
145 // ics->length_of_rvlc_escapes);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
146 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
147
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
148 /* decode the rvlc scale factors and escapes */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
149 result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
150 &ld_rvlc_esc, &intensity_used);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
151 // result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
152 // &ld_rvlc_esc_rev, intensity_used);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
153
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
154
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
155 if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
156 if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer);
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
157
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
158 if (ics->length_of_rvlc_sf > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
159 faad_endbits(&ld_rvlc_sf);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
160 if (ics->sf_escapes_present)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
161 faad_endbits(&ld_rvlc_esc);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
162
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
163 return result;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
164 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
165
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
166 static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
167 uint8_t *intensity_used)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
168 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
169 int8_t g, sfb;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
170 int8_t t = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
171 int8_t error = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
172 int8_t noise_pcm_flag = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
173
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
174 int16_t scale_factor = ics->global_gain;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
175 int16_t is_position = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
176 int16_t noise_energy = ics->global_gain - 90 - 256;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
177
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
178 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
179 printf("\nglobal_gain: %d\n", ics->global_gain);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
180 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
181
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
182 for (g = 0; g < ics->num_window_groups; g++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
183 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
184 for (sfb = 0; sfb < ics->max_sfb; sfb++)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
185 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
186 if (error)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
187 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
188 ics->scale_factors[g][sfb] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
189 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
190 switch (ics->sfb_cb[g][sfb])
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
191 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
192 case ZERO_HCB: /* zero book */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
193 ics->scale_factors[g][sfb] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
194 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
195 case INTENSITY_HCB: /* intensity books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
196 case INTENSITY_HCB2:
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
197
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
198 *intensity_used = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
199
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
200 /* decode intensity position */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
201 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
202
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
203 is_position += t;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
204 ics->scale_factors[g][sfb] = is_position;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
205
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
206 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
207 case NOISE_HCB: /* noise books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
208
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
209 /* decode noise energy */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
210 if (noise_pcm_flag)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
211 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
212 int16_t n = ics->dpcm_noise_nrg;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
213 noise_pcm_flag = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
214 noise_energy += n;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
215 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
216 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
217 noise_energy += t;
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 ics->scale_factors[g][sfb] = noise_energy;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
221
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
222 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
223 default: /* spectral books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
224
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
225 /* decode scale factor */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
226 t = rvlc_huffman_sf(ld_sf, ld_esc, +1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
227
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
228 scale_factor += t;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
229 if (scale_factor < 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
230 return 4;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
231
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
232 ics->scale_factors[g][sfb] = scale_factor;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
233
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
234 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
235 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
236 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
237 printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb],
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
238 ics->scale_factors[g][sfb]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
239 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
240 if (t == 99)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
241 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
242 error = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
243 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
244 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
245 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
246 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
247 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
248 printf("\n\n");
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
249 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
250
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
251 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
252 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
253
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
254 #if 0 // not used right now, doesn't work correctly yet
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
255 static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
256 uint8_t intensity_used)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
257 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
258 int8_t g, sfb;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
259 int8_t t = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
260 int8_t error = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
261 int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
262
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
263 int16_t scale_factor = ics->rev_global_gain;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
264 int16_t is_position = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
265 int16_t noise_energy = ics->rev_global_gain;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
266
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
267 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
268 printf("\nrev_global_gain: %d\n", ics->rev_global_gain);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
269 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
270
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
271 if (intensity_used)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
272 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
273 is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
274 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
275 printf("is_position: %d\n", is_position);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
276 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
277 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
278
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
279 for (g = ics->num_window_groups-1; g >= 0; g--)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
280 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
281 for (sfb = ics->max_sfb-1; sfb >= 0; sfb--)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
282 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
283 if (error)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
284 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
285 ics->scale_factors[g][sfb] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
286 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
287 switch (ics->sfb_cb[g][sfb])
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
288 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
289 case ZERO_HCB: /* zero book */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
290 ics->scale_factors[g][sfb] = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
291 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
292 case INTENSITY_HCB: /* intensity books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
293 case INTENSITY_HCB2:
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
294
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
295 if (is_pcm_flag)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
296 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
297 is_pcm_flag = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
298 ics->scale_factors[g][sfb] = is_position;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
299 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
300 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
301 is_position -= t;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
302
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
303 ics->scale_factors[g][sfb] = (uint8_t)is_position;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
304 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
305 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
306 case NOISE_HCB: /* noise books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
307
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
308 /* decode noise energy */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
309 if (noise_pcm_flag)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
310 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
311 noise_pcm_flag = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
312 noise_energy = ics->dpcm_noise_last_position;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
313 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
314 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
315 noise_energy -= t;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
316 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
317
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
318 ics->scale_factors[g][sfb] = (uint8_t)noise_energy;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
319 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
320 default: /* spectral books */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
321
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
322 if (sf_pcm_flag || (sfb == 0))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
323 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
324 sf_pcm_flag = 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
325 if (sfb == 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
326 scale_factor = ics->global_gain;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
327 } else {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
328 /* decode scale factor */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
329 t = rvlc_huffman_sf(ld_sf, ld_esc, -1);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
330 scale_factor -= t;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
331 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
332
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
333 if (scale_factor < 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
334 return 4;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
335
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
336 ics->scale_factors[g][sfb] = (uint8_t)scale_factor;
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
337 break;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
338 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
339 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
340 printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb],
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
341 ics->scale_factors[g][sfb]);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
342 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
343 if (t == 99)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
344 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
345 error = 1;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
346 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
347 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
348 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
349 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
350
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
351 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
352 printf("\n\n");
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
353 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
354
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
355 return 0;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
356 }
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
357 #endif
10725
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
358
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
359 /* index == 99 means not allowed codeword */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
360 static rvlc_huff_table book_rvlc[] = {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
361 /*index length codeword */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
362 { 0, 1, 0 }, /* 0 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
363 { -1, 3, 5 }, /* 101 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
364 { 1, 3, 7 }, /* 111 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
365 { -2, 4, 9 }, /* 1001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
366 { -3, 5, 17 }, /* 10001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
367 { 2, 5, 27 }, /* 11011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
368 { -4, 6, 33 }, /* 100001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
369 { 99, 6, 50 }, /* 110010 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
370 { 3, 6, 51 }, /* 110011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
371 { 99, 6, 52 }, /* 110100 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
372 { -7, 7, 65 }, /* 1000001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
373 { 99, 7, 96 }, /* 1100000 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
374 { 99, 7, 98 }, /* 1100010 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
375 { 7, 7, 99 }, /* 1100011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
376 { 4, 7, 107 }, /* 1101011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
377 { -5, 8, 129 }, /* 10000001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
378 { 99, 8, 194 }, /* 11000010 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
379 { 5, 8, 195 }, /* 11000011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
380 { 99, 8, 212 }, /* 11010100 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
381 { 99, 9, 256 }, /* 100000000 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
382 { -6, 9, 257 }, /* 100000001 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
383 { 99, 9, 426 }, /* 110101010 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
384 { 6, 9, 427 }, /* 110101011 */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
385 { 99, 10, 0 } /* Shouldn't come this far */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
386 };
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
387
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
388 static rvlc_huff_table book_escape[] = {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
389 /*index length codeword */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
390 { 1, 2, 0 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
391 { 0, 2, 2 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
392 { 3, 3, 2 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
393 { 2, 3, 6 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
394 { 4, 4, 14 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
395 { 7, 5, 13 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
396 { 6, 5, 15 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
397 { 5, 5, 31 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
398 { 11, 6, 24 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
399 { 10, 6, 25 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
400 { 9, 6, 29 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
401 { 8, 6, 61 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
402 { 13, 7, 56 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
403 { 12, 7, 120 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
404 { 15, 8, 114 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
405 { 14, 8, 242 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
406 { 17, 9, 230 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
407 { 16, 9, 486 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
408 { 19, 10, 463 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
409 { 18, 10, 974 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
410 { 22, 11, 925 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
411 { 20, 11, 1950 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
412 { 21, 11, 1951 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
413 { 23, 12, 1848 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
414 { 25, 13, 3698 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
415 { 24, 14, 7399 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
416 { 26, 15, 14797 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
417 { 49, 19, 236736 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
418 { 50, 19, 236737 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
419 { 51, 19, 236738 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
420 { 52, 19, 236739 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
421 { 53, 19, 236740 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
422 { 27, 20, 473482 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
423 { 28, 20, 473483 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
424 { 29, 20, 473484 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
425 { 30, 20, 473485 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
426 { 31, 20, 473486 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
427 { 32, 20, 473487 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
428 { 33, 20, 473488 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
429 { 34, 20, 473489 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
430 { 35, 20, 473490 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
431 { 36, 20, 473491 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
432 { 37, 20, 473492 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
433 { 38, 20, 473493 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
434 { 39, 20, 473494 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
435 { 40, 20, 473495 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
436 { 41, 20, 473496 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
437 { 42, 20, 473497 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
438 { 43, 20, 473498 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
439 { 44, 20, 473499 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
440 { 45, 20, 473500 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
441 { 46, 20, 473501 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
442 { 47, 20, 473502 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
443 { 48, 20, 473503 },
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
444 { 99, 21, 0 } /* Shouldn't come this far */
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
445 };
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
446
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
447 static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
448 int8_t direction)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
449 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
450 uint8_t i, j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
451 int8_t index;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
452 uint32_t cw;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
453 rvlc_huff_table *h = book_rvlc;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
454
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
455 i = h->len;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
456 if (direction > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
457 cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
458 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
459 cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
460
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
461 while ((cw != h->cw)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
462 && (i < 10))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
463 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
464 h++;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
465 j = h->len-i;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
466 i += j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
467 cw <<= j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
468 if (direction > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
469 cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
470 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
471 cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
472 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
473
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
474 index = h->index;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
475
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
476 if (index == +ESC_VAL)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
477 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
478 int8_t esc = rvlc_huffman_esc(ld_esc, direction);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
479 if (esc == 99)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
480 return 99;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
481 index += esc;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
482 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
483 printf("esc: %d - ", esc);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
484 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
485 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
486 if (index == -ESC_VAL)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
487 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
488 int8_t esc = rvlc_huffman_esc(ld_esc, direction);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
489 if (esc == 99)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
490 return 99;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
491 index -= esc;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
492 #ifdef PRINT_RVLC
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
493 printf("esc: %d - ", esc);
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
494 #endif
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
495 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
496
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
497 return index;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
498 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
499
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
500 static int8_t rvlc_huffman_esc(bitfile *ld,
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
501 int8_t direction)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
502 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
503 uint8_t i, j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
504 uint32_t cw;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
505 rvlc_huff_table *h = book_escape;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
506
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
507 i = h->len;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
508 if (direction > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
509 cw = faad_getbits(ld, i DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
510 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
511 cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
512
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
513 while ((cw != h->cw)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
514 && (i < 21))
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
515 {
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
516 h++;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
517 j = h->len-i;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
518 i += j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
519 cw <<= j;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
520 if (direction > 0)
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
521 cw |= faad_getbits(ld, j DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
522 else
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
523 cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,""));
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
524 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
525
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
526 return h->index;
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
527 }
e989150f8216 libfaad2 v2.0rc1 imported
arpi
parents:
diff changeset
528
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
529 #endif
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
530