Add reconstruction frame buffer to tpl model

Allocate reconstruction frame buffer for tpl model building.

Change-Id: I014830a951f132b0ea87c4581f9602eed638d431
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index ed9ecec..b0bdf65 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3058,6 +3058,14 @@
         aom_calloc(cpi->tpl_stats_buffer[frame].width *
                        cpi->tpl_stats_buffer[frame].height,
                    sizeof(*cpi->tpl_stats_buffer[frame].tpl_stats_ptr)));
+
+    if (aom_alloc_frame_buffer(
+            &cpi->tpl_stats_buffer[frame].rec_picture_buf, cm->width,
+            cm->height, cm->seq_params.subsampling_x,
+            cm->seq_params.subsampling_y, cm->seq_params.use_highbitdepth,
+            cpi->oxcf.border_in_pixels, cm->byte_alignment))
+      aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
+                         "Failed to allocate frame buffer");
   }
   cpi->tpl_frame = &cpi->tpl_stats_buffer[REF_FRAMES + 1];
 
@@ -3403,6 +3411,9 @@
   for (int frame = 0; frame < MAX_LENGTH_TPL_FRAME_STATS; ++frame) {
     aom_free(cpi->tpl_stats_buffer[frame].tpl_stats_ptr);
     cpi->tpl_stats_buffer[frame].is_valid = 0;
+
+    aom_free_frame_buffer(&cpi->tpl_stats_buffer[frame].rec_picture_buf);
+    cpi->tpl_stats_buffer[frame].rec_picture = NULL;
   }
 
   for (t = cpi->num_workers - 1; t >= 0; --t) {
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index df29b54..c8870c9 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -179,6 +179,8 @@
   uint8_t is_valid;
   TplDepStats *tpl_stats_ptr;
   const YV12_BUFFER_CONFIG *gf_picture;
+  YV12_BUFFER_CONFIG rec_picture_buf;
+  YV12_BUFFER_CONFIG *rec_picture;
   int ref_map_index[REF_FRAMES];
   int stride;
   int width;
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index a7fadf7..bb11f1e 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -14,6 +14,7 @@
 
 #include "config/aom_config.h"
 #include "config/aom_dsp_rtcd.h"
+#include "config/aom_scale_rtcd.h"
 
 #include "aom/aom_codec.h"
 #include "aom_ports/system_state.h"
@@ -685,9 +686,11 @@
   for (int i = 0; i < REF_FRAMES; ++i) {
     if (frame_params.frame_type == KEY_FRAME) {
       cpi->tpl_frame[-i - 1].gf_picture = NULL;
+      cpi->tpl_frame[-1 - 1].rec_picture = NULL;
       cpi->tpl_frame[-i - 1].frame_display_index = 0;
     } else {
       cpi->tpl_frame[-i - 1].gf_picture = &cm->ref_frame_map[i]->buf;
+      cpi->tpl_frame[-i - 1].rec_picture = &cm->ref_frame_map[i]->buf;
       cpi->tpl_frame[-i - 1].frame_display_index =
           cm->ref_frame_map[i]->display_order_hint;
     }
@@ -736,6 +739,7 @@
       tpl_frame->frame_display_index =
           frame_display_index + cpi->common.current_frame.display_order_hint;
     }
+    tpl_frame->rec_picture = &tpl_frame->rec_picture_buf;
 
     av1_get_ref_frames(cpi, &ref_buffer_stack);
     int refresh_mask = av1_get_refresh_frame_flags(
@@ -774,6 +778,8 @@
     if (buf == NULL) break;
 
     tpl_frame->gf_picture = &buf->img;
+    tpl_frame->rec_picture = &tpl_frame->rec_picture_buf;
+
     // frame display index = frame offset within the gf group + start frame of
     // the gf group
     tpl_frame->frame_display_index =
@@ -851,6 +857,9 @@
         continue;
 
       mc_flow_dispenser(cpi, frame_idx);
+
+      aom_extend_frame_borders(cpi->tpl_frame[frame_idx].rec_picture,
+                               av1_num_planes(cm));
     }
 
     for (int frame_idx = cpi->tpl_gf_group_frames - 1;