// SPDX-License-Identifier: Apache-2.0 // ---------------------------------------------------------------------------- // Copyright 2011-2024 Arm Limited // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy // of the License at: // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. // ---------------------------------------------------------------------------- /** * @brief Functions for encoding/decoding Bounded Integer Sequence Encoding. */ #include "astcenc_internal.h" #include <array> /** @brief Unpacked quint triplets <low,middle,high> for each packed value */ // TODO: Bitpack these into a uint16_t? static const uint8_t quints_of_integer[128][3] { … }; /** @brief Packed quint values for each unpacked value, indexed [hi][mid][lo]. */ static const uint8_t integer_of_quints[5][5][5] { … }; /** @brief Unpacked trit quintuplets <low,...,high> for each packed value */ // TODO: Bitpack these into a uint16_t? static const uint8_t trits_of_integer[256][5] { … }; /** @brief Packed trit values for each unpacked value, indexed [hi][][][][lo]. */ static const uint8_t integer_of_trits[3][3][3][3][3] { … }; /** * @brief The number of bits, trits, and quints needed for a quant level. */ struct btq_count { … }; /** * @brief The table of bits, trits, and quints needed for a quant encode. */ static const std::array<btq_count, 21> btq_counts { … }; /** * @brief The sequence scale, round, and divisors needed to compute sizing. * * The length of a quantized sequence in bits is: * (scale * <sequence_len> + round) / divisor */ struct ise_size { … }; /** * @brief The table of scale, round, and divisors needed for quant sizing. */ static const std::array<ise_size, 21> ise_sizes { … }; /* See header for documentation. */ unsigned int get_ise_sequence_bitcount( unsigned int character_count, quant_method quant_level ) { … } /** * @brief Write up to 8 bits at an arbitrary bit offset. * * The stored value is at most 8 bits, but can be stored at an offset of between 0 and 7 bits so may * span two separate bytes in memory. * * @param value The value to write. * @param bitcount The number of bits to write, starting from LSB. * @param bitoffset The bit offset to store at, between 0 and 7. * @param[in,out] ptr The data pointer to write to. */ static inline void write_bits( unsigned int value, unsigned int bitcount, unsigned int bitoffset, uint8_t ptr[2] ) { … } /** * @brief Read up to 16 bits from two bytes. * * This function reads a packed N-bit field from two bytes in memory. The stored value must exist * within the two bytes, but can start at an arbitary bit offset and span the two bytes in memory. * * @param bitcount The number of bits to read. * @param bitoffset The bit offset to read from, between 0 and 7. * @param[in,out] ptr The data pointer to read from. * * @return The read value. */ static inline unsigned int read_bits( unsigned int bitcount, unsigned int bitoffset, const uint8_t* ptr ) { … } /* See header for documentation. */ void encode_ise( quant_method quant_level, unsigned int character_count, const uint8_t* input_data, uint8_t* output_data, unsigned int bit_offset ) { … } /* See header for documentation. */ void decode_ise( quant_method quant_level, unsigned int character_count, const uint8_t* input_data, uint8_t* output_data, unsigned int bit_offset ) { … }