Skip non-continuous FrameInfos when finding the next frame to return from FrameBuffer::NextFrame.

Also added DCHECKS to make sure that FrameInfos are not incorrectly updated.

BUG=webrtc:5514
R=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/2394823002 .

Cr-Original-Commit-Position: refs/heads/master@{#14549}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 93e451b0f5b09784c29d90407078c5e6ab771d94
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index b2b4c21..8bb19ba 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -85,8 +85,10 @@
         ++continuous_end_it;
 
       for (; frame_it != continuous_end_it; ++frame_it) {
-        if (frame_it->second.num_missing_decodable > 0)
+        if (!frame_it->second.continuous ||
+            frame_it->second.num_missing_decodable > 0) {
           continue;
+        }
 
         FrameObject* frame = frame_it->second.frame.get();
         next_frame_it = frame_it;
@@ -151,6 +153,8 @@
 
 int FrameBuffer::InsertFrame(std::unique_ptr<FrameObject> frame) {
   rtc::CritScope lock(&crit_);
+  RTC_DCHECK(frame);
+
   FrameKey key(frame->picture_id, frame->spatial_layer);
   int last_continuous_picture_id =
       last_continuous_frame_it_ == frames_.end()
@@ -186,11 +190,16 @@
 
   auto info = frames_.insert(std::make_pair(key, FrameInfo())).first;
 
-  if (!UpdateFrameInfoWithIncomingFrame(*frame, info)) {
-    frames_.erase(info);
+  if (info->second.frame) {
+    LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
+                    << ":" << static_cast<int>(key.spatial_layer)
+                    << ") already inserted, dropping frame.";
     return last_continuous_picture_id;
   }
 
+  if (!UpdateFrameInfoWithIncomingFrame(*frame, info))
+    return last_continuous_picture_id;
+
   info->second.frame = std::move(frame);
   ++num_frames_buffered_;
 
@@ -241,6 +250,7 @@
 void FrameBuffer::PropagateDecodability(const FrameInfo& info) {
   for (size_t d = 0; d < info.num_dependent_frames; ++d) {
     auto ref_info = frames_.find(info.dependent_frames[d]);
+    RTC_DCHECK(ref_info != frames_.end());
     RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U);
     --ref_info->second.num_missing_decodable;
   }
@@ -311,6 +321,8 @@
           key;
       ++ref_info->second.num_dependent_frames;
     }
+    RTC_DCHECK_LE(ref_info->second.num_missing_continuous,
+                  ref_info->second.num_missing_decodable);
   }
 
   // Check if we have the lower spatial layer frame.
@@ -331,8 +343,13 @@
           key;
       ++ref_info->second.num_dependent_frames;
     }
+    RTC_DCHECK_LE(ref_info->second.num_missing_continuous,
+                  ref_info->second.num_missing_decodable);
   }
 
+  RTC_DCHECK_LE(info->second.num_missing_continuous,
+                info->second.num_missing_decodable);
+
   return true;
 }