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