Commit 01906b53 authored by Deb Mukherjee's avatar Deb Mukherjee Committed by Gerrit Code Review
Browse files

Merge "Refines variance based partitioning search"

Showing with 47 additions and 12 deletions
...@@ -94,7 +94,8 @@ static const uint8_t VP9_VAR_OFFS[64] = { ...@@ -94,7 +94,8 @@ static const uint8_t VP9_VAR_OFFS[64] = {
128, 128, 128, 128, 128, 128, 128, 128 128, 128, 128, 128, 128, 128, 128, 128
}; };
static unsigned int get_sby_perpixel_variance(VP9_COMP *cpi, MACROBLOCK *x, static unsigned int get_sby_perpixel_variance(VP9_COMP *cpi,
MACROBLOCK *x,
BLOCK_SIZE bs) { BLOCK_SIZE bs) {
unsigned int var, sse; unsigned int var, sse;
var = cpi->fn_ptr[bs].vf(x->plane[0].src.buf, x->plane[0].src.stride, var = cpi->fn_ptr[bs].vf(x->plane[0].src.buf, x->plane[0].src.stride,
...@@ -102,19 +103,49 @@ static unsigned int get_sby_perpixel_variance(VP9_COMP *cpi, MACROBLOCK *x, ...@@ -102,19 +103,49 @@ static unsigned int get_sby_perpixel_variance(VP9_COMP *cpi, MACROBLOCK *x,
return ROUND_POWER_OF_TWO(var, num_pels_log2_lookup[bs]); return ROUND_POWER_OF_TWO(var, num_pels_log2_lookup[bs]);
} }
static BLOCK_SIZE get_rd_var_based_fixed_partition(VP9_COMP *cpi) { static unsigned int get_sby_perpixel_diff_variance(VP9_COMP *cpi,
unsigned int var = get_sby_perpixel_variance(cpi, &cpi->mb, BLOCK_64X64); MACROBLOCK *x,
if (var < 256) int mi_row,
int mi_col,
BLOCK_SIZE bs) {
const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, LAST_FRAME);
int offset = (mi_row * MI_SIZE) * yv12->y_stride + (mi_col * MI_SIZE);
unsigned int var, sse;
var = cpi->fn_ptr[bs].vf(x->plane[0].src.buf,
x->plane[0].src.stride,
yv12->y_buffer + offset,
yv12->y_stride,
&sse);
return ROUND_POWER_OF_TWO(var, num_pels_log2_lookup[bs]);
}
static BLOCK_SIZE get_rd_var_based_fixed_partition(VP9_COMP *cpi,
int mi_row,
int mi_col) {
unsigned int var = get_sby_perpixel_diff_variance(cpi, &cpi->mb,
mi_row, mi_col,
BLOCK_64X64);
if (var < 8)
return BLOCK_64X64; return BLOCK_64X64;
else else if (var < 128)
return BLOCK_32X32; return BLOCK_32X32;
else if (var < 2048)
return BLOCK_16X16;
else
return BLOCK_8X8;
} }
static BLOCK_SIZE get_nonrd_var_based_fixed_partition(VP9_COMP *cpi) { static BLOCK_SIZE get_nonrd_var_based_fixed_partition(VP9_COMP *cpi,
unsigned int var = get_sby_perpixel_variance(cpi, &cpi->mb, BLOCK_64X64); int mi_row,
if (var < 1024) int mi_col) {
unsigned int var = get_sby_perpixel_diff_variance(cpi, &cpi->mb,
mi_row, mi_col,
BLOCK_64X64);
if (var < 8)
return BLOCK_64X64;
else if (var < 64)
return BLOCK_32X32; return BLOCK_32X32;
else if (var < 4096) else if (var < 2048)
return BLOCK_16X16; return BLOCK_16X16;
else else
return BLOCK_8X8; return BLOCK_8X8;
...@@ -1265,7 +1296,8 @@ static void rd_use_partition(VP9_COMP *cpi, ...@@ -1265,7 +1296,8 @@ static void rd_use_partition(VP9_COMP *cpi,
x->mb_energy = vp9_block_energy(cpi, x, bsize); x->mb_energy = vp9_block_energy(cpi, x, bsize);
} }
if (cpi->sf.adjust_partitioning_from_last_frame) { if (cpi->sf.partition_search_type == SEARCH_PARTITION &&
cpi->sf.adjust_partitioning_from_last_frame) {
// Check if any of the sub blocks are further split. // Check if any of the sub blocks are further split.
if (partition == PARTITION_SPLIT && subsize > BLOCK_8X8) { if (partition == PARTITION_SPLIT && subsize > BLOCK_8X8) {
sub_subsize = get_subsize(subsize, PARTITION_SPLIT); sub_subsize = get_subsize(subsize, PARTITION_SPLIT);
...@@ -1396,6 +1428,7 @@ static void rd_use_partition(VP9_COMP *cpi, ...@@ -1396,6 +1428,7 @@ static void rd_use_partition(VP9_COMP *cpi,
} }
if (cpi->sf.adjust_partitioning_from_last_frame if (cpi->sf.adjust_partitioning_from_last_frame
&& cpi->sf.partition_search_type == SEARCH_PARTITION
&& partition != PARTITION_SPLIT && bsize > BLOCK_8X8 && partition != PARTITION_SPLIT && bsize > BLOCK_8X8
&& (mi_row + ms < cm->mi_rows || mi_row + (ms >> 1) == cm->mi_rows) && (mi_row + ms < cm->mi_rows || mi_row + (ms >> 1) == cm->mi_rows)
&& (mi_col + ms < cm->mi_cols || mi_col + (ms >> 1) == cm->mi_cols)) { && (mi_col + ms < cm->mi_cols || mi_col + (ms >> 1) == cm->mi_cols)) {
...@@ -1995,7 +2028,7 @@ static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile, ...@@ -1995,7 +2028,7 @@ static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
// map to the same thing. // map to the same thing.
BLOCK_SIZE bsize; BLOCK_SIZE bsize;
set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64); set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64);
bsize = get_rd_var_based_fixed_partition(cpi); bsize = get_rd_var_based_fixed_partition(cpi, mi_row, mi_col);
set_partitioning(cpi, tile, mi_8x8, mi_row, mi_col, bsize); set_partitioning(cpi, tile, mi_8x8, mi_row, mi_col, bsize);
rd_use_partition(cpi, tile, mi_8x8, tp, mi_row, mi_col, BLOCK_64X64, rd_use_partition(cpi, tile, mi_8x8, tp, mi_row, mi_col, BLOCK_64X64,
&dummy_rate, &dummy_dist, 1); &dummy_rate, &dummy_dist, 1);
...@@ -2377,7 +2410,9 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile, ...@@ -2377,7 +2410,9 @@ static void encode_nonrd_sb_row(VP9_COMP *cpi, const TileInfo *const tile,
// TODO(debargha): Implement VAR_BASED_PARTITION as a separate case. // TODO(debargha): Implement VAR_BASED_PARTITION as a separate case.
// Currently both VAR_BASED_FIXED_PARTITION/VAR_BASED_PARTITION // Currently both VAR_BASED_FIXED_PARTITION/VAR_BASED_PARTITION
// map to the same thing. // map to the same thing.
BLOCK_SIZE bsize = get_nonrd_var_based_fixed_partition(cpi); BLOCK_SIZE bsize = get_nonrd_var_based_fixed_partition(cpi,
mi_row,
mi_col);
nonrd_use_partition(cpi, tile, mi_8x8, tp, mi_row, mi_col, nonrd_use_partition(cpi, tile, mi_8x8, tp, mi_row, mi_col,
bsize, &dummy_rate, &dummy_dist, 1); bsize, &dummy_rate, &dummy_dist, 1);
} else { } else {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment