diff options
author | Marco Paniconi <marpan@google.com> | 2017-03-20 21:35:11 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-03-20 21:35:12 +0000 |
commit | 8dc15230576f8900327f38c667dda1cab41e3894 (patch) | |
tree | 8bdc88ffbe427bdd74cecbcc8e6fd8cb3329d838 | |
parent | d642dd43110f93fafa9c88e86cf2fc6464340663 (diff) | |
parent | 06c8713e89514ccbed2d68e847adfd7830b53881 (diff) | |
download | libvpx-8dc15230576f8900327f38c667dda1cab41e3894.tar libvpx-8dc15230576f8900327f38c667dda1cab41e3894.tar.gz libvpx-8dc15230576f8900327f38c667dda1cab41e3894.tar.bz2 libvpx-8dc15230576f8900327f38c667dda1cab41e3894.zip |
Merge "vp9: Use sb content measure to bias against golden."
-rw-r--r-- | vp9/encoder/vp9_block.h | 2 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodeframe.c | 1 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 9 | ||||
-rw-r--r-- | vp9/encoder/vp9_encoder.h | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_pickmode.c | 5 | ||||
-rw-r--r-- | vp9/encoder/vp9_ratectrl.c | 8 | ||||
-rw-r--r-- | vp9/encoder/vp9_speed_features.c | 2 |
7 files changed, 31 insertions, 1 deletions
diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h index c86c818aa..071a9b3e3 100644 --- a/vp9/encoder/vp9_block.h +++ b/vp9/encoder/vp9_block.h @@ -170,6 +170,8 @@ struct macroblock { uint8_t skip_low_source_sad; + uint8_t last_sb_high_content; + // Used to save the status of whether a block has a low variance in // choose_partitioning. 0 for 64x64, 1~2 for 64x32, 3~4 for 32x64, 5~8 for // 32x32, 9~24 for 16x16. diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index df72667d4..e6f4901fd 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1018,6 +1018,7 @@ static int choose_partitioning(VP9_COMP *cpi, const TileInfo *const tile, content_state == kLowSadHighSumdiff) ? 1 : 0; + x->last_sb_high_content = cpi->content_state_sb_fd[sb_offset2]; // If source_sad is low copy the partition without computing the y_sad. if (x->skip_low_source_sad && cpi->sf.copy_partition_flag && copy_partitioning(cpi, x, mi_row, mi_col, segment_id, sb_offset)) { diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 64d6985b5..aba2c115a 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -466,6 +466,9 @@ static void dealloc_compressor_data(VP9_COMP *cpi) { vpx_free(cpi->content_state_sb); cpi->content_state_sb = NULL; + vpx_free(cpi->content_state_sb_fd); + cpi->content_state_sb_fd = NULL; + vp9_cyclic_refresh_free(cpi->cyclic_refresh); cpi->cyclic_refresh = NULL; @@ -3141,10 +3144,14 @@ static void encode_without_recode_loop(VP9_COMP *cpi, size_t *size, cpi->svc.current_superframe < 1)) || cpi->resize_pending || cpi->resize_state || cpi->external_resize) { compute_source_sad = 0; - if (cpi->content_state_sb != NULL) + if (cpi->content_state_sb != NULL) { memset(cpi->content_state_sb, 0, (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) * sizeof(*cpi->content_state_sb)); + memset(cpi->content_state_sb_fd, 0, + (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) * + sizeof(*cpi->content_state_sb_fd)); + } } // Avoid scaling last_source unless its needed. diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index ba29cabb1..72c0ba787 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -705,7 +705,12 @@ typedef struct VP9_COMP { uint8_t *copied_frame_cnt; uint8_t max_copied_frame; + // For each superblock: saves the content value (e.g., low/high sad/sumdiff) + // based on source sad, prior to encoding the frame. uint8_t *content_state_sb; + // For each superblock: keeps track of the last time (in frame distance) the + // the superblock did not have low source sad. + uint8_t *content_state_sb_fd; LevelConstraint level_constraint; } VP9_COMP; diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 46fb67a93..ecc9afbad 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1563,6 +1563,11 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, TileDataEnc *tile_data, usable_ref_frame = LAST_FRAME; #endif + if (cpi->oxcf.speed >= 8 && !cpi->use_svc && + ((cpi->rc.frames_since_golden + 1) < x->last_sb_high_content || + x->last_sb_high_content > 40)) + usable_ref_frame = LAST_FRAME; + for (ref_frame = LAST_FRAME; ref_frame <= usable_ref_frame; ++ref_frame) { if (!skip_ref_find_pred[ref_frame]) { find_predictors(cpi, x, ref_frame, frame_mv, const_motion, diff --git a/vp9/encoder/vp9_ratectrl.c b/vp9/encoder/vp9_ratectrl.c index b95cd7773..fb41427ea 100644 --- a/vp9/encoder/vp9_ratectrl.c +++ b/vp9/encoder/vp9_ratectrl.c @@ -2285,6 +2285,7 @@ void vp9_avg_source_sad(VP9_COMP *cpi) { int sb_cols = (cm->mi_cols + MI_BLOCK_SIZE - 1) / MI_BLOCK_SIZE; int sb_rows = (cm->mi_rows + MI_BLOCK_SIZE - 1) / MI_BLOCK_SIZE; uint64_t avg_source_sad_threshold = 10000; + uint64_t avg_source_sad_threshold2 = 12000; if (cpi->oxcf.lag_in_frames > 0) { src_y = frames[frame]->y_buffer; src_ystride = frames[frame]->y_stride; @@ -2315,6 +2316,13 @@ void vp9_avg_source_sad(VP9_COMP *cpi) { cpi->content_state_sb[num_samples] = ((tmp_sse - tmp_variance) < 25) ? kHighSadLowSumdiff : kHighSadHighSumdiff; + if (tmp_sad < avg_source_sad_threshold2) { + // Cap the increment to 255. + if (cpi->content_state_sb_fd[num_samples] < 255) + cpi->content_state_sb_fd[num_samples]++; + } else { + cpi->content_state_sb_fd[num_samples] = 0; + } } avg_sad += tmp_sad; num_samples++; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 2ce836f2e..fd589f990 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -518,6 +518,8 @@ static void set_rt_speed_feature_framesize_independent( cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)) { cpi->content_state_sb = (uint8_t *)vpx_calloc( (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1), sizeof(uint8_t)); + cpi->content_state_sb_fd = (uint8_t *)vpx_calloc( + (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1), sizeof(uint8_t)); } } } |