rtc: Reduce number of reference frame buffers

In rt, non-svc use case frame buffer allocated for
key frame was not released when a new frame replaced
key frame as the golden reference frame. In this patch,
buffer holding key frame is released when a new golden
frame is encoded, thereby reducing the number of
reference frame buffer requirement by one.

               Peak Memory Reduction (%)
Resolution    single thread (rt speed 10)
 320x180          3.55
 320x240          3.69
 640x360          4.18
 640x480          4.25
 1280x720         4.28

HEAP memory reduction was measured using the following command.
$valgrind --tool=massif ./aomenc ...

Change-Id: I20de21fe486748025b0a665c975a6ec4ea96ba5a
diff --git a/av1/encoder/encoder_utils.h b/av1/encoder/encoder_utils.h
index 21fb0e8..44294db 100644
--- a/av1/encoder/encoder_utils.h
+++ b/av1/encoder/encoder_utils.h
@@ -997,12 +997,34 @@
   if (!frame_is_intra_only(&cpi->common)) release_scaled_references(cpi);
 }
 
+static AOM_INLINE int reduce_num_ref_buffers(const AV1_COMP *cpi) {
+  const SequenceHeader *const seq_params = cpi->common.seq_params;
+  return is_one_pass_rt_params(cpi) &&
+         use_one_pass_rt_reference_structure(cpi) &&
+         (seq_params->order_hint_info.enable_order_hint == 0) &&
+         cpi->rt_reduce_num_ref_buffers;
+}
+
 // Refresh reference frame buffers according to refresh_frame_flags.
 static AOM_INLINE void refresh_reference_frames(AV1_COMP *cpi) {
   AV1_COMMON *const cm = &cpi->common;
   // All buffers are refreshed for shown keyframes and S-frames.
+  // In case of RT, golden frame refreshes the 6th slot and other reference
+  // frames refresh slots 0 to 5. Slot 7 is not refreshed by any reference
+  // frame. Thus, only 7 buffers are refreshed for keyframes and S-frames
+  // instead of 8.
+  int num_ref_buffers = REF_FRAMES;
+  if (reduce_num_ref_buffers(cpi)) {
+    const int refresh_all_bufs =
+        (cpi->ppi->gf_group.refbuf_state[cpi->gf_frame_index] == REFBUF_RESET ||
+         frame_is_sframe(cm));
+    assert(IMPLIES(((cm->current_frame.refresh_frame_flags >> 7) & 1) == 1,
+                   refresh_all_bufs));
+    (void)refresh_all_bufs;
+    num_ref_buffers--;
+  }
 
-  for (int ref_frame = 0; ref_frame < REF_FRAMES; ref_frame++) {
+  for (int ref_frame = 0; ref_frame < num_ref_buffers; ref_frame++) {
     if (((cm->current_frame.refresh_frame_flags >> ref_frame) & 1) == 1) {
       assign_frame_buffer_p(&cm->ref_frame_map[ref_frame], cm->cur_frame);
     }