annotate libfaad2/huffman.c @ 24163:ca9f239aaeab

Extract a poor int declaration from within the uncouth grip of an if statement where it lay stranded in violation of both syntax and decency.
author diego
date Sat, 25 Aug 2007 16:15:46 +0000
parents 59b6fa5b4201
children e83eef58b30a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
1 /*
3185f64f6350 synced with current cvs
alex
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
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
4 **
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
8 ** (at your option) any later version.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
9 **
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
13 ** GNU General Public License for more details.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
14 **
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
16 ** along with this program; if not, write to the Free Software
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
18 **
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
20 ** forbidden.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
21 **
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
24 **
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
25 ** $Id: huffman.c,v 1.22 2004/09/04 14:56:28 menno Exp $
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
26 **/
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
27
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
28 #include "common.h"
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
29 #include "structs.h"
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
30
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
31 #include <stdlib.h>
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
32 #ifdef ANALYSIS
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
33 #include <stdio.h>
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
34 #endif
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
35
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
36 #include "bits.h"
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
37 #include "huffman.h"
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
38 #include "codebook/hcb.h"
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
39
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
40
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
41 /* static function declarations */
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
42 static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
43 static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
44 static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
45 static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
46 static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
47 static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
48 static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
49 static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
50 static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
51 static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp);
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
52 static int16_t huffman_codebook(uint8_t i);
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
53 static void vcb11_check_LAV(uint8_t cb, int16_t *sp);
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
54
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
55 int8_t huffman_scale_factor(bitfile *ld)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
56 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
57 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
58
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
59 while (hcb_sf[offset][1])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
60 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
61 uint8_t b = faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
62 DEBUGVAR(1,255,"huffman_scale_factor()"));
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
63 offset += hcb_sf[offset][b];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
64
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
65 if (offset > 240)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
66 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
67 /* printf("ERROR: offset into hcb_sf = %d >240!\n", offset); */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
68 return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
69 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
70 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
71
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
72 return hcb_sf[offset][0];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
73 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
74
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
75
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
76 hcb *hcb_table[] = {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
77 0, hcb1_1, hcb2_1, 0, hcb4_1, 0, hcb6_1, 0, hcb8_1, 0, hcb10_1, hcb11_1
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
78 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
79
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
80 hcb_2_quad *hcb_2_quad_table[] = {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
81 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
82 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
83
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
84 hcb_2_pair *hcb_2_pair_table[] = {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
85 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
86 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
87
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
88 hcb_bin_pair *hcb_bin_table[] = {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
89 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
90 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
91
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
92 uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
93
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
94 /* defines whether a huffman codebook is unsigned or not */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
95 /* Table 4.6.2 */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
96 uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
97 /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
98 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
99
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
100 int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
101 int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
102 int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 };
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
103
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
104 static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
105 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
106 uint8_t i;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
107
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
108 for (i = 0; i < len; i++)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
109 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
110 if(sp[i])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
111 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
112 if(faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
113 DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
114 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
115 sp[i] = -sp[i];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
116 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
117 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
118 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
119 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
120
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
121 static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
122 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
123 uint8_t neg, i;
13453
6d50ef45a058 Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents: 12625
diff changeset
124 int16_t j;
6d50ef45a058 Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents: 12625
diff changeset
125 int16_t off;
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
126
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
127 if (sp < 0)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
128 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
129 if (sp != -16)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
130 return sp;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
131 neg = 1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
132 } else {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
133 if (sp != 16)
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
134 return sp;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
135 neg = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
136 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
137
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
138 for (i = 4; ; i++)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
139 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
140 if (faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
141 DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
142 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
143 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
144 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
145 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
146
13453
6d50ef45a058 Update FAAD to a 2.1 beta CVS snapshot from 2004.07.12.
diego
parents: 12625
diff changeset
147 off = (int16_t)faad_getbits(ld, i
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
148 DEBUGVAR(1,9,"huffman_getescape(): escape"));
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
149
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
150 j = off | (1<<i);
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
151 if (neg)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
152 j = -j;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
153
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
154 return j;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
155 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
156
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
157 static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
158 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
159 uint32_t cw;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
160 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
161 uint8_t extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
162
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
163 cw = faad_showbits(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
164 offset = hcb_table[cb][cw].offset;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
165 extra_bits = hcb_table[cb][cw].extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
166
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
167 if (extra_bits)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
168 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
169 /* we know for sure it's more than hcbN[cb] bits long */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
170 faad_flushbits(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
171 offset += (uint16_t)faad_showbits(ld, extra_bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
172 faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
173 } else {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
174 faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
175 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
176
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
177 if (offset > hcb_2_quad_table_size[cb])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
178 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
179 /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
180 hcb_2_quad_table_size[cb]); */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
181 return 10;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
182 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
183
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
184 sp[0] = hcb_2_quad_table[cb][offset].x;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
185 sp[1] = hcb_2_quad_table[cb][offset].y;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
186 sp[2] = hcb_2_quad_table[cb][offset].v;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
187 sp[3] = hcb_2_quad_table[cb][offset].w;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
188
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
189 return 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
190 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
191
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
192 static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
193 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
194 uint8_t err = huffman_2step_quad(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
195 huffman_sign_bits(ld, sp, QUAD_LEN);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
196
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
197 return err;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
198 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
199
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
200 static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
201 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
202 uint32_t cw;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
203 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
204 uint8_t extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
205
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
206 cw = faad_showbits(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
207 offset = hcb_table[cb][cw].offset;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
208 extra_bits = hcb_table[cb][cw].extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
209
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
210 if (extra_bits)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
211 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
212 /* we know for sure it's more than hcbN[cb] bits long */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
213 faad_flushbits(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
214 offset += (uint16_t)faad_showbits(ld, extra_bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
215 faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
216 } else {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
217 faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
218 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
219
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
220 if (offset > hcb_2_pair_table_size[cb])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
221 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
222 /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
223 hcb_2_pair_table_size[cb]); */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
224 return 10;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
225 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
226
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
227 sp[0] = hcb_2_pair_table[cb][offset].x;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
228 sp[1] = hcb_2_pair_table[cb][offset].y;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
229
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
230 return 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
231 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
232
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
233 static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp)
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
234 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
235 uint8_t err = huffman_2step_pair(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
236 huffman_sign_bits(ld, sp, PAIR_LEN);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
237
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
238 return err;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
239 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
240
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
241 static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
242 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
243 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
244
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
245 while (!hcb3[offset].is_leaf)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
246 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
247 uint8_t b = faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
248 DEBUGVAR(1,255,"huffman_spectral_data():3"));
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
249 offset += hcb3[offset].data[b];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
250 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
251
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
252 if (offset > hcb_bin_table_size[cb])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
253 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
254 /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
255 hcb_bin_table_size[cb]); */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
256 return 10;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
257 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
258
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
259 sp[0] = hcb3[offset].data[0];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
260 sp[1] = hcb3[offset].data[1];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
261 sp[2] = hcb3[offset].data[2];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
262 sp[3] = hcb3[offset].data[3];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
263
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
264 return 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
265 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
266
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
267 static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
268 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
269 uint8_t err = huffman_binary_quad(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
270 huffman_sign_bits(ld, sp, QUAD_LEN);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
271
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
272 return err;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
273 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
274
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
275 static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
276 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
277 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
278
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
279 while (!hcb_bin_table[cb][offset].is_leaf)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
280 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
281 uint8_t b = faad_get1bit(ld
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
282 DEBUGVAR(1,255,"huffman_spectral_data():9"));
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
283 offset += hcb_bin_table[cb][offset].data[b];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
284 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
285
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
286 if (offset > hcb_bin_table_size[cb])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
287 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
288 /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset,
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
289 hcb_bin_table_size[cb]); */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
290 return 10;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
291 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
292
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
293 sp[0] = hcb_bin_table[cb][offset].data[0];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
294 sp[1] = hcb_bin_table[cb][offset].data[1];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
295
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
296 return 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
297 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
298
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
299 static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
300 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
301 uint8_t err = huffman_binary_pair(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
302 huffman_sign_bits(ld, sp, PAIR_LEN);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
303
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
304 return err;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
305 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
306
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
307 static int16_t huffman_codebook(uint8_t i)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
308 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
309 static const uint32_t data = 16428320;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
310 if (i == 0) return (int16_t)(data >> 16) & 0xFFFF;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
311 else return (int16_t)data & 0xFFFF;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
312 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
313
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
314 static void vcb11_check_LAV(uint8_t cb, int16_t *sp)
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
315 {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
316 static const uint16_t vcb11_LAV_tab[] = {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
317 16, 31, 47, 63, 95, 127, 159, 191, 223,
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
318 255, 319, 383, 511, 767, 1023, 2047
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
319 };
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
320 uint16_t max = 0;
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
321
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
322 if (cb < 16 || cb > 31)
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
323 return;
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
324
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
325 max = vcb11_LAV_tab[cb - 16];
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
326
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
327 if ((abs(sp[0]) > max) || (abs(sp[1]) > max))
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
328 {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
329 sp[0] = 0;
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
330 sp[1] = 0;
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
331 }
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
332 }
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
333
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
334 uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
335 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
336 switch (cb)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
337 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
338 case 1: /* 2-step method for data quadruples */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
339 case 2:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
340 return huffman_2step_quad(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
341 case 3: /* binary search for data quadruples */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
342 return huffman_binary_quad_sign(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
343 case 4: /* 2-step method for data quadruples */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
344 return huffman_2step_quad_sign(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
345 case 5: /* binary search for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
346 return huffman_binary_pair(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
347 case 6: /* 2-step method for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
348 return huffman_2step_pair(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
349 case 7: /* binary search for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
350 case 9:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
351 return huffman_binary_pair_sign(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
352 case 8: /* 2-step method for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
353 case 10:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
354 return huffman_2step_pair_sign(cb, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
355 case 12: {
12527
4a370c80fe5c update to the 2.0 release of faad, patch by adland
diego
parents: 10989
diff changeset
356 uint8_t err = huffman_2step_pair(11, ld, sp);
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
357 sp[0] = huffman_codebook(0); sp[1] = huffman_codebook(1);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
358 return err; }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
359 case 11:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
360 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
361 uint8_t err = huffman_2step_pair_sign(11, ld, sp);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
362 sp[0] = huffman_getescape(ld, sp[0]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
363 sp[1] = huffman_getescape(ld, sp[1]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
364 return err;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
365 }
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
366 #ifdef ERROR_RESILIENCE
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
367 /* VCB11 uses codebook 11 */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
368 case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
369 case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
370 {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
371 uint8_t err = huffman_2step_pair_sign(11, ld, sp);
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
372 sp[0] = huffman_getescape(ld, sp[0]);
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
373 sp[1] = huffman_getescape(ld, sp[1]);
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
374
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
375 /* check LAV (Largest Absolute Value) */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
376 /* this finds errors in the ESCAPE signal */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
377 vcb11_check_LAV(cb, sp);
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
378
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
379 return err;
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
380 }
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
381 #endif
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
382 default:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
383 /* Non existent codebook number, something went wrong */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
384 return 11;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
385 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
386
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
387 return 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
388 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
389
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
390
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
391 #ifdef ERROR_RESILIENCE
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
392
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
393 /* Special version of huffman_spectral_data
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
394 Will not read from a bitfile but a bits_t structure.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
395 Will keep track of the bits decoded and return the number of bits remaining.
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
396 Do not read more than ld->len, return -1 if codeword would be longer */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
397
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
398 int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
399 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
400 uint32_t cw;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
401 uint16_t offset = 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
402 uint8_t extra_bits;
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
403 uint8_t i, vcb11 = 0;
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
404
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
405
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
406 switch (cb)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
407 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
408 case 1: /* 2-step method for data quadruples */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
409 case 2:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
410 case 4:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
411
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
412 cw = showbits_hcr(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
413 offset = hcb_table[cb][cw].offset;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
414 extra_bits = hcb_table[cb][cw].extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
415
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
416 if (extra_bits)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
417 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
418 /* we know for sure it's more than hcbN[cb] bits long */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
419 if ( flushbits_hcr(ld, hcbN[cb]) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
420 offset += (uint16_t)showbits_hcr(ld, extra_bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
421 if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
422 } else {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
423 if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
424 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
425
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
426 sp[0] = hcb_2_quad_table[cb][offset].x;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
427 sp[1] = hcb_2_quad_table[cb][offset].y;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
428 sp[2] = hcb_2_quad_table[cb][offset].v;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
429 sp[3] = hcb_2_quad_table[cb][offset].w;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
430 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
431
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
432 case 6: /* 2-step method for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
433 case 8:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
434 case 10:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
435 case 11:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
436 /* VCB11 uses codebook 11 */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
437 case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
438 case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
439
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
440 if (cb >= 16)
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
441 {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
442 /* store the virtual codebook */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
443 vcb11 = cb;
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
444 cb = 11;
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
445 }
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
446
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
447 cw = showbits_hcr(ld, hcbN[cb]);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
448 offset = hcb_table[cb][cw].offset;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
449 extra_bits = hcb_table[cb][cw].extra_bits;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
450
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
451 if (extra_bits)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
452 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
453 /* we know for sure it's more than hcbN[cb] bits long */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
454 if ( flushbits_hcr(ld, hcbN[cb]) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
455 offset += (uint16_t)showbits_hcr(ld, extra_bits);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
456 if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
457 } else {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
458 if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
459 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
460 sp[0] = hcb_2_pair_table[cb][offset].x;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
461 sp[1] = hcb_2_pair_table[cb][offset].y;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
462 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
463
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
464 case 3: /* binary search for data quadruples */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
465
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
466 while (!hcb3[offset].is_leaf)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
467 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
468 uint8_t b;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
469
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
470 if ( get1bit_hcr(ld, &b) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
471 offset += hcb3[offset].data[b];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
472 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
473
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
474 sp[0] = hcb3[offset].data[0];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
475 sp[1] = hcb3[offset].data[1];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
476 sp[2] = hcb3[offset].data[2];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
477 sp[3] = hcb3[offset].data[3];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
478
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
479 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
480
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
481 case 5: /* binary search for data pairs */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
482 case 7:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
483 case 9:
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
484
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
485 while (!hcb_bin_table[cb][offset].is_leaf)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
486 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
487 uint8_t b;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
488
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
489 if (get1bit_hcr(ld, &b) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
490 offset += hcb_bin_table[cb][offset].data[b];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
491 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
492
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
493 sp[0] = hcb_bin_table[cb][offset].data[0];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
494 sp[1] = hcb_bin_table[cb][offset].data[1];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
495
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
496 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
497 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
498
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
499 /* decode sign bits */
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
500 if (unsigned_cb[cb])
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
501 {
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
502 for(i = 0; i < ((cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN); i++)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
503 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
504 if(sp[i])
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
505 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
506 uint8_t b;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
507 if ( get1bit_hcr(ld, &b) ) return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
508 if (b != 0) {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
509 sp[i] = -sp[i];
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
510 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
511 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
512 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
513 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
514
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
515 /* decode huffman escape bits */
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
516 if ((cb == ESC_HCB) || (cb >= 16))
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
517 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
518 uint8_t k;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
519 for (k = 0; k < 2; k++)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
520 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
521 if ((sp[k] == 16) || (sp[k] == -16))
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
522 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
523 uint8_t neg, i;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
524 int32_t j;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
525 uint32_t off;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
526
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
527 neg = (sp[k] < 0) ? 1 : 0;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
528
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
529 for (i = 4; ; i++)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
530 {
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
531 uint8_t b;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
532 if (get1bit_hcr(ld, &b))
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
533 return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
534 if (b == 0)
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
535 break;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
536 }
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
537
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
538 if (getbits_hcr(ld, i, &off))
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
539 return -1;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
540 j = off + (1<<i);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
541 sp[k] = (int16_t)((neg) ? -j : j);
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
542 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
543 }
18141
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
544
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
545 if (vcb11 != 0)
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
546 {
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
547 /* check LAV (Largest Absolute Value) */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
548 /* this finds errors in the ESCAPE signal */
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
549 vcb11_check_LAV(vcb11, sp);
59b6fa5b4201 Update to faad2 cvs 20040915+MPlayer fixes
rtognimp
parents: 14727
diff changeset
550 }
10989
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
551 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
552 return ld->len;
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
553 }
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
554
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
555 #endif
3185f64f6350 synced with current cvs
alex
parents:
diff changeset
556