MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / ape_decode_value

Function ape_decode_value

libavcodec/apedec.c:376–441  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

374}
375
376static 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

Callers 1

entropy_decodeFunction · 0.85

Calls 5

range_get_symbolFunction · 0.85
range_decode_bitsFunction · 0.85
range_decode_culfreqFunction · 0.85
range_decode_updateFunction · 0.85
update_riceFunction · 0.85

Tested by

no test coverage detected