diff options
Diffstat (limited to 'src/decoder/quantization.h')
-rw-r--r-- | src/decoder/quantization.h | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/decoder/quantization.h b/src/decoder/quantization.h new file mode 100644 index 0000000..5f7239f --- /dev/null +++ b/src/decoder/quantization.h @@ -0,0 +1,65 @@ +// 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_ |