Index: source/libvpx/vp9/encoder/vp9_rdopt.h |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_rdopt.h (revision 278778) |
+++ source/libvpx/vp9/encoder/vp9_rdopt.h (working copy) |
@@ -11,8 +11,13 @@ |
#ifndef VP9_ENCODER_VP9_RDOPT_H_ |
#define VP9_ENCODER_VP9_RDOPT_H_ |
-#include "vp9/encoder/vp9_encoder.h" |
+#include <limits.h> |
+#include "vp9/common/vp9_blockd.h" |
+ |
+#include "vp9/encoder/vp9_block.h" |
+#include "vp9/encoder/vp9_context_tree.h" |
+ |
#ifdef __cplusplus |
extern "C" { |
#endif |
@@ -28,21 +33,104 @@ |
#define INVALID_MV 0x80008000 |
+#define MAX_MODES 30 |
+#define MAX_REFS 6 |
+ |
+// This enumerator type needs to be kept aligned with the mode order in |
+// const MODE_DEFINITION vp9_mode_order[MAX_MODES] used in the rd code. |
+typedef enum { |
+ THR_NEARESTMV, |
+ THR_NEARESTA, |
+ THR_NEARESTG, |
+ |
+ THR_DC, |
+ |
+ THR_NEWMV, |
+ THR_NEWA, |
+ THR_NEWG, |
+ |
+ THR_NEARMV, |
+ THR_NEARA, |
+ THR_COMP_NEARESTLA, |
+ THR_COMP_NEARESTGA, |
+ |
+ THR_TM, |
+ |
+ THR_COMP_NEARLA, |
+ THR_COMP_NEWLA, |
+ THR_NEARG, |
+ THR_COMP_NEARGA, |
+ THR_COMP_NEWGA, |
+ |
+ THR_ZEROMV, |
+ THR_ZEROG, |
+ THR_ZEROA, |
+ THR_COMP_ZEROLA, |
+ THR_COMP_ZEROGA, |
+ |
+ THR_H_PRED, |
+ THR_V_PRED, |
+ THR_D135_PRED, |
+ THR_D207_PRED, |
+ THR_D153_PRED, |
+ THR_D63_PRED, |
+ THR_D117_PRED, |
+ THR_D45_PRED, |
+} THR_MODES; |
+ |
+typedef enum { |
+ THR_LAST, |
+ THR_GOLD, |
+ THR_ALTR, |
+ THR_COMP_LA, |
+ THR_COMP_GA, |
+ THR_INTRA, |
+} THR_MODES_SUB8X8; |
+ |
+typedef struct RD_OPT { |
+ // Thresh_mult is used to set a threshold for the rd score. A higher value |
+ // means that we will accept the best mode so far more often. This number |
+ // is used in combination with the current block size, and thresh_freq_fact |
+ // to pick a threshold. |
+ int thresh_mult[MAX_MODES]; |
+ int thresh_mult_sub8x8[MAX_REFS]; |
+ |
+ int threshes[MAX_SEGMENTS][BLOCK_SIZES][MAX_MODES]; |
+ int thresh_freq_fact[BLOCK_SIZES][MAX_MODES]; |
+ |
+ int64_t comp_pred_diff[REFERENCE_MODES]; |
+ int64_t prediction_type_threshes[MAX_REF_FRAMES][REFERENCE_MODES]; |
+ int64_t tx_select_diff[TX_MODES]; |
+ // FIXME(rbultje) can this overflow? |
+ int tx_select_threshes[MAX_REF_FRAMES][TX_MODES]; |
+ |
+ int64_t filter_diff[SWITCHABLE_FILTER_CONTEXTS]; |
+ int64_t filter_threshes[MAX_REF_FRAMES][SWITCHABLE_FILTER_CONTEXTS]; |
+ int64_t filter_cache[SWITCHABLE_FILTER_CONTEXTS]; |
+ int64_t mask_filter; |
+ |
+ int RDMULT; |
+ int RDDIV; |
+} RD_OPT; |
+ |
+ |
struct TileInfo; |
+struct VP9_COMP; |
+struct macroblock; |
-int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex); |
+int vp9_compute_rd_mult(const struct VP9_COMP *cpi, int qindex); |
-void vp9_initialize_rd_consts(VP9_COMP *cpi); |
+void vp9_initialize_rd_consts(struct VP9_COMP *cpi); |
-void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex); |
+void vp9_initialize_me_consts(struct VP9_COMP *cpi, int qindex); |
void vp9_model_rd_from_var_lapndz(unsigned int var, unsigned int n, |
unsigned int qstep, int *rate, |
int64_t *dist); |
-int vp9_get_switchable_rate(const VP9_COMP *cpi); |
+int vp9_get_switchable_rate(const struct VP9_COMP *cpi); |
-void vp9_setup_buffer_inter(VP9_COMP *cpi, MACROBLOCK *x, |
+void vp9_setup_buffer_inter(struct VP9_COMP *cpi, struct macroblock *x, |
const TileInfo *const tile, |
MV_REFERENCE_FRAME ref_frame, |
BLOCK_SIZE block_size, |
@@ -51,14 +139,14 @@ |
int_mv frame_near_mv[MAX_REF_FRAMES], |
struct buf_2d yv12_mb[4][MAX_MB_PLANE]); |
-const YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const VP9_COMP *cpi, |
+const YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const struct VP9_COMP *cpi, |
int ref_frame); |
-void vp9_rd_pick_intra_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, |
+void vp9_rd_pick_intra_mode_sb(struct VP9_COMP *cpi, struct macroblock *x, |
int *r, int64_t *d, BLOCK_SIZE bsize, |
PICK_MODE_CONTEXT *ctx, int64_t best_rd); |
-int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, |
+int64_t vp9_rd_pick_inter_mode_sb(struct VP9_COMP *cpi, struct macroblock *x, |
const struct TileInfo *const tile, |
int mi_row, int mi_col, |
int *returnrate, |
@@ -67,7 +155,8 @@ |
PICK_MODE_CONTEXT *ctx, |
int64_t best_rd_so_far); |
-int64_t vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi, MACROBLOCK *x, |
+int64_t vp9_rd_pick_inter_mode_sub8x8(struct VP9_COMP *cpi, |
+ struct macroblock *x, |
const struct TileInfo *const tile, |
int mi_row, int mi_col, |
int *returnrate, |
@@ -83,51 +172,13 @@ |
ENTROPY_CONTEXT t_above[16], |
ENTROPY_CONTEXT t_left[16]); |
-void vp9_set_rd_speed_thresholds(VP9_COMP *cpi); |
+void vp9_set_rd_speed_thresholds(struct VP9_COMP *cpi); |
-void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi); |
+void vp9_set_rd_speed_thresholds_sub8x8(struct VP9_COMP *cpi); |
-static INLINE int full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x, |
- BLOCK_SIZE bsize, MV *mvp_full, |
- int step_param, int error_per_bit, |
- const MV *ref_mv, MV *tmp_mv, |
- int var_max, int rd) { |
- int var = 0; |
- |
- if (cpi->sf.search_method == FAST_DIAMOND) { |
- var = vp9_fast_dia_search(x, mvp_full, step_param, error_per_bit, 0, |
- &cpi->fn_ptr[bsize], 1, ref_mv, tmp_mv); |
- if (rd && var < var_max) |
- var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, &cpi->fn_ptr[bsize], 1); |
- } else if (cpi->sf.search_method == FAST_HEX) { |
- var = vp9_fast_hex_search(x, mvp_full, step_param, error_per_bit, 0, |
- &cpi->fn_ptr[bsize], 1, ref_mv, tmp_mv); |
- if (rd && var < var_max) |
- var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, &cpi->fn_ptr[bsize], 1); |
- } else if (cpi->sf.search_method == HEX) { |
- var = vp9_hex_search(x, mvp_full, step_param, error_per_bit, 1, |
- &cpi->fn_ptr[bsize], 1, ref_mv, tmp_mv); |
- if (rd && var < var_max) |
- var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, &cpi->fn_ptr[bsize], 1); |
- } else if (cpi->sf.search_method == SQUARE) { |
- var = vp9_square_search(x, mvp_full, step_param, error_per_bit, 1, |
- &cpi->fn_ptr[bsize], 1, ref_mv, tmp_mv); |
- if (rd && var < var_max) |
- var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, &cpi->fn_ptr[bsize], 1); |
- } else if (cpi->sf.search_method == BIGDIA) { |
- var = vp9_bigdia_search(x, mvp_full, step_param, error_per_bit, 1, |
- &cpi->fn_ptr[bsize], 1, ref_mv, tmp_mv); |
- if (rd && var < var_max) |
- var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, &cpi->fn_ptr[bsize], 1); |
- } else { |
- int further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; |
- |
- var = vp9_full_pixel_diamond(cpi, x, mvp_full, step_param, error_per_bit, |
- further_steps, 1, &cpi->fn_ptr[bsize], |
- ref_mv, tmp_mv); |
- } |
- |
- return var; |
+static INLINE int rd_less_than_thresh(int64_t best_rd, int thresh, |
+ int thresh_fact) { |
+ return best_rd < ((int64_t)thresh * thresh_fact >> 5) || thresh == INT_MAX; |
} |
#ifdef __cplusplus |