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 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifndef VP8_ENCODER_BLOCK_H_ 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define VP8_ENCODER_BLOCK_H_ 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/onyx.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/blockd.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/entropymv.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8/common/entropy.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_ports/mem.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 22233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern "C" { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_MODES 20 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define MAX_ERROR_BINS 1024 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* motion search site */ 29233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV mv; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan int offset; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan} search_site; 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan 35233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct block 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *src_diff; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *coeff; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *quant; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *quant_fast; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *quant_shift; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *zbin; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *zrun_zbin_boost; 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *round; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Zbin Over Quant value */ 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan short zbin_extra; 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char **base_src; 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_stride; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan} BLOCK; 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan 57233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count; 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan struct 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan B_PREDICTION_MODE mode; 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv mv; 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan } bmi[16]; 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan} PARTITION_INFO; 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan 67233d2500723e5594f3e7c70896ffeeef32b9c950ywantypedef struct macroblock 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */ 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */ 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan DECLARE_ALIGNED(16, unsigned char, thismb[256]); 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *thismb_ptr; 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */ 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan BLOCK block[25]; 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG src; 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan MACROBLOCKD e_mbd; 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan PARTITION_INFO *partition_info; /* work pointer */ 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan PARTITION_INFO *pi; /* Corresponds to upper left visible macroblock */ 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan PARTITION_INFO *pip; /* Base of allocated array */ 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ref_frame_cost[MAX_REF_FRAMES]; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan search_site *ss; 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ss_count; 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan int searches_per_step; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan int errorperbit; 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sadperbit16; 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sadperbit4; 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rddiv; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rdmult; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int * mb_activity_ptr; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan int * mb_norm_activity_ptr; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed int act_zbin_adj; 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed int last_act_zbin_adj; 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *mvcost[2]; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *mvsadcost[2]; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan int (*mbmode_cost)[MB_MODE_COUNT]; 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan int (*intra_uv_mode_cost)[MB_MODE_COUNT]; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan int (*bmode_costs)[10][10]; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan int *inter_bmode_costs; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS] 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan [MAX_ENTROPY_TOKENS]; 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* These define limits to motion vector components to prevent 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan * them from extending outside the UMV borders. 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col_min; 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_col_max; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row_min; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mv_row_max; 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip; 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int encode_breakout; 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan signed char *gf_active_ptr; 122233d2500723e5594f3e7c70896ffeeef32b9c950ywan 123233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *active_ptr; 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_CONTEXT *mvc; 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan 126233d2500723e5594f3e7c70896ffeeef32b9c950ywan int optimize; 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q_index; 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_TEMPORAL_DENOISING 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan MB_PREDICTION_MODE best_sse_inter_mode; 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan int_mv best_sse_mv; 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME best_reference_frame; 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV_REFERENCE_FRAME best_zeromv_reference_frame; 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char need_to_clamp_best_mvs; 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan int skip_true_count; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */ 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ymode_count [VP8_YMODES]; /* intra MB type cts this frame */ 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */ 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t prediction_error; 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan int64_t intra_error; 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan int count_mb_ref_frame_usage[MAX_REF_FRAMES]; 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_thresh_mult[MAX_MODES]; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan int rd_threshes[MAX_MODES]; 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int mbs_tested_so_far; 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int mode_test_hit_counts[MAX_MODES]; 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan int zbin_mode_boost_enabled; 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan int zbin_mode_boost; 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan int last_zbin_mode_boost; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan int last_zbin_over_quant; 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan int zbin_over_quant; 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan int error_bins[MAX_ERROR_BINS]; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*short_fdct4x4)(short *input, short *output, int pitch); 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*short_fdct8x4)(short *input, short *output, int pitch); 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*short_walsh4x4)(short *input, short *output, int pitch); 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*quantize_b)(BLOCK *b, BLOCKD *d); 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan void (*quantize_b_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1); 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan} MACROBLOCK; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan#ifdef __cplusplus 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan} // extern "C" 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif // VP8_ENCODER_BLOCK_H_ 172