From: Yunqing Wang Date: Wed, 24 Sep 2014 19:12:25 +0000 (-0700) Subject: Skip the partition search for still frames X-Git-Tag: v1.4.0~706^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1fcbf6ed56266939403e75957a363de633f455b2;p=libvpx Skip the partition search for still frames This patch re-enabled the feature in Pengchong's patch (commit 12861260732a4fd5f6b667ce9d5105dc9b606eda). Originally, it was turned on while use_lastframe_partitioning > 0(not used anymore). Now it was added as a feature, and turned on while speed >= 2. As described in the original patch, this feature helps speed up the slideshows in YouTube. Change-Id: I1b0f18d65da1ee1c8d1e117dabba910c5207c471 --- diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index e99e7b5e4..d0fa67dae 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -2490,7 +2490,7 @@ static void encode_rd_sb_row(VP9_COMP *cpi, const TileInfo *const tile, sf->always_this_block_size); rd_use_partition(cpi, tile, mi, tp, mi_row, mi_col, BLOCK_64X64, &dummy_rate, &dummy_dist, 1, cpi->pc_root); - } else if ((sf->use_lastframe_partitioning && cpi->skippable_frame) || + } else if (cpi->partition_search_skippable_frame || sf->partition_search_type == VAR_BASED_FIXED_PARTITION) { BLOCK_SIZE bsize; set_offsets(cpi, tile, mi_row, mi_col, BLOCK_64X64); diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index 5f5af192c..9a81af3a5 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -772,7 +772,7 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf) { vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); cm->current_video_frame = 0; - cpi->skippable_frame = 0; + cpi->partition_search_skippable_frame = 0; // Create the encoder segmentation map and set all entries to 0 CHECK_MEM_ERROR(cm, cpi->segmentation_map, @@ -2203,9 +2203,9 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, // Check if the current frame is skippable for the partition search in the // second pass according to the first pass stats - if (oxcf->pass == 2 && + if (cpi->sf.allow_partition_search_skip && oxcf->pass == 2 && (!cpi->use_svc || is_two_pass_svc(cpi))) { - cpi->skippable_frame = is_skippable_frame(cpi); + cpi->partition_search_skippable_frame = is_skippable_frame(cpi); } // For 1 pass CBR, check if we are dropping this frame. diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h index 80774de92..3bca1432b 100644 --- a/vp9/encoder/vp9_encoder.h +++ b/vp9/encoder/vp9_encoder.h @@ -241,7 +241,8 @@ typedef struct VP9_COMP { YV12_BUFFER_CONFIG *unscaled_last_source; YV12_BUFFER_CONFIG scaled_last_source; - int skippable_frame; + // For a still frame, this flag is set to 1 to skip partition search. + int partition_search_skippable_frame; int scaled_ref_idx[3]; int lst_fb_idx; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 52e9a8e7b..0199329cd 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -88,6 +88,8 @@ static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm, else sf->partition_search_breakout_dist_thr = (1 << 22); sf->partition_search_breakout_rate_thr = 700; + + sf->allow_partition_search_skip = 1; } if (speed >= 3) { @@ -365,6 +367,7 @@ void vp9_set_speed_features(VP9_COMP *cpi) { sf->max_delta_qindex = 0; sf->disable_filter_search_var_thresh = 0; sf->adaptive_interp_filter_search = 0; + sf->allow_partition_search_skip = 0; for (i = 0; i < TX_SIZES; i++) { sf->intra_y_mode_mask[i] = INTRA_ALL; diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index ed8400863..ec16eb367 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -435,6 +435,9 @@ typedef struct SPEED_FEATURES { // Partition search early breakout thresholds. int64_t partition_search_breakout_dist_thr; int partition_search_breakout_rate_thr; + + // Allow skipping partition search for still image frame + int allow_partition_search_skip; } SPEED_FEATURES; struct VP9_COMP;