ref: 80a4f559891cf7553c087a6120cc5ed9fff30390
parent: 741c6bb619e2a8d0ee890e6764e815f962155b44
author: Jingning Han <jingning@google.com>
date: Thu Apr 17 05:58:17 EDT 2014
Enable background detection for adaptive quantizer control This commit enables a background detection approach for adaptive quantizer control. It combines the cyclic refresh pattern and the background information to determine the segment id for adaptive quantizer selection, prior to the non-RD mode decision process. It hence allows proper quantization information update for a more precise rate-distortion modeling in the non-RD mode decision. The compression performance of speed -5 for rtc set is improved by 2.5%, at no speed change. Change-Id: Ic3713e8ed9185b403b5b1679d19dabd57506d452
--- a/vp9/encoder/vp9_aq_cyclicrefresh.c
+++ b/vp9/encoder/vp9_aq_cyclicrefresh.c
@@ -136,7 +136,8 @@
const int xmis = MIN(cm->mi_cols - mi_col, bw);
const int ymis = MIN(cm->mi_rows - mi_row, bh);
const int block_index = mi_row * cm->mi_cols + mi_col;
- const int refresh_this_block = candidate_refresh_aq(cr, mbmi, bsize, use_rd);
+ const int refresh_this_block = cpi->mb.in_static_area ||
+ candidate_refresh_aq(cr, mbmi, bsize, use_rd);
// Default is to not update the refresh map.
int new_map_value = cr->map[block_index];
int x = 0; int y = 0;
--- a/vp9/encoder/vp9_block.h
+++ b/vp9/encoder/vp9_block.h
@@ -162,6 +162,8 @@
// note that token_costs is the cost when eob node is skipped
vp9_coeff_cost token_costs[TX_SIZES];
+ int in_static_area;
+
int optimize;
// indicate if it is in the rd search loop or encoding process
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1273,6 +1273,7 @@
static int is_background(VP9_COMP *cpi, const TileInfo *const tile,
int mi_row, int mi_col) {
+ MACROBLOCK *x = &cpi->mb;
uint8_t *src, *pre;
int src_stride, pre_stride;
@@ -1304,7 +1305,8 @@
threshold = (row8x8_remaining * col8x8_remaining) << 6;
}
- return (this_sad < 2 * threshold);
+ x->in_static_area = (this_sad < 2 * threshold);
+ return x->in_static_area;
}
static int sb_has_motion(const VP9_COMMON *cm, MODE_INFO **prev_mi_8x8) {
@@ -2433,6 +2435,11 @@
set_offsets(cpi, tile, mi_row, mi_col, bsize);
xd->mi[0]->mbmi.sb_type = bsize;
+ if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) {
+ if (xd->mi[0]->mbmi.segment_id && x->in_static_area)
+ x->rdmult = vp9_cyclic_refresh_get_rdmult(cpi->cyclic_refresh);
+ }
+
if (!frame_is_intra_only(cm)) {
vp9_pick_inter_mode(cpi, x, tile, mi_row, mi_col,
rate, dist, bsize);
@@ -2856,7 +2863,8 @@
static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
int mi_row, TOKENEXTRA **tp) {
VP9_COMMON *cm = &cpi->common;
- MACROBLOCKD *xd = &cpi->mb.e_mbd;
+ MACROBLOCK *x = &cpi->mb;
+ MACROBLOCKD *xd = &x->e_mbd;
int mi_col;
// Initialize the left context for the new SB row
@@ -2874,8 +2882,9 @@
MODE_INFO **prev_mi_8x8 = cm->prev_mi_grid_visible + idx_str;
BLOCK_SIZE bsize;
- cpi->mb.source_variance = UINT_MAX;
- vp9_zero(cpi->mb.pred_mv);
+ x->in_static_area = 0;
+ x->source_variance = UINT_MAX;
+ vp9_zero(x->pred_mv);
// Set the partition type of the 64X64 block
switch (cpi->sf.partition_search_type) {
--
⑨