]> granicus.if.org Git - libvpx/commitdiff
Rework two_pass_first_group_inter()
authorJingning Han <jingning@google.com>
Mon, 10 Sep 2018 18:55:10 +0000 (11:55 -0700)
committerJingning Han <jingning@google.com>
Mon, 10 Sep 2018 19:00:08 +0000 (12:00 -0700)
This function is used to in part decide if to trigger recode loop
for the first normal P frame in a GOP. Rework its design logic to
support the GOP with multi-layer ARF. Allow recode when there is
a transition from ARF/OVERLAY/USE_BUF to normal P frame.

The overall coding performance for multi-ARF gets slightly better
(less than 0.1% for show_existing_frame case). Tested on a few
clips, the encoding speed remains similar too. This change primarily
serves to help integration of multi-layer ARF and dual-ARF systems.

Change-Id: Ia44e44526b05029b1546985b3eb649e767d5444f

vp9/encoder/vp9_encoder.c

index 69ab0445c9d7ad1ced5c70f896c1ca17ef1a53a0..dae718b99037b746283cfdc3bec4535562f4144f 100644 (file)
@@ -2921,9 +2921,12 @@ static int big_rate_miss(VP9_COMP *cpi) {
 static int two_pass_first_group_inter(VP9_COMP *cpi) {
   TWO_PASS *const twopass = &cpi->twopass;
   GF_GROUP *const gf_group = &twopass->gf_group;
-  if ((cpi->oxcf.pass == 2) &&
-      (gf_group->index == gf_group->first_inter_index)) {
-    return 1;
+  const int gfg_index = gf_group->index;
+
+  if (cpi->oxcf.pass == 2) {
+    if (gfg_index == 0) return gf_group->update_type[gfg_index] == LF_UPDATE;
+    return gf_group->update_type[gfg_index - 1] != LF_UPDATE &&
+           gf_group->update_type[gfg_index] == LF_UPDATE;
   } else {
     return 0;
   }