Index: source/libvpx/vp9/encoder/vp9_rd.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_rd.c (revision 292072) |
+++ source/libvpx/vp9/encoder/vp9_rd.c (working copy) |
@@ -93,34 +93,69 @@ |
} |
// Values are now correlated to quantizer. |
-static int sad_per_bit16lut[QINDEX_RANGE]; |
-static int sad_per_bit4lut[QINDEX_RANGE]; |
+static int sad_per_bit16lut_8[QINDEX_RANGE]; |
+static int sad_per_bit4lut_8[QINDEX_RANGE]; |
-void vp9_init_me_luts() { |
+#if CONFIG_VP9_HIGHBITDEPTH |
+static int sad_per_bit16lut_10[QINDEX_RANGE]; |
+static int sad_per_bit4lut_10[QINDEX_RANGE]; |
+static int sad_per_bit16lut_12[QINDEX_RANGE]; |
+static int sad_per_bit4lut_12[QINDEX_RANGE]; |
+#endif |
+ |
+static void init_me_luts_bd(int *bit16lut, int *bit4lut, int range, |
+ vpx_bit_depth_t bit_depth) { |
int i; |
- |
// Initialize the sad lut tables using a formulaic calculation for now. |
// This is to make it easier to resolve the impact of experimental changes |
// to the quantizer tables. |
- for (i = 0; i < QINDEX_RANGE; ++i) { |
- const double q = vp9_convert_qindex_to_q(i); |
- sad_per_bit16lut[i] = (int)(0.0418 * q + 2.4107); |
- sad_per_bit4lut[i] = (int)(0.063 * q + 2.742); |
+ for (i = 0; i < range; i++) { |
+ const double q = vp9_convert_qindex_to_q(i, bit_depth); |
+ bit16lut[i] = (int)(0.0418 * q + 2.4107); |
+ bit4lut[i] = (int)(0.063 * q + 2.742); |
} |
} |
+void vp9_init_me_luts() { |
+ init_me_luts_bd(sad_per_bit16lut_8, sad_per_bit4lut_8, QINDEX_RANGE, |
+ VPX_BITS_8); |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ init_me_luts_bd(sad_per_bit16lut_10, sad_per_bit4lut_10, QINDEX_RANGE, |
+ VPX_BITS_10); |
+ init_me_luts_bd(sad_per_bit16lut_12, sad_per_bit4lut_12, QINDEX_RANGE, |
+ VPX_BITS_12); |
+#endif |
+} |
+ |
static const int rd_boost_factor[16] = { |
64, 32, 32, 32, 24, 16, 12, 12, |
8, 8, 4, 4, 2, 2, 1, 0 |
}; |
static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { |
-128, 144, 128, 128, 144 |
+ 128, 144, 128, 128, 144 |
}; |
int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) { |
- const int q = vp9_dc_quant(qindex, 0); |
+ const int q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth); |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ int rdmult = 0; |
+ switch (cpi->common.bit_depth) { |
+ case VPX_BITS_8: |
+ rdmult = 88 * q * q / 24; |
+ break; |
+ case VPX_BITS_10: |
+ rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 4); |
+ break; |
+ case VPX_BITS_12: |
+ rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 8); |
+ break; |
+ default: |
+ assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); |
+ return -1; |
+ } |
+#else |
int rdmult = 88 * q * q / 24; |
- |
+#endif |
if (cpi->oxcf.pass == 2 && (cpi->common.frame_type != KEY_FRAME)) { |
const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |
const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index]; |
@@ -132,15 +167,53 @@ |
return rdmult; |
} |
-static int compute_rd_thresh_factor(int qindex) { |
+static int compute_rd_thresh_factor(int qindex, vpx_bit_depth_t bit_depth) { |
+ double q; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ switch (bit_depth) { |
+ case VPX_BITS_8: |
+ q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0; |
+ break; |
+ case VPX_BITS_10: |
+ q = vp9_dc_quant(qindex, 0, VPX_BITS_10) / 16.0; |
+ break; |
+ case VPX_BITS_12: |
+ q = vp9_dc_quant(qindex, 0, VPX_BITS_12) / 64.0; |
+ break; |
+ default: |
+ assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); |
+ return -1; |
+ } |
+#else |
+ (void) bit_depth; |
+ q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0; |
+#endif |
// TODO(debargha): Adjust the function below. |
- const int q = (int)(pow(vp9_dc_quant(qindex, 0) / 4.0, RD_THRESH_POW) * 5.12); |
- return MAX(q, 8); |
+ return MAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8); |
} |
void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) { |
- cpi->mb.sadperbit16 = sad_per_bit16lut[qindex]; |
- cpi->mb.sadperbit4 = sad_per_bit4lut[qindex]; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ switch (cpi->common.bit_depth) { |
+ case VPX_BITS_8: |
+ cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex]; |
+ cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex]; |
+ break; |
+ case VPX_BITS_10: |
+ cpi->mb.sadperbit16 = sad_per_bit16lut_10[qindex]; |
+ cpi->mb.sadperbit4 = sad_per_bit4lut_10[qindex]; |
+ break; |
+ case VPX_BITS_12: |
+ cpi->mb.sadperbit16 = sad_per_bit16lut_12[qindex]; |
+ cpi->mb.sadperbit4 = sad_per_bit4lut_12[qindex]; |
+ break; |
+ default: |
+ assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12"); |
+ } |
+#else |
+ cpi->mb.sadperbit16 = sad_per_bit16lut_8[qindex]; |
+ cpi->mb.sadperbit4 = sad_per_bit4lut_8[qindex]; |
+#endif |
} |
static void set_block_thresholds(const VP9_COMMON *cm, RD_OPT *rd) { |
@@ -149,9 +222,8 @@ |
for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) { |
const int qindex = |
clamp(vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex) + |
- cm->y_dc_delta_q, |
- 0, MAXQ); |
- const int q = compute_rd_thresh_factor(qindex); |
+ cm->y_dc_delta_q, 0, MAXQ); |
+ const int q = compute_rd_thresh_factor(qindex, cm->bit_depth); |
for (bsize = 0; bsize < BLOCK_SIZES; ++bsize) { |
// Threshold here seems unnecessarily harsh but fine given actual |
@@ -363,7 +435,7 @@ |
uint8_t *ref_y_buffer, int ref_y_stride, |
int ref_frame, BLOCK_SIZE block_size) { |
MACROBLOCKD *xd = &x->e_mbd; |
- MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; |
+ MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi; |
int i; |
int zero_seen = 0; |
int best_index = 0; |
@@ -442,7 +514,7 @@ |
int vp9_get_switchable_rate(const VP9_COMP *cpi) { |
const MACROBLOCKD *const xd = &cpi->mb.e_mbd; |
- const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; |
+ const MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; |
const int ctx = vp9_get_pred_context_switchable_interp(xd); |
return SWITCHABLE_INTERP_RATE_FACTOR * |
cpi->switchable_interp_costs[ctx][mbmi->interp_filter]; |
@@ -457,9 +529,15 @@ |
for (i = 0; i < MAX_MODES; ++i) |
rd->thresh_mult[i] = cpi->oxcf.mode == BEST ? -500 : 0; |
- rd->thresh_mult[THR_NEARESTMV] = 0; |
- rd->thresh_mult[THR_NEARESTG] = 0; |
- rd->thresh_mult[THR_NEARESTA] = 0; |
+ if (sf->adaptive_rd_thresh) { |
+ rd->thresh_mult[THR_NEARESTMV] = 300; |
+ rd->thresh_mult[THR_NEARESTG] = 300; |
+ rd->thresh_mult[THR_NEARESTA] = 300; |
+ } else { |
+ rd->thresh_mult[THR_NEARESTMV] = 0; |
+ rd->thresh_mult[THR_NEARESTG] = 0; |
+ rd->thresh_mult[THR_NEARESTA] = 0; |
+ } |
rd->thresh_mult[THR_DC] += 1000; |
@@ -498,41 +576,6 @@ |
rd->thresh_mult[THR_D153_PRED] += 2500; |
rd->thresh_mult[THR_D207_PRED] += 2500; |
rd->thresh_mult[THR_D63_PRED] += 2500; |
- |
- // Disable frame modes if flags not set. |
- if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) { |
- rd->thresh_mult[THR_NEWMV ] = INT_MAX; |
- rd->thresh_mult[THR_NEARESTMV] = INT_MAX; |
- rd->thresh_mult[THR_ZEROMV ] = INT_MAX; |
- rd->thresh_mult[THR_NEARMV ] = INT_MAX; |
- } |
- if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) { |
- rd->thresh_mult[THR_NEARESTG ] = INT_MAX; |
- rd->thresh_mult[THR_ZEROG ] = INT_MAX; |
- rd->thresh_mult[THR_NEARG ] = INT_MAX; |
- rd->thresh_mult[THR_NEWG ] = INT_MAX; |
- } |
- if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) { |
- rd->thresh_mult[THR_NEARESTA ] = INT_MAX; |
- rd->thresh_mult[THR_ZEROA ] = INT_MAX; |
- rd->thresh_mult[THR_NEARA ] = INT_MAX; |
- rd->thresh_mult[THR_NEWA ] = INT_MAX; |
- } |
- |
- if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != |
- (VP9_LAST_FLAG | VP9_ALT_FLAG)) { |
- rd->thresh_mult[THR_COMP_ZEROLA ] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEARLA ] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEWLA ] = INT_MAX; |
- } |
- if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != |
- (VP9_GOLD_FLAG | VP9_ALT_FLAG)) { |
- rd->thresh_mult[THR_COMP_ZEROGA ] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEARGA ] = INT_MAX; |
- rd->thresh_mult[THR_COMP_NEWGA ] = INT_MAX; |
- } |
} |
void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) { |
@@ -554,18 +597,4 @@ |
for (i = 0; i < MAX_REFS; ++i) |
if (sf->disable_split_mask & (1 << i)) |
rd->thresh_mult_sub8x8[i] = INT_MAX; |
- |
- // Disable mode test if frame flag is not set. |
- if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) |
- rd->thresh_mult_sub8x8[THR_LAST] = INT_MAX; |
- if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) |
- rd->thresh_mult_sub8x8[THR_GOLD] = INT_MAX; |
- if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) |
- rd->thresh_mult_sub8x8[THR_ALTR] = INT_MAX; |
- if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) != |
- (VP9_LAST_FLAG | VP9_ALT_FLAG)) |
- rd->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX; |
- if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) != |
- (VP9_GOLD_FLAG | VP9_ALT_FLAG)) |
- rd->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX; |
} |