15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/* 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Use of this source code is governed by a BSD-style license 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * that can be found in the LICENSE file in the root of the source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * tree. An additional intellectual property rights grant can be found 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * in the file PATENTS. All contributing project authors may 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * be found in the AUTHORS file in the root of the source tree. 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer */ 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef VP8_ENCODER_BLOCK_H_ 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define VP8_ENCODER_BLOCK_H_ 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "vp8/common/onyx.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "vp8/common/blockd.h" 1794deaf675ae60e11c2d9475c6dbfd0c7123160f5Anders Carlsson#include "vp8/common/entropymv.h" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "vp8/common/entropy.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "vpx_ports/mem.h" 20161755a09898c95d21bfff33707da9ca41cd53c5John McCall 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifdef __cplusplus 22525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattnerextern "C" { 233b8d116703db8018f855cbb4733ace426422623bNate Begeman#endif 24b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar 25c5ae899b4bbf65488445316c63168079177db0edSteve Naroff#define MAX_MODES 20 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define MAX_ERROR_BINS 1024 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 28590b6646ef747d2f7b42e5f40487ff07642d7b6fChris Lattner/* motion search site */ 29c44eec6dd29ee9415cbd38a35deff4c8b67abb6aAnders Carlssontypedef struct 30c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar{ 31c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar MV mv; 32c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar int offset; 338e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor} search_site; 34c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar 3556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Narofftypedef struct block 3688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor{ 3788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ 38833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall short *src_diff; 39d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall short *coeff; 4088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer /* 16 Y blocks, 4 U blocks, 4 V blocks each with 16 entries */ 425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer short *quant; 435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer short *quant_fast; 445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer short *quant_shift; 455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer short *zbin; 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer short *zrun_zbin_boost; 47898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor short *round; 489ea62768fca25d829d80199cf4f8cf0f4dd39251Douglas Gregor 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* Zbin Over Quant value */ 50898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor short zbin_extra; 51898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 52898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor unsigned char **base_src; 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int src; 54898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int src_stride; 55898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} BLOCK; 56898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 57898574e7496ba8fd76290079d3a9d06954992734Douglas Gregortypedef struct 58b3eef68111ffc220e449be96da1747998c057790Douglas Gregor{ 59898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int count; 60898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor struct 61898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor { 620b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor B_PREDICTION_MODE mode; 630b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor int_mv mv; 640b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor } bmi[16]; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} PARTITION_INFO; 6643d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor 6743d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregortypedef struct macroblock 6843d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor{ 6943d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor DECLARE_ALIGNED(16, short, src_diff[400]); /* 25 blocks Y,U,V,Y2 */ 7043d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor DECLARE_ALIGNED(16, short, coeff[400]); /* 25 blocks Y,U,V,Y2 */ 7143d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor DECLARE_ALIGNED(16, unsigned char, thismb[256]); 7243d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor 7343d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor unsigned char *thismb_ptr; 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* 16 Y, 4 U, 4 V, 1 DC 2nd order block */ 75f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor BLOCK block[25]; 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 779d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor YV12_BUFFER_CONFIG src; 789d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor 799d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor MACROBLOCKD e_mbd; 809d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor PARTITION_INFO *partition_info; /* work pointer */ 819d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor PARTITION_INFO *pi; /* Corresponds to upper left visible macroblock */ 829d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor PARTITION_INFO *pip; /* Base of allocated array */ 839d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor 84905d11d53aeb6b26744f44fedc2b2820c7a62df6Douglas Gregor int ref_frame_cost[MAX_REF_FRAMES]; 858320aaaa01d931aa234fc3bce05b399ef41898d5Daniel Dunbar 86f7c2aa0b049272d8f318988c1965760dcb852578Douglas Gregor search_site *ss; 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int ss_count; 889d293dfc0ad7c44ae0b5eb9517f1ed8c8d8b7ff7Douglas Gregor int searches_per_step; 8977ed8e4edf6ed78c53fb20ec3210aff2a59c9d87Ted Kremenek 90898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int errorperbit; 91898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int sadperbit16; 92898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int sadperbit4; 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int rddiv; 94898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int rdmult; 95898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor unsigned int * mb_activity_ptr; 96898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int * mb_norm_activity_ptr; 97898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor signed int act_zbin_adj; 98898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor signed int last_act_zbin_adj; 990b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 1000b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor int *mvcost[2]; 1010b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor int *mvsadcost[2]; 102898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int (*mbmode_cost)[MB_MODE_COUNT]; 103898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int (*intra_uv_mode_cost)[MB_MODE_COUNT]; 104898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int (*bmode_costs)[10][10]; 105898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int *inter_bmode_costs; 106898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int (*token_costs)[COEF_BANDS][PREV_COEF_CONTEXTS] 107898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor [MAX_ENTROPY_TOKENS]; 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 109898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor /* These define limits to motion vector components to prevent 110898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor * them from extending outside the UMV borders. 111898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor */ 112898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int mv_col_min; 113898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int mv_col_max; 114898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor int mv_row_min; 1150b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor int mv_row_max; 1160b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 1170b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor int skip; 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned int encode_breakout; 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer signed char *gf_active_ptr; 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned char *active_ptr; 1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MV_CONTEXT *mvc; 1255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int optimize; 127026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner int q_index; 128026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner 129026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner#if CONFIG_TEMPORAL_DENOISING 130026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner int increase_denoising; 131026dc96ac6ece60da5e1b98e2a71bd0ff0939fd8Chris Lattner MB_PREDICTION_MODE best_sse_inter_mode; 132df317bf71653eeb235da8337b1e8e790f9653aa4Mike Stump int_mv best_sse_mv; 1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MV_REFERENCE_FRAME best_reference_frame; 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer MV_REFERENCE_FRAME best_zeromv_reference_frame; 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned char need_to_clamp_best_mvs; 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int skip_true_count; 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned int coef_counts [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENTROPY_TOKENS]; 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned int MVcount [2] [MVvals]; /* (row,col) MV cts this frame */ 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int ymode_count [VP8_YMODES]; /* intra MB type cts this frame */ 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int uv_mode_count[VP8_UV_MODES]; /* intra MB type cts this frame */ 14308ad47cbd1f81fcb31dbc731c13b885a07e12704Bill Wendling int64_t prediction_error; 14476458501a8963fa11b91c9337a487de6871169b4Sebastian Redl int64_t intra_error; 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int count_mb_ref_frame_usage[MAX_REF_FRAMES]; 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int rd_thresh_mult[MAX_MODES]; 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int rd_threshes[MAX_MODES]; 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned int mbs_tested_so_far; 150fec0b49c3fa621fbf63e420f3d54a5bb3a0265d2Steve Naroff unsigned int mode_test_hit_counts[MAX_MODES]; 15186f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor int zbin_mode_boost_enabled; 1522514a309204341798f96912ce7a90841bea59727Fariborz Jahanian int zbin_mode_boost; 153e9ff443040cb571ae2c5c2626c4dc9a9a812d84aFariborz Jahanian int last_zbin_mode_boost; 154e873fb74219f48407ae0b8fa083aa7f0b6ff1427Douglas Gregor 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer int last_zbin_over_quant; 15628be73f74c9e241a23ea24fe5756623de6bf1084Chris Lattner int zbin_over_quant; 15753202857c60214d80950a975e6e52aebf30bd16aEli Friedman int error_bins[MAX_ERROR_BINS]; 15853202857c60214d80950a975e6e52aebf30bd16aEli Friedman 15953202857c60214d80950a975e6e52aebf30bd16aEli Friedman void (*short_fdct4x4)(short *input, short *output, int pitch); 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void (*short_fdct8x4)(short *input, short *output, int pitch); 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void (*short_walsh4x4)(short *input, short *output, int pitch); 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void (*quantize_b)(BLOCK *b, BLOCKD *d); 1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void (*quantize_b_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1); 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} MACROBLOCK; 16644e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar 16744e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar 16844e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar#ifdef __cplusplus 16944e35f7b2b5da1eb338639e46bf0b5522e75c5f3Daniel Dunbar} // extern "C" 1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif // VP8_ENCODER_BLOCK_H_ 1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer