MCPcopy Create free account
hub / github.com/ARM-software/astc-encoder / encode_ise

Function encode_ise

Source/astcenc_integer_sequence.cpp:493–648  ·  view source on GitHub ↗

See header for documentation. */

Source from the content-addressed store, hash-verified

491
492/* See header for documentation. */
493void encode_ise(
494 quant_method quant_level,
495 unsigned int character_count,
496 const uint8_t* input_data,
497 uint8_t* output_data,
498 unsigned int bit_offset
499) {
500 promise(character_count > 0);
501
502 unsigned int bits = btq_counts[quant_level].bits;
503 unsigned int trits = btq_counts[quant_level].trits;
504 unsigned int quints = btq_counts[quant_level].quints;
505 unsigned int mask = (1 << bits) - 1;
506
507 // Write out trits and bits
508 if (trits)
509 {
510 unsigned int i = 0;
511 unsigned int full_trit_blocks = character_count / 5;
512
513 for (unsigned int j = 0; j < full_trit_blocks; j++)
514 {
515 unsigned int i4 = input_data[i + 4] >> bits;
516 unsigned int i3 = input_data[i + 3] >> bits;
517 unsigned int i2 = input_data[i + 2] >> bits;
518 unsigned int i1 = input_data[i + 1] >> bits;
519 unsigned int i0 = input_data[i + 0] >> bits;
520
521 uint8_t T = integer_of_trits[i4][i3][i2][i1][i0];
522
523 // The max size of a trit bit count is 6, so we can always safely
524 // pack a single MX value with the following 1 or 2 T bits.
525 uint8_t pack;
526
527 // Element 0 + T0 + T1
528 pack = (input_data[i++] & mask) | (((T >> 0) & 0x3) << bits);
529 write_bits(pack, bits + 2, bit_offset, output_data);
530 bit_offset += bits + 2;
531
532 // Element 1 + T2 + T3
533 pack = (input_data[i++] & mask) | (((T >> 2) & 0x3) << bits);
534 write_bits(pack, bits + 2, bit_offset, output_data);
535 bit_offset += bits + 2;
536
537 // Element 2 + T4
538 pack = (input_data[i++] & mask) | (((T >> 4) & 0x1) << bits);
539 write_bits(pack, bits + 1, bit_offset, output_data);
540 bit_offset += bits + 1;
541
542 // Element 3 + T5 + T6
543 pack = (input_data[i++] & mask) | (((T >> 5) & 0x3) << bits);
544 write_bits(pack, bits + 2, bit_offset, output_data);
545 bit_offset += bits + 2;
546
547 // Element 4 + T7
548 pack = (input_data[i++] & mask) | (((T >> 7) & 0x1) << bits);
549 write_bits(pack, bits + 1, bit_offset, output_data);
550 bit_offset += bits + 1;

Callers 1

symbolic_to_physicalFunction · 0.85

Calls 1

write_bitsFunction · 0.70

Tested by

no test coverage detected