// Copyright 2018 Google LLC // // 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 // // https://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. #ifndef ASTC_CODEC_DECODER_QUANTIZATION_H_ #define ASTC_CODEC_DECODER_QUANTIZATION_H_ //////////////////////////////////////////////////////////////////////////////// // // ASTC Quantization procedures. // // The values stored in ASTC blocks tend to be stored in a range much more // restricted than the logical range used. For example, sometimes weights are // stored in the range from [0, 3] but are used in the range [0, 64]. The // process of translating a value to or from this range is known as quantization // and dequantization. The ranges to which these values can be (de)quantized // are defined by ISERange[Begin|End]() in integer_sequence_codec.h namespace astc_codec { // The minimum possible range for a pair of endpoints. If endpoints are // quantized to something smaller than this, then it would constitute an // illegal ASTC encoding. constexpr int kEndpointRangeMinValue = 5; // The maximum possible range for a weight value. If weights are quantized to // something larger than this, then it would constitute an illegal ASTC // encoding. constexpr int kWeightRangeMaxValue = 31; // Quantizes a value in the range [0, 255] to [0, |range|]. The quantized values // have no correlation to the input values, and there should be no implicit // assumptions made about their ordering. Valid values of |range_max_value| are // in the interval [5, 255] int QuantizeCEValueToRange(int value, int range_max_value); // Unquantizes a value in the range [0, |range|] to [0, 255]. Performs the // inverse procedure of QuantizeValueToRange. Valid values of |range_max_value| // are in the interval [5, 255] int UnquantizeCEValueFromRange(int value, int range_max_value); // Quantizes a weight in the range [0, 64] to [0, |range_max_value|]. The // quantized values have no correlation to the input values, and there should // be no implicit assumptions made about their ordering. Valid values of // |range_max_value| are in the interval [1, 31] int QuantizeWeightToRange(int weight, int range_max_value); // Unquantizes a weight in the range [0, |range_max_value|] to [0, 64]. Performs // the inverse procedure of QuantizeWeightToRange. Valid values of // |range_max_value| are in the interval [1, 31] int UnquantizeWeightFromRange(int weight, int range_max_value); } // namespace astc_codec #endif // ASTC_CODEC_DECODER_QUANTIZATION_H_