Fix frame offset computation for GOP extension
authorJingning Han <jingning@google.com>
Mon, 22 Oct 2018 21:21:48 +0000 (14:21 -0700)
committerJingning Han <jingning@google.com>
Tue, 23 Oct 2018 17:34:58 +0000 (10:34 -0700)
Properly compute the extended GOP frames' buffer offsets.

Change-Id: I9aed14f4b8d623f1832e782828dce07aa546507d

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_ratectrl.c

index b31f180..b5f04e3 100644 (file)
@@ -5382,6 +5382,7 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
   int arf_stack_size = 0;
   int extend_frame_count = 0;
   int pframe_qindex = cpi->tpl_stats[2].base_qindex;
+  int frame_gop_offset = 0;
 
   RefCntBuffer *frame_bufs = cm->buffer_pool->frame_bufs;
   int8_t recon_frame_index[REFS_PER_FRAME + MAX_ARF_LAYERS];
@@ -5435,9 +5436,9 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
 
   // Initialize P frames
   for (frame_idx = 2; frame_idx < MAX_ARF_GOP_SIZE; ++frame_idx) {
-    const int frame_gop_offset = gf_group->frame_gop_index[frame_idx];
-    struct lookahead_entry *buf =
-        vp9_lookahead_peek(cpi->lookahead, frame_gop_offset - 1);
+    struct lookahead_entry *buf;
+    frame_gop_offset = gf_group->frame_gop_index[frame_idx];
+    buf = vp9_lookahead_peek(cpi->lookahead, frame_gop_offset - 1);
 
     if (buf == NULL) break;
 
@@ -5476,11 +5477,12 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
 
   alt_index = -1;
   ++frame_idx;
+  ++frame_gop_offset;
 
   // Extend two frames outside the current gf group.
   for (; frame_idx < MAX_LAG_BUFFERS && extend_frame_count < 2; ++frame_idx) {
     struct lookahead_entry *buf =
-        vp9_lookahead_peek(cpi->lookahead, frame_idx - 2);
+        vp9_lookahead_peek(cpi->lookahead, frame_gop_offset - 1);
 
     if (buf == NULL) break;
 
@@ -5493,6 +5495,7 @@ void init_gop_frames(VP9_COMP *cpi, GF_PICTURE *gf_picture,
     lst_index = frame_idx;
     ++*tpl_group_frames;
     ++extend_frame_count;
+    ++frame_gop_offset;
   }
 }
 
index 81cf885..e0d7190 100644 (file)
@@ -1486,7 +1486,7 @@ void vp9_estimate_qp_gop(VP9_COMP *cpi) {
   int idx;
   const int gf_index = cpi->twopass.gf_group.index;
 
-  for (idx = 1; idx < gop_length; ++idx) {
+  for (idx = 1; idx <= gop_length; ++idx) {
     TplDepFrame *tpl_frame = &cpi->tpl_stats[idx];
     int target_rate = cpi->twopass.gf_group.bit_allocation[idx];
     cpi->twopass.gf_group.index = idx;