| /* | |
| * Copyright 2019 The libgav1 Authors | |
| * | |
| * 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. | |
| */ | |
| #ifndef LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ | |
| #define LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ | |
| #include <cassert> | |
| #include <cstdint> | |
| #include "src/dsp/constants.h" | |
| #include "src/utils/constants.h" | |
| #include "src/utils/memory.h" | |
| namespace libgav1 { | |
| enum { | |
| kPartitionContexts = 4, | |
| kSegmentIdContexts = 3, | |
| kUsePredictedSegmentIdContexts = 3, | |
| kSkipContexts = 3, | |
| kSkipModeContexts = 3, | |
| kBooleanFieldCdfSize = 3, | |
| kDeltaSymbolCount = 4, // Used for both delta_q and delta_lf. | |
| kIntraModeContexts = 5, | |
| kYModeContexts = 4, | |
| kAngleDeltaSymbolCount = 2 * kMaxAngleDelta + 1, | |
| kCflAlphaSignsSymbolCount = 8, | |
| kCflAlphaContexts = 6, | |
| kCflAlphaSymbolCount = 16, | |
| kTxDepthContexts = 3, | |
| kMaxTxDepthSymbolCount = 3, | |
| kTxSplitContexts = 21, | |
| kCoefficientQuantizerContexts = 4, | |
| kNumSquareTransformSizes = 5, | |
| kAllZeroContexts = 13, | |
| kNumExtendedTransformSizes = 4, | |
| kEobPtContexts = 2, | |
| kEobPt16SymbolCount = 5, | |
| kEobPt32SymbolCount = 6, | |
| kEobPt64SymbolCount = 7, | |
| kEobPt128SymbolCount = 8, | |
| kEobPt256SymbolCount = 9, | |
| kEobPt512SymbolCount = 10, | |
| kEobPt1024SymbolCount = 11, | |
| kEobExtraContexts = 9, | |
| kCoeffBaseEobContexts = 4, | |
| kCoeffBaseEobSymbolCount = 3, | |
| kCoeffBaseContexts = 42, | |
| kCoeffBaseSymbolCount = 4, | |
| kCoeffBaseRangeContexts = 21, | |
| kCoeffBaseRangeSymbolCount = 4, | |
| kDcSignContexts = 3, | |
| kPaletteBlockSizeContexts = 7, | |
| kPaletteYModeContexts = 3, | |
| kPaletteUVModeContexts = 2, | |
| kPaletteSizeSymbolCount = 7, | |
| kPaletteColorIndexContexts = 5, | |
| kPaletteColorIndexSymbolCount = 8, | |
| kIsInterContexts = 4, | |
| kUseCompoundReferenceContexts = 5, | |
| kCompoundReferenceTypeContexts = 5, | |
| kReferenceContexts = 3, | |
| kCompoundPredictionModeContexts = 8, | |
| kNewMvContexts = 6, | |
| kZeroMvContexts = 2, | |
| kReferenceMvContexts = 6, | |
| kRefMvIndexContexts = 3, | |
| kInterIntraContexts = 3, | |
| kWedgeIndexSymbolCount = 16, | |
| kIsExplicitCompoundTypeContexts = 6, | |
| kIsCompoundTypeAverageContexts = 6, | |
| kInterpolationFilterContexts = 16, | |
| kMvContexts = 2, | |
| kMvClassSymbolCount = 11, | |
| kMvFractionSymbolCount = 4, | |
| kMvBitSymbolCount = 10, | |
| kNumMvComponents = 2, | |
| }; // anonymous enum | |
| struct SymbolDecoderContext { | |
| SymbolDecoderContext() = default; | |
| explicit SymbolDecoderContext(int base_quantizer_index) { | |
| Initialize(base_quantizer_index); | |
| } | |
| void Initialize(int base_quantizer_index); | |
| // Partition related variables and functions. | |
| static int PartitionCdfSize(int block_size_log2); | |
| // Returns the cdf array index for inter_tx_type or intra_tx_type based on | |
| // |tx_set|. | |
| static int TxTypeIndex(TransformSet tx_set) { | |
| assert(tx_set != kTransformSetDctOnly); | |
| switch (tx_set) { | |
| case kTransformSetInter1: | |
| case kTransformSetIntra1: | |
| return 0; | |
| case kTransformSetInter2: | |
| case kTransformSetIntra2: | |
| return 1; | |
| case kTransformSetInter3: | |
| return 2; | |
| default: | |
| return -1; | |
| } | |
| } | |
| // Resets the intra_frame_y_mode_cdf array to the default. | |
| void ResetIntraFrameYModeCdf(); | |
| // Resets the symbol counters of all the CDF arrays to zero. Symbol counter is | |
| // the last used element in the innermost dimension of each of the CDF array. | |
| void ResetCounters(); | |
| // Note kMaxAlignment allows for aligned instructions to be used in the | |
| // copies done in Initialize(). | |
| alignas(kMaxAlignment) uint16_t | |
| partition_cdf[kBlockWidthCount][kPartitionContexts] | |
| [kMaxPartitionTypes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| segment_id_cdf[kSegmentIdContexts][kMaxSegments + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| use_predicted_segment_id_cdf[kUsePredictedSegmentIdContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t skip_cdf[kSkipContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| skip_mode_cdf[kSkipModeContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t delta_q_cdf[kDeltaSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t delta_lf_cdf[kDeltaSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| delta_lf_multi_cdf[kFrameLfCount][kDeltaSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t intra_block_copy_cdf[kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| intra_frame_y_mode_cdf[kIntraModeContexts][kIntraModeContexts] | |
| [kIntraPredictionModesY + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| y_mode_cdf[kYModeContexts][kIntraPredictionModesY + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| angle_delta_cdf[kDirectionalIntraModes][kAngleDeltaSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| uv_mode_cdf[kBooleanSymbolCount][kIntraPredictionModesY] | |
| [kIntraPredictionModesUV + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| cfl_alpha_signs_cdf[kCflAlphaSignsSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| cfl_alpha_cdf[kCflAlphaContexts][kCflAlphaSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| use_filter_intra_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| filter_intra_mode_cdf[kNumFilterIntraPredictors + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| tx_depth_cdf[4][kTxDepthContexts][kMaxTxDepthSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| tx_split_cdf[kTxSplitContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| all_zero_cdf[kNumSquareTransformSizes][kAllZeroContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| inter_tx_type_cdf[3][kNumExtendedTransformSizes][kNumTransformTypes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| intra_tx_type_cdf[2][kNumExtendedTransformSizes][kIntraPredictionModesY] | |
| [kNumTransformTypes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_16_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt16SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_32_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt32SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_64_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt64SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_128_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt128SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_256_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt256SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_512_cdf[kNumPlaneTypes][kEobPt512SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_pt_1024_cdf[kNumPlaneTypes][kEobPt1024SymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| eob_extra_cdf[kNumSquareTransformSizes][kNumPlaneTypes][kEobExtraContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| coeff_base_eob_cdf[kNumSquareTransformSizes][kNumPlaneTypes] | |
| [kCoeffBaseEobContexts][kCoeffBaseEobSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| coeff_base_cdf[kNumSquareTransformSizes][kNumPlaneTypes] | |
| [kCoeffBaseContexts][kCoeffBaseSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| coeff_base_range_cdf[kNumSquareTransformSizes][kNumPlaneTypes] | |
| [kCoeffBaseRangeContexts] | |
| [kCoeffBaseRangeSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| dc_sign_cdf[kNumPlaneTypes][kDcSignContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| restoration_type_cdf[kRestorationTypeSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t use_wiener_cdf[kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t use_sgrproj_cdf[kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| has_palette_y_cdf[kPaletteBlockSizeContexts][kPaletteYModeContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| palette_y_size_cdf[kPaletteBlockSizeContexts] | |
| [kPaletteSizeSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| has_palette_uv_cdf[kPaletteUVModeContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| palette_uv_size_cdf[kPaletteBlockSizeContexts] | |
| [kPaletteSizeSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| palette_color_index_cdf[kNumPlaneTypes][kPaletteSizeSymbolCount] | |
| [kPaletteColorIndexContexts] | |
| [kPaletteColorIndexSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| is_inter_cdf[kIsInterContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| use_compound_reference_cdf[kUseCompoundReferenceContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| compound_reference_type_cdf[kCompoundReferenceTypeContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| compound_reference_cdf[kNumCompoundReferenceTypes][kReferenceContexts][3] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| compound_backward_reference_cdf[kReferenceContexts][2] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| single_reference_cdf[kReferenceContexts][6][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| compound_prediction_mode_cdf[kCompoundPredictionModeContexts] | |
| [kNumCompoundInterPredictionModes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| new_mv_cdf[kNewMvContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| zero_mv_cdf[kZeroMvContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| reference_mv_cdf[kReferenceMvContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| ref_mv_index_cdf[kRefMvIndexContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| is_inter_intra_cdf[kInterIntraContexts][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| inter_intra_mode_cdf[kInterIntraContexts][kNumInterIntraModes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| is_wedge_inter_intra_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| wedge_index_cdf[kMaxBlockSizes][kWedgeIndexSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| use_obmc_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| motion_mode_cdf[kMaxBlockSizes][kNumMotionModes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| is_explicit_compound_type_cdf[kIsExplicitCompoundTypeContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| is_compound_type_average_cdf[kIsCompoundTypeAverageContexts] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| compound_type_cdf[kMaxBlockSizes] | |
| [kNumExplicitCompoundPredictionTypes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| interpolation_filter_cdf[kInterpolationFilterContexts] | |
| [kNumExplicitInterpolationFilters + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_joint_cdf[kMvContexts][kNumMvJointTypes + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_sign_cdf[kMvContexts][kNumMvComponents][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_class_cdf[kMvContexts][kNumMvComponents][kMvClassSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_class0_bit_cdf[kMvContexts][kNumMvComponents][kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_class0_fraction_cdf[kMvContexts][kNumMvComponents][kBooleanSymbolCount] | |
| [kMvFractionSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_class0_high_precision_cdf[kMvContexts][kNumMvComponents] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_bit_cdf[kMvContexts][kNumMvComponents][kMvBitSymbolCount] | |
| [kBooleanFieldCdfSize]; | |
| alignas(kMaxAlignment) uint16_t mv_fraction_cdf[kMvContexts][kNumMvComponents] | |
| [kMvFractionSymbolCount + 1]; | |
| alignas(kMaxAlignment) uint16_t | |
| mv_high_precision_cdf[kMvContexts][kNumMvComponents] | |
| [kBooleanFieldCdfSize]; | |
| }; | |
| } // namespace libgav1 | |
| #endif // LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ |