Improve the control logic for hog computation

The conditions for memory allocation and computation of SB level
gradient cache are improved so that the allocations and
computations are performed only when gradient caching is actually
required.

Change-Id: I0c72e0a86125cd3a97ff5609864a0706d10b61e1
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index ff9b8e0..29f285a 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -841,11 +841,7 @@
       seg_skip = segfeature_active(seg, segment_id, SEG_LVL_SKIP);
     }
 
-    // Produce the gradient data at superblock level, when intra mode pruning
-    // based on hog is enabled.
-    if (cpi->sf.intra_sf.intra_pruning_with_hog ||
-        cpi->sf.intra_sf.chroma_intra_pruning_with_hog)
-      produce_gradients_for_sb(cpi, x, sb_size, mi_row, mi_col);
+    produce_gradients_for_sb(cpi, x, sb_size, mi_row, mi_col);
 
     // encode the superblock
     if (use_nonrd_mode) {
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index a4fcba6..b85f67e 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2299,12 +2299,9 @@
     }
   }
 
-  const SPEED_FEATURES *sf = &cpi->sf;
-  if (sf->intra_sf.intra_pruning_with_hog ||
-      sf->intra_sf.chroma_intra_pruning_with_hog) {
-    allocate_gradient_info_for_hog(&cpi->td.pixel_gradient_info, cpi);
-  }
+  allocate_gradient_info_for_hog(&cpi->td.pixel_gradient_info, cpi);
 
+  const SPEED_FEATURES *sf = &cpi->sf;
   if (sf->part_sf.partition_search_type == VAR_BASED_PARTITION)
     variance_partition_alloc(cpi);
 
@@ -2507,13 +2504,9 @@
   q_low = bottom_index;
   q_high = top_index;
 
-  const SPEED_FEATURES *sf = &cpi->sf;
-  if (sf->intra_sf.intra_pruning_with_hog ||
-      sf->intra_sf.chroma_intra_pruning_with_hog) {
-    allocate_gradient_info_for_hog(&cpi->td.pixel_gradient_info, cpi);
-  }
+  allocate_gradient_info_for_hog(&cpi->td.pixel_gradient_info, cpi);
 
-  if (sf->part_sf.partition_search_type == VAR_BASED_PARTITION)
+  if (cpi->sf.part_sf.partition_search_type == VAR_BASED_PARTITION)
     variance_partition_alloc(cpi);
 
   if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index 22406d9..bd7be4c 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -16,6 +16,7 @@
 #include "av1/encoder/encoder.h"
 #include "av1/encoder/encodetxb.h"
 #include "av1/encoder/ethread.h"
+#include "av1/encoder/intra_mode_search_utils.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -304,6 +305,7 @@
 
 static AOM_INLINE void allocate_gradient_info_for_hog(
     PixelLevelGradientInfo **pixel_gradient_info, AV1_COMP *cpi) {
+  if (!is_gradient_caching_for_hog_enabled(cpi)) return;
   const AV1_COMMON *const cm = &cpi->common;
 
   if (!*pixel_gradient_info) {
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 5f4d0b3..79d12b9 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -23,6 +23,7 @@
 #endif
 #include "av1/encoder/global_motion.h"
 #include "av1/encoder/global_motion_facade.h"
+#include "av1/encoder/intra_mode_search_utils.h"
 #include "av1/encoder/rdopt.h"
 #include "aom_dsp/aom_dsp_common.h"
 #include "av1/encoder/temporal_filter.h"
@@ -759,9 +760,7 @@
           }
         }
 
-        const SPEED_FEATURES *sf = &ppi->cpi->sf;
-        if (sf->intra_sf.intra_pruning_with_hog ||
-            sf->intra_sf.chroma_intra_pruning_with_hog) {
+        if (is_gradient_caching_for_hog_enabled(ppi->cpi)) {
           const int plane_types = PLANE_TYPES >> ppi->seq_params.monochrome;
           AOM_CHECK_MEM_ERROR(
               &ppi->error, thread_data->td->pixel_gradient_info,
diff --git a/av1/encoder/intra_mode_search_utils.h b/av1/encoder/intra_mode_search_utils.h
index e6eab3f..8e16016 100644
--- a/av1/encoder/intra_mode_search_utils.h
+++ b/av1/encoder/intra_mode_search_utils.h
@@ -307,27 +307,39 @@
   lowbd_compute_gradient_info_sb(x, sb_size, plane);
 }
 
+// Gradient caching at superblock level is allowed only if all of the following
+// conditions are satisfied:
+// (1) The current frame is an intra only frame
+// (2) Non-RD mode decisions are not enabled
+// (3) The sf partition_search_type is set to SEARCH_PARTITION
+// (4) Either intra_pruning_with_hog or chroma_intra_pruning_with_hog is enabled
+//
+// SB level caching of gradient data may not help in speedup for the following
+// cases:
+// (1) Inter frames (due to early intra gating)
+// (2) When partition_search_type is not SEARCH_PARTITION
+// Hence, gradient data is computed at block level in such cases.
+static AOM_INLINE bool is_gradient_caching_for_hog_enabled(
+    const AV1_COMP *const cpi) {
+  const SPEED_FEATURES *const sf = &cpi->sf;
+  return frame_is_intra_only(&cpi->common) && !sf->rt_sf.use_nonrd_pick_mode &&
+         (sf->part_sf.partition_search_type == SEARCH_PARTITION) &&
+         (sf->intra_sf.intra_pruning_with_hog ||
+          sf->intra_sf.chroma_intra_pruning_with_hog);
+}
+
 // Function to generate pixel level gradient information for a given superblock.
 // Sets the flags 'is_sb_gradient_cached' for the specific plane-type if
 // gradient info is generated for the same.
 static AOM_INLINE void produce_gradients_for_sb(AV1_COMP *cpi, MACROBLOCK *x,
                                                 BLOCK_SIZE sb_size, int mi_row,
                                                 int mi_col) {
-  const SPEED_FEATURES *sf = &cpi->sf;
   // Initialise flags related to hog data caching.
   x->is_sb_gradient_cached[PLANE_TYPE_Y] = false;
   x->is_sb_gradient_cached[PLANE_TYPE_UV] = false;
+  if (!is_gradient_caching_for_hog_enabled(cpi)) return;
 
-  // SB level caching of gradient data may not help in speedup for the following
-  // cases:
-  // (1) Inter frames (due to early intra gating)
-  // (2) When partition_search_type is not SEARCH_PARTITION
-  // Hence, gradient data is computed at block level in such cases.
-
-  if (!frame_is_intra_only(&cpi->common) ||
-      sf->part_sf.partition_search_type != SEARCH_PARTITION)
-    return;
-
+  const SPEED_FEATURES *sf = &cpi->sf;
   const int num_planes = av1_num_planes(&cpi->common);
 
   av1_setup_src_planes(x, cpi->source, mi_row, mi_col, num_planes, sb_size);