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;