summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2018-07-27 15:08:39 -0700
committerJingning Han <jingning@google.com>2018-07-30 21:13:55 -0700
commit6b22c999ca9192cee05c28dd9dabb8977226d37b (patch)
tree997da0829024a7682553c3066c26e5caa525debd /vp9/encoder
parent3ff77503c935c105f5cab28bd7c508ba0a66080e (diff)
downloadlibvpx-6b22c999ca9192cee05c28dd9dabb8977226d37b.tar
libvpx-6b22c999ca9192cee05c28dd9dabb8977226d37b.tar.gz
libvpx-6b22c999ca9192cee05c28dd9dabb8977226d37b.tar.bz2
libvpx-6b22c999ca9192cee05c28dd9dabb8977226d37b.zip
Add frame pointer to support recon frames in tpl model
Add frame pointer to re-use spare frames to store the reconstructed frames. Change-Id: I870aa048fc9b7d8b356aa73df3a92b4670425f95
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encoder.c30
-rw-r--r--vp9/encoder/vp9_encoder.h1
2 files changed, 30 insertions, 1 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index afe51366d..c08199785 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -5496,13 +5496,41 @@ typedef struct GF_PICTURE {
void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
const GF_GROUP *gf_group, int *tpl_group_frames) {
- int frame_idx, i;
+ VP9_COMMON *cm = &cpi->common;
+ int frame_idx = 0;
+ int i;
int gld_index = -1;
int alt_index = -1;
int lst_index = -1;
int extend_frame_count = 0;
int pframe_qindex = cpi->tpl_stats[2].base_qindex;
+ RefCntBuffer *frame_bufs = cm->buffer_pool->frame_bufs;
+ int recon_frame_index[REFS_PER_FRAME + 1] = { -1, -1, -1, -1 };
+
+ for (i = 0; i < FRAME_BUFFERS && frame_idx < REFS_PER_FRAME + 1; ++i) {
+ if (frame_bufs[i].ref_count == 0) {
+ alloc_frame_mvs(cm, i);
+ if (vpx_realloc_frame_buffer(&frame_bufs[i].buf, cm->width, cm->height,
+ cm->subsampling_x, cm->subsampling_y,
+#if CONFIG_VP9_HIGHBITDEPTH
+ cm->use_highbitdepth,
+#endif
+ VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
+ NULL, NULL, NULL))
+ vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
+ "Failed to allocate frame buffer");
+
+ recon_frame_index[frame_idx] = i;
+ ++frame_idx;
+ }
+ }
+
+ for (i = 0; i < REFS_PER_FRAME + 1; ++i) {
+ assert(recon_frame_index[i] >= 0);
+ cpi->tpl_recon_frames[i] = &frame_bufs[recon_frame_index[i]].buf;
+ }
+
*tpl_group_frames = 0;
// Initialize Golden reference frame.
diff --git a/vp9/encoder/vp9_encoder.h b/vp9/encoder/vp9_encoder.h
index 0c6375c65..038413a96 100644
--- a/vp9/encoder/vp9_encoder.h
+++ b/vp9/encoder/vp9_encoder.h
@@ -501,6 +501,7 @@ typedef struct VP9_COMP {
YV12_BUFFER_CONFIG *raw_source_frame;
TplDepFrame tpl_stats[MAX_LAG_BUFFERS];
+ YV12_BUFFER_CONFIG *tpl_recon_frames[REFS_PER_FRAME + 1];
TileDataEnc *tile_data;
int allocated_tiles; // Keep track of memory allocated for tiles.