1 /* 2 * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef VPX_VP9_ENCODER_VP9_CONTEXT_TREE_H_ 12 #define VPX_VP9_ENCODER_VP9_CONTEXT_TREE_H_ 13 14 #include "vp9/common/vp9_blockd.h" 15 #include "vp9/encoder/vp9_block.h" 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 struct VP9_COMP; 22 struct VP9Common; 23 struct ThreadData; 24 25 // Structure to hold snapshot of coding context during the mode picking process 26 typedef struct { 27 MODE_INFO mic; 28 MB_MODE_INFO_EXT mbmi_ext; 29 uint8_t *zcoeff_blk; 30 tran_low_t *coeff[MAX_MB_PLANE][3]; 31 tran_low_t *qcoeff[MAX_MB_PLANE][3]; 32 tran_low_t *dqcoeff[MAX_MB_PLANE][3]; 33 uint16_t *eobs[MAX_MB_PLANE][3]; 34 35 // dual buffer pointers, 0: in use, 1: best in store 36 tran_low_t *coeff_pbuf[MAX_MB_PLANE][3]; 37 tran_low_t *qcoeff_pbuf[MAX_MB_PLANE][3]; 38 tran_low_t *dqcoeff_pbuf[MAX_MB_PLANE][3]; 39 uint16_t *eobs_pbuf[MAX_MB_PLANE][3]; 40 41 int is_coded; 42 int num_4x4_blk; 43 int skip; 44 int pred_pixel_ready; 45 // For current partition, only if all Y, U, and V transform blocks' 46 // coefficients are quantized to 0, skippable is set to 0. 47 int skippable; 48 uint8_t skip_txfm[MAX_MB_PLANE << 2]; 49 int best_mode_index; 50 int hybrid_pred_diff; 51 int comp_pred_diff; 52 int single_pred_diff; 53 int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; 54 55 // TODO(jingning) Use RD_COST struct here instead. This involves a boarder 56 // scope of refactoring. 57 int rate; 58 int64_t dist; 59 int64_t rdcost; 60 61 #if CONFIG_VP9_TEMPORAL_DENOISING 62 unsigned int newmv_sse; 63 unsigned int zeromv_sse; 64 unsigned int zeromv_lastref_sse; 65 PREDICTION_MODE best_sse_inter_mode; 66 int_mv best_sse_mv; 67 MV_REFERENCE_FRAME best_reference_frame; 68 MV_REFERENCE_FRAME best_zeromv_reference_frame; 69 int sb_skip_denoising; 70 #endif 71 72 // motion vector cache for adaptive motion search control in partition 73 // search loop 74 MV pred_mv[MAX_REF_FRAMES]; 75 INTERP_FILTER pred_interp_filter; 76 77 // Used for the machine learning-based early termination 78 int32_t sum_y_eobs; 79 // Skip certain ref frames during RD search of rectangular partitions. 80 uint8_t skip_ref_frame_mask; 81 } PICK_MODE_CONTEXT; 82 83 typedef struct PC_TREE { 84 int index; 85 PARTITION_TYPE partitioning; 86 BLOCK_SIZE block_size; 87 PICK_MODE_CONTEXT none; 88 PICK_MODE_CONTEXT horizontal[2]; 89 PICK_MODE_CONTEXT vertical[2]; 90 union { 91 struct PC_TREE *split[4]; 92 PICK_MODE_CONTEXT *leaf_split[4]; 93 }; 94 // Obtained from a simple motion search. Used by the ML based partition search 95 // speed feature. 96 MV mv; 97 } PC_TREE; 98 99 void vp9_setup_pc_tree(struct VP9Common *cm, struct ThreadData *td); 100 void vp9_free_pc_tree(struct ThreadData *td); 101 102 #ifdef __cplusplus 103 } // extern "C" 104 #endif 105 106 #endif // VPX_VP9_ENCODER_VP9_CONTEXT_TREE_H_ 107