Move keyframe requests outside encoder mutex.

Enables faster keyframe requests since they are no longer blocked by
calls to the encoder.

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

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

Cr-Commit-Position: refs/heads/master@{#11294}
diff --git a/webrtc/modules/video_coding/video_sender_unittest.cc b/webrtc/modules/video_coding/video_sender_unittest.cc
index 741c7b7..f766b86 100644
--- a/webrtc/modules/video_coding/video_sender_unittest.cc
+++ b/webrtc/modules/video_coding/video_sender_unittest.cc
@@ -40,7 +40,12 @@
 namespace webrtc {
 namespace vcm {
 namespace {
-enum { kMaxNumberOfTemporalLayers = 3 };
+static const int kDefaultHeight = 720;
+static const int kDefaultWidth = 1280;
+static const int kMaxNumberOfTemporalLayers = 3;
+static const int kNumberOfLayers = 3;
+static const int kNumberOfStreams = 3;
+static const int kUnusedPayloadType = 10;
 
 struct Vp8StreamInfo {
   float framerate_fps[kMaxNumberOfTemporalLayers];
@@ -196,12 +201,6 @@
 
 class TestVideoSenderWithMockEncoder : public TestVideoSender {
  protected:
-  static const int kDefaultWidth = 1280;
-  static const int kDefaultHeight = 720;
-  static const int kNumberOfStreams = 3;
-  static const int kNumberOfLayers = 3;
-  static const int kUnusedPayloadType = 10;
-
   void SetUp() override {
     TestVideoSender::SetUp();
     sender_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType, false);
@@ -222,20 +221,29 @@
   void TearDown() override { sender_.reset(); }
 
   void ExpectIntraRequest(int stream) {
-    if (stream == -1) {
-      // No intra request expected.
-      EXPECT_CALL(
-          encoder_,
-          Encode(_, _, Pointee(ElementsAre(kVideoFrameDelta, kVideoFrameDelta,
-                                           kVideoFrameDelta))))
+    ExpectEncodeWithFrameTypes(stream, false);
+  }
+
+  void ExpectInitialKeyFrames() {
+    ExpectEncodeWithFrameTypes(-1, true);
+  }
+
+  void ExpectEncodeWithFrameTypes(int intra_request_stream, bool first_frame) {
+    if (intra_request_stream == -1) {
+      // No intra request expected, keyframes on first frame.
+      FrameType frame_type = first_frame ? kVideoFrameKey : kVideoFrameDelta;
+      EXPECT_CALL(encoder_,
+                  Encode(_, _, Pointee(ElementsAre(frame_type, frame_type,
+                                                   frame_type))))
           .Times(1)
           .WillRepeatedly(Return(0));
       return;
     }
-    assert(stream >= 0);
-    assert(stream < kNumberOfStreams);
+    ASSERT_FALSE(first_frame);
+    ASSERT_GE(intra_request_stream, 0);
+    ASSERT_LT(intra_request_stream, kNumberOfStreams);
     std::vector<FrameType> frame_types(kNumberOfStreams, kVideoFrameDelta);
-    frame_types[stream] = kVideoFrameKey;
+    frame_types[intra_request_stream] = kVideoFrameKey;
     EXPECT_CALL(encoder_,
                 Encode(_, _, Pointee(ElementsAreArray(&frame_types[0],
                                                       frame_types.size()))))
@@ -260,6 +268,9 @@
 };
 
 TEST_F(TestVideoSenderWithMockEncoder, TestIntraRequests) {
+  // Initial request should be all keyframes.
+  ExpectInitialKeyFrames();
+  AddFrame();
   EXPECT_EQ(0, sender_->IntraFrameRequest(0));
   ExpectIntraRequest(0);
   AddFrame();
@@ -293,6 +304,9 @@
   // Register encoder with internal capture.
   sender_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType, true);
   EXPECT_EQ(0, sender_->RegisterSendCodec(&settings_, 1, 1200));
+  // Initial request should be all keyframes.
+  ExpectInitialKeyFrames();
+  AddFrame();
   ExpectIntraRequest(0);
   EXPECT_EQ(0, sender_->IntraFrameRequest(0));
   ExpectIntraRequest(1);