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