Add a GF_GROUP member to track dropped frames
In this CL, a flag 'is_frame_dropped' is added to
GF_GROUP structure to track whether the frame is
dropped or not during encode.
BUG=aomedia:3372
Change-Id: Ic07ee00d4158e58958671d61a6659309c5078ac4
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 35b4c4d..27ae1d0 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3734,6 +3734,7 @@
av1_rc_postencode_update_drop_frame(cpi);
release_scaled_references(cpi);
cpi->is_dropped_frame = true;
+ cpi->ppi->gf_group.is_frame_dropped[cpi->gf_frame_index] = true;
// A dropped frame might not be shown but it always takes a slot in the gf
// group. Therefore, even when it is not shown, we still need to update
// the relevant frame counters.
diff --git a/av1/encoder/firstpass.h b/av1/encoder/firstpass.h
index e799e1f..077bd85 100644
--- a/av1/encoder/firstpass.h
+++ b/av1/encoder/firstpass.h
@@ -12,6 +12,8 @@
#ifndef AOM_AV1_ENCODER_FIRSTPASS_H_
#define AOM_AV1_ENCODER_FIRSTPASS_H_
+#include <stdbool.h>
+
#include "av1/common/av1_common_int.h"
#include "av1/common/enums.h"
#include "av1/encoder/lookahead.h"
@@ -403,6 +405,8 @@
// 0 : frame is a reference frame.
// 1 : frame is a non-reference frame.
int is_frame_non_ref[MAX_STATIC_GF_GROUP_LENGTH];
+ // Indicates whether a frame is dropped.
+ bool is_frame_dropped[MAX_STATIC_GF_GROUP_LENGTH];
// Stores the display order hint of the frames not to be
// refreshed by the current frame.
diff --git a/av1/encoder/gop_structure.c b/av1/encoder/gop_structure.c
index e3878aa..e902f71 100644
--- a/av1/encoder/gop_structure.c
+++ b/av1/encoder/gop_structure.c
@@ -548,22 +548,19 @@
? 0
: cpi->common.current_frame.frame_number;
- // Initialize gf_group->frame_parallel_level and gf_group->is_frame_non_ref to
- // 0.
- memset(
- gf_group->frame_parallel_level, 0,
- sizeof(gf_group->frame_parallel_level[0]) * MAX_STATIC_GF_GROUP_LENGTH);
- memset(gf_group->is_frame_non_ref, 0,
- sizeof(gf_group->is_frame_non_ref[0]) * MAX_STATIC_GF_GROUP_LENGTH);
- memset(gf_group->src_offset, 0,
- sizeof(gf_group->src_offset[0]) * MAX_STATIC_GF_GROUP_LENGTH);
+ // Initialize gf_group->frame_parallel_level, gf_group->is_frame_non_ref,
+ // gf_group->src_offset and gf_group->is_frame_dropped with 0.
+ memset(gf_group->frame_parallel_level, 0,
+ sizeof(gf_group->frame_parallel_level));
+ memset(gf_group->is_frame_non_ref, 0, sizeof(gf_group->is_frame_non_ref));
+ memset(gf_group->src_offset, 0, sizeof(gf_group->src_offset));
+ memset(gf_group->is_frame_dropped, false, sizeof(gf_group->is_frame_dropped));
// Initialize gf_group->skip_frame_refresh and gf_group->skip_frame_as_ref
// with INVALID_IDX.
memset(gf_group->skip_frame_refresh, INVALID_IDX,
- sizeof(gf_group->skip_frame_refresh[0][0]) *
- MAX_STATIC_GF_GROUP_LENGTH * REF_FRAMES);
+ sizeof(gf_group->skip_frame_refresh));
memset(gf_group->skip_frame_as_ref, INVALID_IDX,
- sizeof(gf_group->skip_frame_as_ref[0]) * MAX_STATIC_GF_GROUP_LENGTH);
+ sizeof(gf_group->skip_frame_as_ref));
int kf_decomp = cpi->oxcf.kf_cfg.enable_keyframe_filtering > 1;
// This is a patch that fixes https://crbug.com/aomedia/3163