| 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
|
|
|