1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP9_ENCODER_VP9_BLOCK_H_ 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP9_ENCODER_VP9_BLOCK_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropymv.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_entropy.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp9/common/vp9_onyxc_int.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 20233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan// motion search site 24233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct { 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV mv; 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset; 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan} search_site; 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan// Structure to hold snapshot of coding context during the mode picking process 30233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct { 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO mic; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t *zcoeff_blk; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *coeff[MAX_MB_PLANE][3]; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *qcoeff[MAX_MB_PLANE][3]; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *dqcoeff[MAX_MB_PLANE][3]; 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint16_t *eobs[MAX_MB_PLANE][3]; 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan // dual buffer pointers, 0: in use, 1: best in store 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *coeff_pbuf[MAX_MB_PLANE][3]; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *qcoeff_pbuf[MAX_MB_PLANE][3]; 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *dqcoeff_pbuf[MAX_MB_PLANE][3]; 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint16_t *eobs_pbuf[MAX_MB_PLANE][3]; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan int is_coded; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan int num_4x4_blk; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_ref_mv[2]; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES]; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rate; 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan int distortion; 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan int best_mode_index; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rddiv; 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rdmult; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan int hybrid_pred_diff; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan int comp_pred_diff; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan int single_pred_diff; 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t tx_rd_diff[TX_MODES]; 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS]; 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan // motion vector cache for adaptive motion search control in partition 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan // search loop 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv pred_mv[MAX_REF_FRAMES]; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan INTERP_FILTER pred_interp_filter; 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan} PICK_MODE_CONTEXT; 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan 66233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct macroblock_plane { 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]); 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *qcoeff; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *coeff; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint16_t *eobs; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct buf_2d src; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Quantizer setings 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *quant; 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *quant_shift; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *zbin; 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t *round; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Zbin Over Quant value 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan int16_t zbin_extra; 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* The [2] dimension is for whether we skip the EOB node (i.e. if previous 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan * coefficient in this block was zero) or not. */ 85233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef unsigned int vp9_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][2] 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan [COEFF_CONTEXTS][ENTROPY_TOKENS]; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan 88233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct macroblock MACROBLOCK; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywanstruct macroblock { 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct macroblock_plane plane[MAX_MB_PLANE]; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD e_mbd; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip_block; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan int select_txfm_size; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip_recode; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip_optimize; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q_index; 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan search_site *ss; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ss_count; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan int searches_per_step; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan int errorperbit; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sadperbit16; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sadperbit4; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rddiv; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rdmult; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int mb_energy; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int *mb_activity_ptr; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *mb_norm_activity_ptr; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed int act_zbin_adj; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_best_ref_index[MAX_REF_FRAMES]; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int max_mv_context[MAX_REF_FRAMES]; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int source_variance; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int pred_sse[MAX_REF_FRAMES]; 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan int pred_mv_sad[MAX_REF_FRAMES]; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvjointcost[MV_JOINTS]; 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvcosts[2][MV_VALS]; 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *nmvcost[2]; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvcosts_hp[2][MV_VALS]; 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *nmvcost_hp[2]; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan int **mvcost; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvjointsadcost[MV_JOINTS]; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvsadcosts[2][MV_VALS]; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *nmvsadcost[2]; 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan int nmvsadcosts_hp[2][MV_VALS]; 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *nmvsadcost_hp[2]; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan int **mvsadcost; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mbmode_cost[INTRA_MODES]; 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned inter_mode_cost[INTER_MODE_CONTEXTS][INTER_MODES]; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan int intra_uv_mode_cost[FRAME_TYPES][INTRA_MODES]; 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_mode_costs[INTRA_MODES][INTRA_MODES][INTRA_MODES]; 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan int switchable_interp_costs[SWITCHABLE_FILTER_CONTEXTS][SWITCHABLE_FILTERS]; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char sb_index; // index of 32x32 block inside the 64x64 block 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char mb_index; // index of 16x16 block inside the 32x32 block 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char b_index; // index of 8x8 block inside the 16x16 block 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char ab_index; // index of 4x4 block inside the 8x8 block 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan // These define limits to motion vector components to prevent them 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan // from extending outside the UMV borders 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col_min; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col_max; 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row_min; 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row_max; 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan uint8_t zcoeff_blk[TX_SIZES][256]; 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan int encode_breakout; 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan int in_active_map; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan // note that token_costs is the cost when eob node is skipped 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp9_coeff_cost token_costs[TX_SIZES]; 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan int optimize; 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan // indicate if it is in the rd search loop or encoding process 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan int use_lp32x32fdct; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip_encode; 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan // Used to store sub partition's choices. 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv pred_mv[MAX_REF_FRAMES]; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan // TODO(jingning): Need to refactor the structure arrays that buffers the 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan // coding mode decisions of each partition type. 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT ab4x4_context[4][4][4]; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb8x4_context[4][4][4]; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb4x8_context[4][4][4]; 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb8x8_context[4][4][4]; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb8x16_context[4][4][2]; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb16x8_context[4][4][2]; 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT mb_context[4][4]; 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb32x16_context[4][2]; 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb16x32_context[4][2]; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan // when 4 MBs share coding parameters: 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb32_context[4]; 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb32x64_context[2]; 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb64x32_context[2]; 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan PICK_MODE_CONTEXT sb64_context; 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan int partition_cost[PARTITION_CONTEXTS][PARTITION_TYPES]; 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE b_partitioning[4][4][4]; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE mb_partitioning[4][4]; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE sb_partitioning[4]; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE sb64_partitioning; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*fwd_txm4x4)(const int16_t *input, int16_t *output, int stride); 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan// TODO(jingning): the variables used here are little complicated. need further 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan// refactoring on organizing the temporary buffers, when recursive 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan// partition down to 4x4 block size is enabled. 199233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic INLINE PICK_MODE_CONTEXT *get_block_context(MACROBLOCK *x, 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK_SIZE bsize) { 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (bsize) { 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_64X64: 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb64_context; 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_64X32: 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb64x32_context[x->sb_index]; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_32X64: 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb32x64_context[x->sb_index]; 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_32X32: 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb32_context[x->sb_index]; 210233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_32X16: 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb32x16_context[x->sb_index][x->mb_index]; 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_16X32: 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb16x32_context[x->sb_index][x->mb_index]; 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_16X16: 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->mb_context[x->sb_index][x->mb_index]; 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_16X8: 217233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb16x8_context[x->sb_index][x->mb_index][x->b_index]; 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_8X16: 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb8x16_context[x->sb_index][x->mb_index][x->b_index]; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_8X8: 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb8x8_context[x->sb_index][x->mb_index][x->b_index]; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_8X4: 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb8x4_context[x->sb_index][x->mb_index][x->b_index]; 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_4X8: 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->sb4x8_context[x->sb_index][x->mb_index][x->b_index]; 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan case BLOCK_4X4: 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan return &x->ab4x4_context[x->sb_index][x->mb_index][x->b_index]; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan default: 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan assert(0); 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan return NULL; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP9_ENCODER_VP9_BLOCK_H_ 239