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);