1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_ENCODER_VP9_BLOCK_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_ENCODER_VP9_BLOCK_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_blockd.h" 15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropymv.h" 16*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h" 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 19*fb1b10abSAndroid Build Coastguard Worker extern "C" { 20*fb1b10abSAndroid Build Coastguard Worker #endif 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker typedef struct { 23*fb1b10abSAndroid Build Coastguard Worker unsigned int sse; 24*fb1b10abSAndroid Build Coastguard Worker int sum; 25*fb1b10abSAndroid Build Coastguard Worker unsigned int var; 26*fb1b10abSAndroid Build Coastguard Worker } Diff; 27*fb1b10abSAndroid Build Coastguard Worker 28*fb1b10abSAndroid Build Coastguard Worker struct macroblock_plane { 29*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]); 30*fb1b10abSAndroid Build Coastguard Worker tran_low_t *qcoeff; 31*fb1b10abSAndroid Build Coastguard Worker tran_low_t *coeff; 32*fb1b10abSAndroid Build Coastguard Worker uint16_t *eobs; 33*fb1b10abSAndroid Build Coastguard Worker struct buf_2d src; 34*fb1b10abSAndroid Build Coastguard Worker 35*fb1b10abSAndroid Build Coastguard Worker // Quantizer settings 36*fb1b10abSAndroid Build Coastguard Worker int16_t *round_fp; 37*fb1b10abSAndroid Build Coastguard Worker int16_t *quant_fp; 38*fb1b10abSAndroid Build Coastguard Worker int16_t *quant; 39*fb1b10abSAndroid Build Coastguard Worker int16_t *quant_shift; 40*fb1b10abSAndroid Build Coastguard Worker int16_t *zbin; 41*fb1b10abSAndroid Build Coastguard Worker int16_t *round; 42*fb1b10abSAndroid Build Coastguard Worker 43*fb1b10abSAndroid Build Coastguard Worker int64_t quant_thred[2]; 44*fb1b10abSAndroid Build Coastguard Worker }; 45*fb1b10abSAndroid Build Coastguard Worker 46*fb1b10abSAndroid Build Coastguard Worker /* The [2] dimension is for whether we skip the EOB node (i.e. if previous 47*fb1b10abSAndroid Build Coastguard Worker * coefficient in this block was zero) or not. */ 48*fb1b10abSAndroid Build Coastguard Worker typedef unsigned int vp9_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][2] 49*fb1b10abSAndroid Build Coastguard Worker [COEFF_CONTEXTS][ENTROPY_TOKENS]; 50*fb1b10abSAndroid Build Coastguard Worker 51*fb1b10abSAndroid Build Coastguard Worker typedef struct { 52*fb1b10abSAndroid Build Coastguard Worker int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; 53*fb1b10abSAndroid Build Coastguard Worker uint8_t mode_context[MAX_REF_FRAMES]; 54*fb1b10abSAndroid Build Coastguard Worker } MB_MODE_INFO_EXT; 55*fb1b10abSAndroid Build Coastguard Worker 56*fb1b10abSAndroid Build Coastguard Worker typedef struct { 57*fb1b10abSAndroid Build Coastguard Worker int col_min; 58*fb1b10abSAndroid Build Coastguard Worker int col_max; 59*fb1b10abSAndroid Build Coastguard Worker int row_min; 60*fb1b10abSAndroid Build Coastguard Worker int row_max; 61*fb1b10abSAndroid Build Coastguard Worker } MvLimits; 62*fb1b10abSAndroid Build Coastguard Worker 63*fb1b10abSAndroid Build Coastguard Worker typedef struct macroblock MACROBLOCK; 64*fb1b10abSAndroid Build Coastguard Worker struct macroblock { 65*fb1b10abSAndroid Build Coastguard Worker // cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054 66*fb1b10abSAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1900 67*fb1b10abSAndroid Build Coastguard Worker int64_t bsse[MAX_MB_PLANE << 2]; 68*fb1b10abSAndroid Build Coastguard Worker #endif 69*fb1b10abSAndroid Build Coastguard Worker 70*fb1b10abSAndroid Build Coastguard Worker struct macroblock_plane plane[MAX_MB_PLANE]; 71*fb1b10abSAndroid Build Coastguard Worker 72*fb1b10abSAndroid Build Coastguard Worker MACROBLOCKD e_mbd; 73*fb1b10abSAndroid Build Coastguard Worker MB_MODE_INFO_EXT *mbmi_ext; 74*fb1b10abSAndroid Build Coastguard Worker MB_MODE_INFO_EXT *mbmi_ext_base; 75*fb1b10abSAndroid Build Coastguard Worker int skip_block; 76*fb1b10abSAndroid Build Coastguard Worker int select_tx_size; 77*fb1b10abSAndroid Build Coastguard Worker int skip_recode; 78*fb1b10abSAndroid Build Coastguard Worker int skip_optimize; 79*fb1b10abSAndroid Build Coastguard Worker int q_index; 80*fb1b10abSAndroid Build Coastguard Worker double log_block_src_var; 81*fb1b10abSAndroid Build Coastguard Worker int block_tx_domain; 82*fb1b10abSAndroid Build Coastguard Worker 83*fb1b10abSAndroid Build Coastguard Worker // The equivalent error at the current rdmult of one whole bit (not one 84*fb1b10abSAndroid Build Coastguard Worker // bitcost unit). 85*fb1b10abSAndroid Build Coastguard Worker int errorperbit; 86*fb1b10abSAndroid Build Coastguard Worker // The equivalent SAD error of one (whole) bit at the current quantizer 87*fb1b10abSAndroid Build Coastguard Worker // for large blocks. 88*fb1b10abSAndroid Build Coastguard Worker int sadperbit16; 89*fb1b10abSAndroid Build Coastguard Worker // The equivalent SAD error of one (whole) bit at the current quantizer 90*fb1b10abSAndroid Build Coastguard Worker // for sub-8x8 blocks. 91*fb1b10abSAndroid Build Coastguard Worker int sadperbit4; 92*fb1b10abSAndroid Build Coastguard Worker int rddiv; 93*fb1b10abSAndroid Build Coastguard Worker int rdmult; 94*fb1b10abSAndroid Build Coastguard Worker int cb_rdmult; 95*fb1b10abSAndroid Build Coastguard Worker int segment_id; 96*fb1b10abSAndroid Build Coastguard Worker int mb_energy; 97*fb1b10abSAndroid Build Coastguard Worker 98*fb1b10abSAndroid Build Coastguard Worker // These are set to their default values at the beginning, and then adjusted 99*fb1b10abSAndroid Build Coastguard Worker // further in the encoding process. 100*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE min_partition_size; 101*fb1b10abSAndroid Build Coastguard Worker BLOCK_SIZE max_partition_size; 102*fb1b10abSAndroid Build Coastguard Worker 103*fb1b10abSAndroid Build Coastguard Worker int mv_best_ref_index[MAX_REF_FRAMES]; 104*fb1b10abSAndroid Build Coastguard Worker unsigned int max_mv_context[MAX_REF_FRAMES]; 105*fb1b10abSAndroid Build Coastguard Worker unsigned int source_variance; 106*fb1b10abSAndroid Build Coastguard Worker unsigned int pred_sse[MAX_REF_FRAMES]; 107*fb1b10abSAndroid Build Coastguard Worker int pred_mv_sad[MAX_REF_FRAMES]; 108*fb1b10abSAndroid Build Coastguard Worker 109*fb1b10abSAndroid Build Coastguard Worker int nmvjointcost[MV_JOINTS]; 110*fb1b10abSAndroid Build Coastguard Worker int *nmvcost[2]; 111*fb1b10abSAndroid Build Coastguard Worker int *nmvcost_hp[2]; 112*fb1b10abSAndroid Build Coastguard Worker int **mvcost; 113*fb1b10abSAndroid Build Coastguard Worker 114*fb1b10abSAndroid Build Coastguard Worker int nmvjointsadcost[MV_JOINTS]; 115*fb1b10abSAndroid Build Coastguard Worker int *nmvsadcost[2]; 116*fb1b10abSAndroid Build Coastguard Worker int *nmvsadcost_hp[2]; 117*fb1b10abSAndroid Build Coastguard Worker int **mvsadcost; 118*fb1b10abSAndroid Build Coastguard Worker 119*fb1b10abSAndroid Build Coastguard Worker // sharpness is used to disable skip mode and change rd_mult 120*fb1b10abSAndroid Build Coastguard Worker int sharpness; 121*fb1b10abSAndroid Build Coastguard Worker 122*fb1b10abSAndroid Build Coastguard Worker // aq mode is used to adjust rd based on segment. 123*fb1b10abSAndroid Build Coastguard Worker int adjust_rdmult_by_segment; 124*fb1b10abSAndroid Build Coastguard Worker 125*fb1b10abSAndroid Build Coastguard Worker // These define limits to motion vector components to prevent them 126*fb1b10abSAndroid Build Coastguard Worker // from extending outside the UMV borders 127*fb1b10abSAndroid Build Coastguard Worker MvLimits mv_limits; 128*fb1b10abSAndroid Build Coastguard Worker 129*fb1b10abSAndroid Build Coastguard Worker // Notes transform blocks where no coefficients are coded. 130*fb1b10abSAndroid Build Coastguard Worker // Set during mode selection. Read during block encoding. 131*fb1b10abSAndroid Build Coastguard Worker uint8_t zcoeff_blk[TX_SIZES][256]; 132*fb1b10abSAndroid Build Coastguard Worker 133*fb1b10abSAndroid Build Coastguard Worker // Accumulate the tx block eobs in a partition block. 134*fb1b10abSAndroid Build Coastguard Worker int32_t sum_y_eobs[TX_SIZES]; 135*fb1b10abSAndroid Build Coastguard Worker 136*fb1b10abSAndroid Build Coastguard Worker int skip; 137*fb1b10abSAndroid Build Coastguard Worker 138*fb1b10abSAndroid Build Coastguard Worker int encode_breakout; 139*fb1b10abSAndroid Build Coastguard Worker 140*fb1b10abSAndroid Build Coastguard Worker // note that token_costs is the cost when eob node is skipped 141*fb1b10abSAndroid Build Coastguard Worker vp9_coeff_cost token_costs[TX_SIZES]; 142*fb1b10abSAndroid Build Coastguard Worker 143*fb1b10abSAndroid Build Coastguard Worker int optimize; 144*fb1b10abSAndroid Build Coastguard Worker 145*fb1b10abSAndroid Build Coastguard Worker // indicate if it is in the rd search loop or encoding process 146*fb1b10abSAndroid Build Coastguard Worker int use_lp32x32fdct; 147*fb1b10abSAndroid Build Coastguard Worker int skip_encode; 148*fb1b10abSAndroid Build Coastguard Worker 149*fb1b10abSAndroid Build Coastguard Worker // In first pass, intra prediction is done based on source pixels 150*fb1b10abSAndroid Build Coastguard Worker // at tile boundaries 151*fb1b10abSAndroid Build Coastguard Worker int fp_src_pred; 152*fb1b10abSAndroid Build Coastguard Worker 153*fb1b10abSAndroid Build Coastguard Worker // use fast quantization process 154*fb1b10abSAndroid Build Coastguard Worker int quant_fp; 155*fb1b10abSAndroid Build Coastguard Worker 156*fb1b10abSAndroid Build Coastguard Worker // skip forward transform and quantization 157*fb1b10abSAndroid Build Coastguard Worker uint8_t skip_txfm[MAX_MB_PLANE << 2]; 158*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_NONE 0 159*fb1b10abSAndroid Build Coastguard Worker // TODO(chengchen): consider remove SKIP_TXFM_AC_DC from vp9 completely 160*fb1b10abSAndroid Build Coastguard Worker // since it increases risks of bad perceptual quality. 161*fb1b10abSAndroid Build Coastguard Worker // https://crbug.com/webm/1729 162*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_AC_DC 1 163*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_AC_ONLY 2 164*fb1b10abSAndroid Build Coastguard Worker 165*fb1b10abSAndroid Build Coastguard Worker // cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054 166*fb1b10abSAndroid Build Coastguard Worker #if !defined(_MSC_VER) || _MSC_VER >= 1900 167*fb1b10abSAndroid Build Coastguard Worker int64_t bsse[MAX_MB_PLANE << 2]; 168*fb1b10abSAndroid Build Coastguard Worker #endif 169*fb1b10abSAndroid Build Coastguard Worker 170*fb1b10abSAndroid Build Coastguard Worker // Used to store sub partition's choices. 171*fb1b10abSAndroid Build Coastguard Worker MV pred_mv[MAX_REF_FRAMES]; 172*fb1b10abSAndroid Build Coastguard Worker 173*fb1b10abSAndroid Build Coastguard Worker // Strong color activity detection. Used in RTC coding mode to enhance 174*fb1b10abSAndroid Build Coastguard Worker // the visual quality at the boundary of moving color objects. 175*fb1b10abSAndroid Build Coastguard Worker uint8_t color_sensitivity[2]; 176*fb1b10abSAndroid Build Coastguard Worker 177*fb1b10abSAndroid Build Coastguard Worker uint8_t sb_is_skin; 178*fb1b10abSAndroid Build Coastguard Worker 179*fb1b10abSAndroid Build Coastguard Worker uint8_t skip_low_source_sad; 180*fb1b10abSAndroid Build Coastguard Worker 181*fb1b10abSAndroid Build Coastguard Worker uint8_t lowvar_highsumdiff; 182*fb1b10abSAndroid Build Coastguard Worker 183*fb1b10abSAndroid Build Coastguard Worker uint8_t last_sb_high_content; 184*fb1b10abSAndroid Build Coastguard Worker 185*fb1b10abSAndroid Build Coastguard Worker int sb_use_mv_part; 186*fb1b10abSAndroid Build Coastguard Worker 187*fb1b10abSAndroid Build Coastguard Worker int sb_mvcol_part; 188*fb1b10abSAndroid Build Coastguard Worker 189*fb1b10abSAndroid Build Coastguard Worker int sb_mvrow_part; 190*fb1b10abSAndroid Build Coastguard Worker 191*fb1b10abSAndroid Build Coastguard Worker int sb_pickmode_part; 192*fb1b10abSAndroid Build Coastguard Worker 193*fb1b10abSAndroid Build Coastguard Worker int zero_temp_sad_source; 194*fb1b10abSAndroid Build Coastguard Worker 195*fb1b10abSAndroid Build Coastguard Worker // For each superblock: saves the content value (e.g., low/high sad/sumdiff) 196*fb1b10abSAndroid Build Coastguard Worker // based on source sad, prior to encoding the frame. 197*fb1b10abSAndroid Build Coastguard Worker uint8_t content_state_sb; 198*fb1b10abSAndroid Build Coastguard Worker 199*fb1b10abSAndroid Build Coastguard Worker // Used to save the status of whether a block has a low variance in 200*fb1b10abSAndroid Build Coastguard Worker // choose_partitioning. 0 for 64x64, 1~2 for 64x32, 3~4 for 32x64, 5~8 for 201*fb1b10abSAndroid Build Coastguard Worker // 32x32, 9~24 for 16x16. 202*fb1b10abSAndroid Build Coastguard Worker uint8_t variance_low[25]; 203*fb1b10abSAndroid Build Coastguard Worker 204*fb1b10abSAndroid Build Coastguard Worker uint8_t arf_frame_usage; 205*fb1b10abSAndroid Build Coastguard Worker uint8_t lastgolden_frame_usage; 206*fb1b10abSAndroid Build Coastguard Worker 207*fb1b10abSAndroid Build Coastguard Worker void (*fwd_txfm4x4)(const int16_t *input, tran_low_t *output, int stride); 208*fb1b10abSAndroid Build Coastguard Worker void (*inv_txfm_add)(const tran_low_t *input, uint8_t *dest, int stride, 209*fb1b10abSAndroid Build Coastguard Worker int eob); 210*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH 211*fb1b10abSAndroid Build Coastguard Worker void (*highbd_inv_txfm_add)(const tran_low_t *input, uint16_t *dest, 212*fb1b10abSAndroid Build Coastguard Worker int stride, int eob, int bd); 213*fb1b10abSAndroid Build Coastguard Worker #endif 214*fb1b10abSAndroid Build Coastguard Worker DECLARE_ALIGNED(16, uint8_t, est_pred[64 * 64]); 215*fb1b10abSAndroid Build Coastguard Worker 216*fb1b10abSAndroid Build Coastguard Worker struct scale_factors *me_sf; 217*fb1b10abSAndroid Build Coastguard Worker }; 218*fb1b10abSAndroid Build Coastguard Worker 219*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 220*fb1b10abSAndroid Build Coastguard Worker } // extern "C" 221*fb1b10abSAndroid Build Coastguard Worker #endif 222*fb1b10abSAndroid Build Coastguard Worker 223*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP9_ENCODER_VP9_BLOCK_H_ 224