Only treat H.264 frames containing SPS, PPS, and IDR as key frames.

This is protected behind a field trial, for controlled rollout.

TESTED=MediaCodec (Qualcomm + Exynos) and VideoToolbox senders.
BUG=webrtc:8423

Change-Id: Ibccefb3d374e4a44461d33e77eff754d8d752666
Reviewed-on: https://webrtc-review.googlesource.com/13863
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Commit-Queue: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20408}
diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc
index 7a724a8..7c9c41b 100644
--- a/modules/video_coding/frame_object.cc
+++ b/modules/video_coding/frame_object.cc
@@ -12,6 +12,7 @@
 #include "common_video/h264/h264_common.h"
 #include "modules/video_coding/packet_buffer.h"
 #include "rtc_base/checks.h"
+#include "system_wrappers/include/field_trial.h"
 
 namespace webrtc {
 namespace video_coding {
@@ -69,11 +70,14 @@
   _length = frame_size;
 
   // For H264 frames we can't determine the frame type by just looking at the
-  // first packet. Instead we consider the frame to be a keyframe if it
-  // contains an IDR NALU.
+  // first packet. Instead we consider the frame to be a keyframe if it contains
+  // an IDR, and SPS/PPS if the field trial is set.
   if (codec_type_ == kVideoCodecH264) {
     _frameType = kVideoFrameDelta;
     frame_type_ = kVideoFrameDelta;
+    bool contains_sps = false;
+    bool contains_pps = false;
+    bool contains_idr = false;
     for (uint16_t seq_num = first_seq_num;
          seq_num != static_cast<uint16_t>(last_seq_num + 1) &&
          _frameType == kVideoFrameDelta;
@@ -82,13 +86,23 @@
       RTC_CHECK(packet);
       const RTPVideoHeaderH264& header = packet->video_header.codecHeader.H264;
       for (size_t i = 0; i < header.nalus_length; ++i) {
-        if (header.nalus[i].type == H264::NaluType::kIdr) {
-          _frameType = kVideoFrameKey;
-          frame_type_ = kVideoFrameKey;
-          break;
+        if (header.nalus[i].type == H264::NaluType::kSps) {
+          contains_sps = true;
+        } else if (header.nalus[i].type == H264::NaluType::kPps) {
+          contains_pps = true;
+        } else if (header.nalus[i].type == H264::NaluType::kIdr) {
+          contains_idr = true;
         }
       }
     }
+    const bool sps_pps_idr_is_keyframe =
+        field_trial::IsEnabled("WebRTC-SpsPpsIdrIsH264Keyframe");
+    if ((sps_pps_idr_is_keyframe && contains_idr && contains_sps &&
+         contains_pps) ||
+        (!sps_pps_idr_is_keyframe && contains_idr)) {
+      _frameType = kVideoFrameKey;
+      frame_type_ = kVideoFrameKey;
+    }
   } else {
     _frameType = first_packet->frameType;
     frame_type_ = first_packet->frameType;