diff options
author | Jingning Han <jingning@google.com> | 2018-10-16 21:24:17 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2018-10-16 21:24:17 +0000 |
commit | 0c5fd59efdb234fe0231615c858e1f9c9945cbfa (patch) | |
tree | 696cd28be76a1660d58455b64a3a88d7fb4af121 /vp9 | |
parent | 4f5444949fd235b1d40af5be2d2d3d9e740f58e8 (diff) | |
parent | d8825f16b2efd6054ac19953ffe99c9a827041cb (diff) | |
download | libvpx-0c5fd59efdb234fe0231615c858e1f9c9945cbfa.tar libvpx-0c5fd59efdb234fe0231615c858e1f9c9945cbfa.tar.gz libvpx-0c5fd59efdb234fe0231615c858e1f9c9945cbfa.tar.bz2 libvpx-0c5fd59efdb234fe0231615c858e1f9c9945cbfa.zip |
Merge "Refactor tpl dependency model to support multi-layer ARF updates"
Diffstat (limited to 'vp9')
-rw-r--r-- | vp9/encoder/vp9_encoder.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c index c53347c6a..51c9337de 100644 --- a/vp9/encoder/vp9_encoder.c +++ b/vp9/encoder/vp9_encoder.c @@ -5362,6 +5362,8 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture, int gld_index = -1; int alt_index = -1; int lst_index = -1; + int arf_index_stack[MAX_ARF_LAYERS]; + int arf_stack_size = 0; int extend_frame_count = 0; int pframe_qindex = cpi->tpl_stats[2].base_qindex; @@ -5369,6 +5371,7 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture, int8_t recon_frame_index[REFS_PER_FRAME + MAX_ARF_LAYERS]; memset(recon_frame_index, -1, sizeof(recon_frame_index)); + stack_init(arf_index_stack, MAX_ARF_LAYERS); // TODO(jingning): To be used later for gf frame type parsing. (void)gf_group; @@ -5406,7 +5409,7 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture, gld_index = 0; ++*tpl_group_frames; - // Initialize ARF frame + // Initialize base layer ARF frame gf_picture[1].frame = cpi->Source; gf_picture[1].ref_frame[0] = gld_index; gf_picture[1].ref_frame[1] = lst_index; @@ -5427,8 +5430,27 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture, gf_picture[frame_idx].ref_frame[1] = lst_index; gf_picture[frame_idx].ref_frame[2] = alt_index; + switch (gf_group->update_type[frame_idx]) { + case ARF_UPDATE: + stack_push(arf_index_stack, alt_index, arf_stack_size); + ++arf_stack_size; + alt_index = frame_idx; + break; + case LF_UPDATE: lst_index = frame_idx; break; + case OVERLAY_UPDATE: + gld_index = frame_idx; + alt_index = stack_pop(arf_index_stack, arf_stack_size); + --arf_stack_size; + break; + case USE_BUF_FRAME: + lst_index = frame_idx; + alt_index = stack_pop(arf_index_stack, arf_stack_size); + --arf_stack_size; + break; + default: break; + } + ++*tpl_group_frames; - lst_index = frame_idx; // The length of group of pictures is baseline_gf_interval, plus the // beginning golden frame from last GOP, plus the last overlay frame in @@ -5436,8 +5458,6 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture, if (frame_idx == gf_group->gf_group_size) break; } - gld_index = frame_idx; - lst_index = VPXMAX(0, frame_idx - 1); alt_index = -1; ++frame_idx; |