shithub: libvpx

Download patch

ref: 93edc3db13c646069fad283caa8fbb0c8d45225a
parent: 9f02ba36847738ebf824a6dcd609d354c08859ed
author: Jingning Han <jingning@google.com>
date: Mon Oct 22 12:25:43 EDT 2018

Bypass processing on use existing frame

The use of show existing frame requries no further operation on
that coding frame. Bypass the corresponding process.

Change-Id: Ia092027a8a543be0ca54c00b4d51e453039712b8

--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -5368,6 +5368,7 @@
 typedef struct GF_PICTURE {
   YV12_BUFFER_CONFIG *frame;
   int ref_frame[3];
+  FRAME_UPDATE_TYPE update_type;
 } GF_PICTURE;
 
 void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
@@ -5423,6 +5424,7 @@
   // Initialize Golden reference frame.
   gf_picture[0].frame = get_ref_frame_buffer(cpi, GOLDEN_FRAME);
   for (i = 0; i < 3; ++i) gf_picture[0].ref_frame[i] = -1;
+  gf_picture[0].update_type = gf_group->update_type[0];
   gld_index = 0;
   ++*tpl_group_frames;
 
@@ -5431,6 +5433,7 @@
   gf_picture[1].ref_frame[0] = gld_index;
   gf_picture[1].ref_frame[1] = lst_index;
   gf_picture[1].ref_frame[2] = alt_index;
+  gf_picture[1].update_type = gf_group->update_type[1];
   alt_index = 1;
   ++*tpl_group_frames;
 
@@ -5446,6 +5449,7 @@
     gf_picture[frame_idx].ref_frame[0] = gld_index;
     gf_picture[frame_idx].ref_frame[1] = lst_index;
     gf_picture[frame_idx].ref_frame[2] = alt_index;
+    gf_picture[frame_idx].update_type = gf_group->update_type[frame_idx];
 
     switch (gf_group->update_type[frame_idx]) {
       case ARF_UPDATE:
@@ -5460,7 +5464,7 @@
         --arf_stack_size;
         break;
       case USE_BUF_FRAME:
-        lst_index = frame_idx;
+        lst_index = alt_index;
         alt_index = stack_pop(arf_index_stack, arf_stack_size);
         --arf_stack_size;
         break;
@@ -5492,6 +5496,7 @@
     gf_picture[frame_idx].ref_frame[0] = gld_index;
     gf_picture[frame_idx].ref_frame[1] = lst_index;
     gf_picture[frame_idx].ref_frame[2] = alt_index;
+    gf_picture[frame_idx].update_type = LF_UPDATE;
     lst_index = frame_idx;
     ++*tpl_group_frames;
     ++extend_frame_count;
@@ -6347,6 +6352,7 @@
 
   // Backward propagation from tpl_group_frames to 1.
   for (frame_idx = tpl_group_frames - 1; frame_idx > 0; --frame_idx) {
+    if (gf_picture[frame_idx].update_type == USE_BUF_FRAME) continue;
     mc_flow_dispenser(cpi, gf_picture, frame_idx, bsize);
   }
 #if CONFIG_NON_GREEDY_MV