ref: b409863c488b5365b744659ca2aee622030611b5
parent: 392e0188f68b024c6e7f99f1fdc54aa70f755aaa
author: Marco <marpan@google.com>
date: Wed Nov 29 15:01:44 EST 2017
Fix to copy partition. Update the prev_partition on early exits in choose_partitioning(). Change-Id: I382ffcab8e647c00b14283d15c3dd11bb0ac6f50
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1078,8 +1078,8 @@
}
}
-static void update_prev_partition(VP9_COMP *cpi, BLOCK_SIZE bsize, int mi_row,
- int mi_col) {
+static void update_prev_partition_helper(VP9_COMP *cpi, BLOCK_SIZE bsize,
+ int mi_row, int mi_col) {
VP9_COMMON *const cm = &cpi->common;
BLOCK_SIZE *prev_part = cpi->prev_partition;
int start_pos = mi_row * cm->mi_stride + mi_col;
@@ -1109,10 +1109,10 @@
if (mi_col + bs < cm->mi_cols) prev_part[start_pos + bs] = subsize;
break;
case PARTITION_SPLIT:
- update_prev_partition(cpi, subsize, mi_row, mi_col);
- update_prev_partition(cpi, subsize, mi_row + bs, mi_col);
- update_prev_partition(cpi, subsize, mi_row, mi_col + bs);
- update_prev_partition(cpi, subsize, mi_row + bs, mi_col + bs);
+ update_prev_partition_helper(cpi, subsize, mi_row, mi_col);
+ update_prev_partition_helper(cpi, subsize, mi_row + bs, mi_col);
+ update_prev_partition_helper(cpi, subsize, mi_row, mi_col + bs);
+ update_prev_partition_helper(cpi, subsize, mi_row + bs, mi_col + bs);
break;
default: assert(0);
}
@@ -1119,6 +1119,16 @@
}
}
+static void update_prev_partition(VP9_COMP *cpi, MACROBLOCK *x, int segment_id,
+ int mi_row, int mi_col, int sb_offset) {
+ update_prev_partition_helper(cpi, BLOCK_64X64, mi_row, mi_col);
+ cpi->prev_segment_id[sb_offset] = segment_id;
+ memcpy(&(cpi->prev_variance_low[sb_offset * 25]), x->variance_low,
+ sizeof(x->variance_low));
+ // Reset the counter for copy partitioning
+ cpi->copied_frame_cnt[sb_offset] = 0;
+}
+
static void chroma_check(VP9_COMP *cpi, MACROBLOCK *x, int bsize,
unsigned int y_sad, int is_key_frame) {
int i;
@@ -1251,6 +1261,8 @@
if (cpi->oxcf.speed >= 8 || (cpi->use_svc && cpi->svc.non_reference_frame))
compute_minmax_variance = 0;
+ memset(x->variance_low, 0, sizeof(x->variance_low));
+
if (cpi->sf.use_source_sad && !is_key_frame) {
int sb_offset2 = ((cm->mi_cols + 7) >> 3) * (mi_row >> 3) + (mi_col >> 3);
content_state = x->content_state_sb;
@@ -1268,8 +1280,12 @@
cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1 &&
cpi->svc.prev_partition_svc != NULL && content_state != kVeryHighSad) {
if (!scale_partitioning_svc(cpi, x, xd, BLOCK_64X64, mi_row >> 1,
- mi_col >> 1, mi_row, mi_col))
+ mi_col >> 1, mi_row, mi_col)) {
+ if (cpi->sf.copy_partition_flag) {
+ update_prev_partition(cpi, x, segment_id, mi_row, mi_col, sb_offset);
+ }
return 0;
+ }
}
// If source_sad is low copy the partition without computing the y_sad.
if (x->skip_low_source_sad && cpi->sf.copy_partition_flag &&
@@ -1293,8 +1309,6 @@
// For non keyframes, disable 4x4 average for low resolution when speed = 8
threshold_4x4avg = (cpi->oxcf.speed < 8) ? thresholds[1] << 1 : INT64_MAX;
- memset(x->variance_low, 0, sizeof(x->variance_low));
-
if (xd->mb_to_right_edge < 0) pixels_wide += (xd->mb_to_right_edge >> 3);
if (xd->mb_to_bottom_edge < 0) pixels_high += (xd->mb_to_bottom_edge >> 3);
@@ -1405,6 +1419,9 @@
if (cpi->sf.svc_use_lowres_part &&
cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 2)
update_partition_svc(cpi, BLOCK_64X64, mi_row, mi_col);
+ if (cpi->sf.copy_partition_flag) {
+ update_prev_partition(cpi, x, segment_id, mi_row, mi_col, sb_offset);
+ }
return 0;
}
}
@@ -1632,13 +1649,7 @@
}
if (cm->frame_type != KEY_FRAME && cpi->sf.copy_partition_flag) {
- update_prev_partition(cpi, BLOCK_64X64, mi_row, mi_col);
- cpi->prev_segment_id[sb_offset] = segment_id;
- memcpy(&(cpi->prev_variance_low[sb_offset * 25]), x->variance_low,
- sizeof(x->variance_low));
- // Reset the counter for copy partitioning
- if (cpi->copied_frame_cnt[sb_offset] == cpi->max_copied_frame)
- cpi->copied_frame_cnt[sb_offset] = 0;
+ update_prev_partition(cpi, x, segment_id, mi_row, mi_col, sb_offset);
}
if (cm->frame_type != KEY_FRAME && cpi->sf.svc_use_lowres_part &&