See header for documentation. */
| 491 | |
| 492 | /* See header for documentation. */ |
| 493 | void 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; |
no test coverage detected