| 374 | } |
| 375 | |
| 376 | static inline int ape_decode_value(APEContext * ctx, APERice *rice) |
| 377 | { |
| 378 | int x, overflow; |
| 379 | |
| 380 | if (ctx->fileversion < 3990) { |
| 381 | int tmpk; |
| 382 | |
| 383 | overflow = range_get_symbol(ctx, counts_3970, counts_diff_3970); |
| 384 | |
| 385 | if (overflow == (MODEL_ELEMENTS - 1)) { |
| 386 | tmpk = range_decode_bits(ctx, 5); |
| 387 | overflow = 0; |
| 388 | } else |
| 389 | tmpk = (rice->k < 1) ? 0 : rice->k - 1; |
| 390 | |
| 391 | if (tmpk <= 16) |
| 392 | x = range_decode_bits(ctx, tmpk); |
| 393 | else { |
| 394 | x = range_decode_bits(ctx, 16); |
| 395 | x |= (range_decode_bits(ctx, tmpk - 16) << 16); |
| 396 | } |
| 397 | x += overflow << tmpk; |
| 398 | } else { |
| 399 | int base, pivot; |
| 400 | |
| 401 | pivot = rice->ksum >> 5; |
| 402 | if (pivot == 0) |
| 403 | pivot = 1; |
| 404 | |
| 405 | overflow = range_get_symbol(ctx, counts_3980, counts_diff_3980); |
| 406 | |
| 407 | if (overflow == (MODEL_ELEMENTS - 1)) { |
| 408 | overflow = range_decode_bits(ctx, 16) << 16; |
| 409 | overflow |= range_decode_bits(ctx, 16); |
| 410 | } |
| 411 | |
| 412 | if (pivot < 0x10000) { |
| 413 | base = range_decode_culfreq(ctx, pivot); |
| 414 | range_decode_update(ctx, 1, base); |
| 415 | } else { |
| 416 | int base_hi = pivot, base_lo; |
| 417 | int bbits = 0; |
| 418 | |
| 419 | while (base_hi & ~0xFFFF) { |
| 420 | base_hi >>= 1; |
| 421 | bbits++; |
| 422 | } |
| 423 | base_hi = range_decode_culfreq(ctx, base_hi + 1); |
| 424 | range_decode_update(ctx, 1, base_hi); |
| 425 | base_lo = range_decode_culfreq(ctx, 1 << bbits); |
| 426 | range_decode_update(ctx, 1, base_lo); |
| 427 | |
| 428 | base = (base_hi << bbits) + base_lo; |
| 429 | } |
| 430 | |
| 431 | x = base + overflow * pivot; |
| 432 | } |
| 433 |
no test coverage detected