Terminate partition search when NONE and SPLIT are invalid

Terminate partition search for child partition,
when NONE and SPLIT partition rd_costs are INT64_MAX.

          Instruction Count          BD-Rate Loss(%)
cpu-used    Reduction(%)   	avg.psnr  ovr.psnr  ssim
   4          1.358		0.0476    0.0492    0.0033
   5          0.368		0.0262    0.0330    0.0281
   6          0.346		0.0206    0.0221    0.0506

STATS_CHANGED

Change-Id: If973ebd29657b0c4b3e2607247139693988dafb8
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index d88ea23..8a6ee65 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -3514,6 +3514,14 @@
                          &part_search_state, &best_rdc, multi_pass_mode,
                          &part_split_rd);
 
+  // Terminate partition search for child partition,
+  // when NONE and SPLIT partition rd_costs are INT64_MAX.
+  if (cpi->sf.part_sf.early_term_after_none_split &&
+      part_none_rd == INT64_MAX && part_split_rd == INT64_MAX &&
+      !x->must_find_valid_partition && (bsize != cm->seq_params.sb_size)) {
+    part_search_state.terminate_partition_search = 1;
+  }
+
   // Prune partitions based on PARTITION_NONE and PARTITION_SPLIT.
   prune_partitions_after_split(cpi, x, sms_tree, &part_search_state, &best_rdc,
                                part_none_rd, part_split_rd);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index da068b5..ce4fbee 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -537,6 +537,7 @@
     sf->part_sf.simple_motion_search_prune_agg = 2;
     sf->part_sf.simple_motion_search_reduce_search_steps = 4;
     sf->part_sf.prune_ab_partition_using_split_info = 1;
+    sf->part_sf.early_term_after_none_split = 1;
 
     sf->inter_sf.alt_ref_search_fp = 1;
     sf->inter_sf.txfm_rd_gate_level = boosted ? 0 : 4;
@@ -997,6 +998,7 @@
   part_sf->ext_partition_eval_thresh = BLOCK_8X8;
   part_sf->prune_4_partition_using_split_info = 0;
   part_sf->prune_ab_partition_using_split_info = 0;
+  part_sf->early_term_after_none_split = 0;
 }
 
 static AOM_INLINE void init_mv_sf(MV_SPEED_FEATURES *mv_sf) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index c415b17..1ed4ac6 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -469,6 +469,10 @@
 
   // Prune AB partition search using split and HORZ/VERT info
   int prune_ab_partition_using_split_info;
+
+  // Terminate partition search for child partition,
+  // when NONE and SPLIT partition rd_costs are INT64_MAX.
+  int early_term_after_none_split;
 } PARTITION_SPEED_FEATURES;
 
 typedef struct MV_SPEED_FEATURES {