1 /* 2 * Copyright 2019 The libgav1 Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ 18 #define LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ 19 20 #include <cassert> 21 #include <cstdint> 22 23 #include "src/dsp/constants.h" 24 #include "src/utils/constants.h" 25 #include "src/utils/memory.h" 26 27 namespace libgav1 { 28 29 enum { 30 kPartitionContexts = 4, 31 kSegmentIdContexts = 3, 32 kUsePredictedSegmentIdContexts = 3, 33 kSkipContexts = 3, 34 kSkipModeContexts = 3, 35 kBooleanFieldCdfSize = 3, 36 kDeltaSymbolCount = 4, // Used for both delta_q and delta_lf. 37 kIntraModeContexts = 5, 38 kYModeContexts = 4, 39 kAngleDeltaSymbolCount = 2 * kMaxAngleDelta + 1, 40 kCflAlphaSignsSymbolCount = 8, 41 kCflAlphaContexts = 6, 42 kCflAlphaSymbolCount = 16, 43 kTxDepthContexts = 3, 44 kMaxTxDepthSymbolCount = 3, 45 kTxSplitContexts = 21, 46 kCoefficientQuantizerContexts = 4, 47 kNumSquareTransformSizes = 5, 48 kAllZeroContexts = 13, 49 kNumExtendedTransformSizes = 4, 50 kEobPtContexts = 2, 51 kEobPt16SymbolCount = 5, 52 kEobPt32SymbolCount = 6, 53 kEobPt64SymbolCount = 7, 54 kEobPt128SymbolCount = 8, 55 kEobPt256SymbolCount = 9, 56 kEobPt512SymbolCount = 10, 57 kEobPt1024SymbolCount = 11, 58 kEobExtraContexts = 9, 59 kCoeffBaseEobContexts = 4, 60 kCoeffBaseEobSymbolCount = 3, 61 kCoeffBaseContexts = 42, 62 kCoeffBaseSymbolCount = 4, 63 kCoeffBaseRangeContexts = 21, 64 kCoeffBaseRangeSymbolCount = 4, 65 kDcSignContexts = 3, 66 kPaletteBlockSizeContexts = 7, 67 kPaletteYModeContexts = 3, 68 kPaletteUVModeContexts = 2, 69 kPaletteSizeSymbolCount = 7, 70 kPaletteColorIndexContexts = 5, 71 kPaletteColorIndexSymbolCount = 8, 72 kIsInterContexts = 4, 73 kUseCompoundReferenceContexts = 5, 74 kCompoundReferenceTypeContexts = 5, 75 kReferenceContexts = 3, 76 kCompoundPredictionModeContexts = 8, 77 kNewMvContexts = 6, 78 kZeroMvContexts = 2, 79 kReferenceMvContexts = 6, 80 kRefMvIndexContexts = 3, 81 kInterIntraContexts = 3, 82 kWedgeIndexSymbolCount = 16, 83 kIsExplicitCompoundTypeContexts = 6, 84 kIsCompoundTypeAverageContexts = 6, 85 kInterpolationFilterContexts = 16, 86 kMvContexts = 2, 87 kMvClassSymbolCount = 11, 88 kMvFractionSymbolCount = 4, 89 kMvBitSymbolCount = 10, 90 kNumMvComponents = 2, 91 }; // anonymous enum 92 93 struct SymbolDecoderContext { 94 SymbolDecoderContext() = default; SymbolDecoderContextSymbolDecoderContext95 explicit SymbolDecoderContext(int base_quantizer_index) { 96 Initialize(base_quantizer_index); 97 } 98 99 void Initialize(int base_quantizer_index); 100 101 // Partition related variables and functions. 102 static int PartitionCdfSize(int block_size_log2); 103 104 // Returns the cdf array index for inter_tx_type or intra_tx_type based on 105 // |tx_set|. TxTypeIndexSymbolDecoderContext106 static int TxTypeIndex(TransformSet tx_set) { 107 switch (tx_set) { 108 case kTransformSetInter1: 109 case kTransformSetIntra1: 110 return 0; 111 case kTransformSetInter2: 112 case kTransformSetIntra2: 113 return 1; 114 case kTransformSetInter3: 115 return 2; 116 default: 117 // This path should not be hit. 0 is returned rather than -1 to avoid 118 // -Warray-bounds. 119 assert(tx_set != kTransformSetDctOnly && tx_set != kNumTransformSets); 120 return 0; 121 } 122 } 123 124 // Resets the intra_frame_y_mode_cdf array to the default. 125 void ResetIntraFrameYModeCdf(); 126 127 // Resets the symbol counters of all the CDF arrays to zero. Symbol counter is 128 // the last used element in the innermost dimension of each of the CDF array. 129 void ResetCounters(); 130 131 // Note kMaxAlignment allows for aligned instructions to be used in the 132 // copies done in Initialize(). 133 alignas(kMaxAlignment) uint16_t 134 partition_cdf[kBlockWidthCount][kPartitionContexts] 135 [kMaxPartitionTypes + 1]; 136 alignas(kMaxAlignment) uint16_t 137 segment_id_cdf[kSegmentIdContexts][kMaxSegments + 1]; 138 alignas(kMaxAlignment) uint16_t 139 use_predicted_segment_id_cdf[kUsePredictedSegmentIdContexts] 140 [kBooleanFieldCdfSize]; 141 alignas(kMaxAlignment) uint16_t skip_cdf[kSkipContexts][kBooleanFieldCdfSize]; 142 alignas(kMaxAlignment) uint16_t 143 skip_mode_cdf[kSkipModeContexts][kBooleanFieldCdfSize]; 144 alignas(kMaxAlignment) uint16_t delta_q_cdf[kDeltaSymbolCount + 1]; 145 alignas(kMaxAlignment) uint16_t delta_lf_cdf[kDeltaSymbolCount + 1]; 146 alignas(kMaxAlignment) uint16_t 147 delta_lf_multi_cdf[kFrameLfCount][kDeltaSymbolCount + 1]; 148 alignas(kMaxAlignment) uint16_t intra_block_copy_cdf[kBooleanFieldCdfSize]; 149 alignas(kMaxAlignment) uint16_t 150 intra_frame_y_mode_cdf[kIntraModeContexts][kIntraModeContexts] 151 [kIntraPredictionModesY + 1]; 152 alignas(kMaxAlignment) uint16_t 153 y_mode_cdf[kYModeContexts][kIntraPredictionModesY + 1]; 154 alignas(kMaxAlignment) uint16_t 155 angle_delta_cdf[kDirectionalIntraModes][kAngleDeltaSymbolCount + 1]; 156 alignas(kMaxAlignment) uint16_t 157 uv_mode_cdf[kBooleanSymbolCount][kIntraPredictionModesY] 158 [kIntraPredictionModesUV + 1]; 159 alignas(kMaxAlignment) uint16_t 160 cfl_alpha_signs_cdf[kCflAlphaSignsSymbolCount + 1]; 161 alignas(kMaxAlignment) uint16_t 162 cfl_alpha_cdf[kCflAlphaContexts][kCflAlphaSymbolCount + 1]; 163 alignas(kMaxAlignment) uint16_t 164 use_filter_intra_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; 165 alignas(kMaxAlignment) uint16_t 166 filter_intra_mode_cdf[kNumFilterIntraPredictors + 1]; 167 alignas(kMaxAlignment) uint16_t 168 tx_depth_cdf[4][kTxDepthContexts][kMaxTxDepthSymbolCount + 1]; 169 alignas(kMaxAlignment) uint16_t 170 tx_split_cdf[kTxSplitContexts][kBooleanFieldCdfSize]; 171 alignas(kMaxAlignment) uint16_t 172 all_zero_cdf[kNumSquareTransformSizes][kAllZeroContexts] 173 [kBooleanFieldCdfSize]; 174 alignas(kMaxAlignment) uint16_t 175 inter_tx_type_cdf[3][kNumExtendedTransformSizes][kNumTransformTypes + 1]; 176 alignas(kMaxAlignment) uint16_t 177 intra_tx_type_cdf[2][kNumExtendedTransformSizes][kIntraPredictionModesY] 178 [kNumTransformTypes + 1]; 179 alignas(kMaxAlignment) uint16_t 180 eob_pt_16_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt16SymbolCount + 1]; 181 alignas(kMaxAlignment) uint16_t 182 eob_pt_32_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt32SymbolCount + 1]; 183 alignas(kMaxAlignment) uint16_t 184 eob_pt_64_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt64SymbolCount + 1]; 185 alignas(kMaxAlignment) uint16_t 186 eob_pt_128_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt128SymbolCount + 1]; 187 alignas(kMaxAlignment) uint16_t 188 eob_pt_256_cdf[kNumPlaneTypes][kEobPtContexts][kEobPt256SymbolCount + 1]; 189 alignas(kMaxAlignment) uint16_t 190 eob_pt_512_cdf[kNumPlaneTypes][kEobPt512SymbolCount + 1]; 191 alignas(kMaxAlignment) uint16_t 192 eob_pt_1024_cdf[kNumPlaneTypes][kEobPt1024SymbolCount + 1]; 193 alignas(kMaxAlignment) uint16_t 194 eob_extra_cdf[kNumSquareTransformSizes][kNumPlaneTypes][kEobExtraContexts] 195 [kBooleanFieldCdfSize]; 196 alignas(kMaxAlignment) uint16_t 197 coeff_base_eob_cdf[kNumSquareTransformSizes][kNumPlaneTypes] 198 [kCoeffBaseEobContexts][kCoeffBaseEobSymbolCount + 1]; 199 alignas(kMaxAlignment) uint16_t 200 coeff_base_cdf[kNumSquareTransformSizes][kNumPlaneTypes] 201 [kCoeffBaseContexts][kCoeffBaseSymbolCount + 1]; 202 alignas(kMaxAlignment) uint16_t 203 coeff_base_range_cdf[kNumSquareTransformSizes][kNumPlaneTypes] 204 [kCoeffBaseRangeContexts] 205 [kCoeffBaseRangeSymbolCount + 1]; 206 alignas(kMaxAlignment) uint16_t 207 dc_sign_cdf[kNumPlaneTypes][kDcSignContexts][kBooleanFieldCdfSize]; 208 alignas(kMaxAlignment) uint16_t 209 restoration_type_cdf[kRestorationTypeSymbolCount + 1]; 210 alignas(kMaxAlignment) uint16_t use_wiener_cdf[kBooleanFieldCdfSize]; 211 alignas(kMaxAlignment) uint16_t use_sgrproj_cdf[kBooleanFieldCdfSize]; 212 alignas(kMaxAlignment) uint16_t 213 has_palette_y_cdf[kPaletteBlockSizeContexts][kPaletteYModeContexts] 214 [kBooleanFieldCdfSize]; 215 alignas(kMaxAlignment) uint16_t 216 palette_y_size_cdf[kPaletteBlockSizeContexts] 217 [kPaletteSizeSymbolCount + 1]; 218 alignas(kMaxAlignment) uint16_t 219 has_palette_uv_cdf[kPaletteUVModeContexts][kBooleanFieldCdfSize]; 220 alignas(kMaxAlignment) uint16_t 221 palette_uv_size_cdf[kPaletteBlockSizeContexts] 222 [kPaletteSizeSymbolCount + 1]; 223 alignas(kMaxAlignment) uint16_t 224 palette_color_index_cdf[kNumPlaneTypes][kPaletteSizeSymbolCount] 225 [kPaletteColorIndexContexts] 226 [kPaletteColorIndexSymbolCount + 1]; 227 alignas(kMaxAlignment) uint16_t 228 is_inter_cdf[kIsInterContexts][kBooleanFieldCdfSize]; 229 alignas(kMaxAlignment) uint16_t 230 use_compound_reference_cdf[kUseCompoundReferenceContexts] 231 [kBooleanFieldCdfSize]; 232 alignas(kMaxAlignment) uint16_t 233 compound_reference_type_cdf[kCompoundReferenceTypeContexts] 234 [kBooleanFieldCdfSize]; 235 alignas(kMaxAlignment) uint16_t 236 compound_reference_cdf[kNumCompoundReferenceTypes][kReferenceContexts][3] 237 [kBooleanFieldCdfSize]; 238 alignas(kMaxAlignment) uint16_t 239 compound_backward_reference_cdf[kReferenceContexts][2] 240 [kBooleanFieldCdfSize]; 241 alignas(kMaxAlignment) uint16_t 242 single_reference_cdf[kReferenceContexts][6][kBooleanFieldCdfSize]; 243 alignas(kMaxAlignment) uint16_t 244 compound_prediction_mode_cdf[kCompoundPredictionModeContexts] 245 [kNumCompoundInterPredictionModes + 1]; 246 alignas(kMaxAlignment) uint16_t 247 new_mv_cdf[kNewMvContexts][kBooleanFieldCdfSize]; 248 alignas(kMaxAlignment) uint16_t 249 zero_mv_cdf[kZeroMvContexts][kBooleanFieldCdfSize]; 250 alignas(kMaxAlignment) uint16_t 251 reference_mv_cdf[kReferenceMvContexts][kBooleanFieldCdfSize]; 252 alignas(kMaxAlignment) uint16_t 253 ref_mv_index_cdf[kRefMvIndexContexts][kBooleanFieldCdfSize]; 254 alignas(kMaxAlignment) uint16_t 255 is_inter_intra_cdf[kInterIntraContexts][kBooleanFieldCdfSize]; 256 alignas(kMaxAlignment) uint16_t 257 inter_intra_mode_cdf[kInterIntraContexts][kNumInterIntraModes + 1]; 258 alignas(kMaxAlignment) uint16_t 259 is_wedge_inter_intra_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; 260 alignas(kMaxAlignment) uint16_t 261 wedge_index_cdf[kMaxBlockSizes][kWedgeIndexSymbolCount + 1]; 262 alignas(kMaxAlignment) uint16_t 263 use_obmc_cdf[kMaxBlockSizes][kBooleanFieldCdfSize]; 264 alignas(kMaxAlignment) uint16_t 265 motion_mode_cdf[kMaxBlockSizes][kNumMotionModes + 1]; 266 alignas(kMaxAlignment) uint16_t 267 is_explicit_compound_type_cdf[kIsExplicitCompoundTypeContexts] 268 [kBooleanFieldCdfSize]; 269 alignas(kMaxAlignment) uint16_t 270 is_compound_type_average_cdf[kIsCompoundTypeAverageContexts] 271 [kBooleanFieldCdfSize]; 272 alignas(kMaxAlignment) uint16_t 273 compound_type_cdf[kMaxBlockSizes] 274 [kNumExplicitCompoundPredictionTypes + 1]; 275 alignas(kMaxAlignment) uint16_t 276 interpolation_filter_cdf[kInterpolationFilterContexts] 277 [kNumExplicitInterpolationFilters + 1]; 278 alignas(kMaxAlignment) uint16_t 279 mv_joint_cdf[kMvContexts][kNumMvJointTypes + 1]; 280 alignas(kMaxAlignment) uint16_t 281 mv_sign_cdf[kMvContexts][kNumMvComponents][kBooleanFieldCdfSize]; 282 alignas(kMaxAlignment) uint16_t 283 mv_class_cdf[kMvContexts][kNumMvComponents][kMvClassSymbolCount + 1]; 284 alignas(kMaxAlignment) uint16_t 285 mv_class0_bit_cdf[kMvContexts][kNumMvComponents][kBooleanFieldCdfSize]; 286 alignas(kMaxAlignment) uint16_t 287 mv_class0_fraction_cdf[kMvContexts][kNumMvComponents][kBooleanSymbolCount] 288 [kMvFractionSymbolCount + 1]; 289 alignas(kMaxAlignment) uint16_t 290 mv_class0_high_precision_cdf[kMvContexts][kNumMvComponents] 291 [kBooleanFieldCdfSize]; 292 alignas(kMaxAlignment) uint16_t 293 mv_bit_cdf[kMvContexts][kNumMvComponents][kMvBitSymbolCount] 294 [kBooleanFieldCdfSize]; 295 alignas(kMaxAlignment) uint16_t mv_fraction_cdf[kMvContexts][kNumMvComponents] 296 [kMvFractionSymbolCount + 1]; 297 alignas(kMaxAlignment) uint16_t 298 mv_high_precision_cdf[kMvContexts][kNumMvComponents] 299 [kBooleanFieldCdfSize]; 300 }; 301 302 } // namespace libgav1 303 #endif // LIBGAV1_SRC_SYMBOL_DECODER_CONTEXT_H_ 304