Set a flag for forward keyframes
Sets a DELAYED_RANDOM_ACCESS_POINT flag if one of the invisible
frames in a packet is a key frame.
BUG=aomedia:2084
Change-Id: I2240d68a0bbe9210d9b0e06bf2edf6117a667c87
diff --git a/aom/aom_encoder.h b/aom/aom_encoder.h
index a833b4e..777236f 100644
--- a/aom/aom_encoder.h
+++ b/aom/aom_encoder.h
@@ -103,6 +103,8 @@
#define AOM_FRAME_IS_SWITCH 0x20
/*!\brief this is an error-resilient frame */
#define AOM_FRAME_IS_ERROR_RESILIENT 0x40
+/*!\brief this is a key-frame dependent recovery-point frame */
+#define AOM_FRAME_IS_DELAYED_RANDOM_ACCESS_POINT 0x80
/*!\brief Error Resilient flags
*
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index 5faa26d..3ea1ca3 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -1342,6 +1342,7 @@
unsigned int lib_flags = 0;
int is_frame_visible = 0;
int index_size = 0;
+ int has_fwd_keyframe = 0;
// invisible frames get packed with the next visible frame
while (cx_data_sz - index_size >= ctx->cx_data_sz / 2 &&
!is_frame_visible &&
@@ -1416,6 +1417,9 @@
index_size = MAG_SIZE * (ctx->pending_frame_count - 1) + 2;
is_frame_visible = cpi->common.show_frame;
+
+ has_fwd_keyframe |=
+ (!is_frame_visible && cpi->common.frame_type == KEY_FRAME);
}
}
if (is_frame_visible) {
@@ -1447,6 +1451,11 @@
pkt.data.frame.pts = ticks_to_timebase_units(timebase, dst_time_stamp);
pkt.data.frame.flags = get_frame_pkt_flags(cpi, lib_flags);
+ if (has_fwd_keyframe) {
+ // If one of the invisible frames in the packet is a keyframe, set
+ // the delayed random access point flag.
+ pkt.data.frame.flags |= AOM_FRAME_IS_DELAYED_RANDOM_ACCESS_POINT;
+ }
pkt.data.frame.duration = (uint32_t)ticks_to_timebase_units(
timebase, dst_end_time_stamp - dst_time_stamp);