1*09537850SAkhilesh Sanikop /* 2*09537850SAkhilesh Sanikop * Copyright 2019 The libgav1 Authors 3*09537850SAkhilesh Sanikop * 4*09537850SAkhilesh Sanikop * Licensed under the Apache License, Version 2.0 (the "License"); 5*09537850SAkhilesh Sanikop * you may not use this file except in compliance with the License. 6*09537850SAkhilesh Sanikop * You may obtain a copy of the License at 7*09537850SAkhilesh Sanikop * 8*09537850SAkhilesh Sanikop * http://www.apache.org/licenses/LICENSE-2.0 9*09537850SAkhilesh Sanikop * 10*09537850SAkhilesh Sanikop * Unless required by applicable law or agreed to in writing, software 11*09537850SAkhilesh Sanikop * distributed under the License is distributed on an "AS IS" BASIS, 12*09537850SAkhilesh Sanikop * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*09537850SAkhilesh Sanikop * See the License for the specific language governing permissions and 14*09537850SAkhilesh Sanikop * limitations under the License. 15*09537850SAkhilesh Sanikop */ 16*09537850SAkhilesh Sanikop 17*09537850SAkhilesh Sanikop #ifndef LIBGAV1_SRC_QUANTIZER_H_ 18*09537850SAkhilesh Sanikop #define LIBGAV1_SRC_QUANTIZER_H_ 19*09537850SAkhilesh Sanikop 20*09537850SAkhilesh Sanikop #include <array> 21*09537850SAkhilesh Sanikop #include <cstdint> 22*09537850SAkhilesh Sanikop 23*09537850SAkhilesh Sanikop #include "src/utils/constants.h" 24*09537850SAkhilesh Sanikop #include "src/utils/dynamic_buffer.h" 25*09537850SAkhilesh Sanikop #include "src/utils/segmentation.h" 26*09537850SAkhilesh Sanikop #include "src/utils/types.h" 27*09537850SAkhilesh Sanikop 28*09537850SAkhilesh Sanikop namespace libgav1 { 29*09537850SAkhilesh Sanikop 30*09537850SAkhilesh Sanikop using QuantizerMatrix = std::array< 31*09537850SAkhilesh Sanikop std::array<std::array<DynamicBuffer<uint8_t>, kNumTransformSizes>, 32*09537850SAkhilesh Sanikop kNumPlaneTypes>, 33*09537850SAkhilesh Sanikop kNumQuantizerLevelsForQuantizerMatrix>; 34*09537850SAkhilesh Sanikop 35*09537850SAkhilesh Sanikop // Implements the dequantization functions of Section 7.12.2. 36*09537850SAkhilesh Sanikop class Quantizer { 37*09537850SAkhilesh Sanikop public: 38*09537850SAkhilesh Sanikop Quantizer(int bitdepth, const QuantizerParameters* params); 39*09537850SAkhilesh Sanikop 40*09537850SAkhilesh Sanikop // Returns the quantizer value for the dc coefficient for the given plane. 41*09537850SAkhilesh Sanikop // The caller should call GetQIndex() with Tile::current_quantizer_index_ as 42*09537850SAkhilesh Sanikop // the |base_qindex| argument, and pass the return value as the |qindex| 43*09537850SAkhilesh Sanikop // argument to this method. 44*09537850SAkhilesh Sanikop int GetDcValue(Plane plane, int qindex) const; 45*09537850SAkhilesh Sanikop 46*09537850SAkhilesh Sanikop // Returns the quantizer value for the ac coefficient for the given plane. 47*09537850SAkhilesh Sanikop // The caller should call GetQIndex() with Tile::current_quantizer_index_ as 48*09537850SAkhilesh Sanikop // the |base_qindex| argument, and pass the return value as the |qindex| 49*09537850SAkhilesh Sanikop // argument to this method. 50*09537850SAkhilesh Sanikop int GetAcValue(Plane plane, int qindex) const; 51*09537850SAkhilesh Sanikop 52*09537850SAkhilesh Sanikop private: 53*09537850SAkhilesh Sanikop const QuantizerParameters& params_; 54*09537850SAkhilesh Sanikop const int16_t* dc_lookup_; 55*09537850SAkhilesh Sanikop const int16_t* ac_lookup_; 56*09537850SAkhilesh Sanikop }; 57*09537850SAkhilesh Sanikop 58*09537850SAkhilesh Sanikop // Initialize the quantizer matrix. 59*09537850SAkhilesh Sanikop bool InitializeQuantizerMatrix(QuantizerMatrix* quantizer_matrix); 60*09537850SAkhilesh Sanikop 61*09537850SAkhilesh Sanikop // Get the quantizer index for the |index|th segment. 62*09537850SAkhilesh Sanikop // 63*09537850SAkhilesh Sanikop // This function has two use cases. What should be passed as the |base_qindex| 64*09537850SAkhilesh Sanikop // argument depends on the use case. 65*09537850SAkhilesh Sanikop // 1. While parsing the uncompressed header or transform type, pass 66*09537850SAkhilesh Sanikop // Quantizer::base_index. 67*09537850SAkhilesh Sanikop // Note: In this use case, the caller only cares about whether the return 68*09537850SAkhilesh Sanikop // value is zero. 69*09537850SAkhilesh Sanikop // 2. To generate the |qindex| argument to Quantizer::GetDcQuant() or 70*09537850SAkhilesh Sanikop // Quantizer::GetAcQuant(), pass Tile::current_quantizer_index_. 71*09537850SAkhilesh Sanikop int GetQIndex(const Segmentation& segmentation, int index, int base_qindex); 72*09537850SAkhilesh Sanikop 73*09537850SAkhilesh Sanikop } // namespace libgav1 74*09537850SAkhilesh Sanikop 75*09537850SAkhilesh Sanikop #endif // LIBGAV1_SRC_QUANTIZER_H_ 76