Register callback for key frame request from media transport.

Bug: webrtc:9719
Change-Id: Ibeadadb8e477d6d712fd69427c95e1e4f1940854
Reviewed-on: https://webrtc-review.googlesource.com/c/120340
Commit-Queue: Niels Moller <nisse@webrtc.org>
Commit-Queue: Peter Slatala <psla@webrtc.org>
Reviewed-by: Peter Slatala <psla@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26473}
diff --git a/video/BUILD.gn b/video/BUILD.gn
index d9667c6..4da1e23 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -14,8 +14,8 @@
     "buffered_frame_decryptor.h",
     "call_stats.cc",
     "call_stats.h",
-    "encoder_rtcp_feedback.cc",
-    "encoder_rtcp_feedback.h",
+    "encoder_key_frame_callback.cc",
+    "encoder_key_frame_callback.h",
     "quality_threshold.cc",
     "quality_threshold.h",
     "receive_statistics_proxy.cc",
@@ -454,7 +454,7 @@
       "buffered_frame_decryptor_unittest.cc",
       "call_stats_unittest.cc",
       "cpu_scaling_tests.cc",
-      "encoder_rtcp_feedback_unittest.cc",
+      "encoder_key_frame_callback_unittest.cc",
       "end_to_end_tests/bandwidth_tests.cc",
       "end_to_end_tests/call_operation_tests.cc",
       "end_to_end_tests/codec_tests.cc",
diff --git a/video/encoder_rtcp_feedback.cc b/video/encoder_key_frame_callback.cc
similarity index 65%
rename from video/encoder_rtcp_feedback.cc
rename to video/encoder_key_frame_callback.cc
index 021b11f..447a3af 100644
--- a/video/encoder_rtcp_feedback.cc
+++ b/video/encoder_key_frame_callback.cc
@@ -8,18 +8,18 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "video/encoder_rtcp_feedback.h"
+#include "video/encoder_key_frame_callback.h"
 
-#include "api/video/video_stream_encoder_interface.h"
 #include "rtc_base/checks.h"
 
 static const int kMinKeyFrameRequestIntervalMs = 300;
 
 namespace webrtc {
 
-EncoderRtcpFeedback::EncoderRtcpFeedback(Clock* clock,
-                                         const std::vector<uint32_t>& ssrcs,
-                                         VideoStreamEncoderInterface* encoder)
+EncoderKeyFrameCallback::EncoderKeyFrameCallback(
+    Clock* clock,
+    const std::vector<uint32_t>& ssrcs,
+    VideoStreamEncoderInterface* encoder)
     : clock_(clock),
       ssrcs_(ssrcs),
       video_stream_encoder_(encoder),
@@ -27,7 +27,7 @@
   RTC_DCHECK(!ssrcs.empty());
 }
 
-bool EncoderRtcpFeedback::HasSsrc(uint32_t ssrc) {
+bool EncoderKeyFrameCallback::HasSsrc(uint32_t ssrc) {
   for (uint32_t registered_ssrc : ssrcs_) {
     if (registered_ssrc == ssrc) {
       return true;
@@ -36,7 +36,7 @@
   return false;
 }
 
-void EncoderRtcpFeedback::OnReceivedIntraFrameRequest(uint32_t ssrc) {
+void EncoderKeyFrameCallback::OnReceivedIntraFrameRequest(uint32_t ssrc) {
   RTC_DCHECK(HasSsrc(ssrc));
   {
     int64_t now_ms = clock_->TimeInMilliseconds();
@@ -51,4 +51,14 @@
   video_stream_encoder_->SendKeyFrame();
 }
 
+void EncoderKeyFrameCallback::OnKeyFrameRequested(uint64_t channel_id) {
+  if (channel_id != ssrcs_[0]) {
+    RTC_LOG(LS_INFO) << "Key frame request on unknown channel id " << channel_id
+                     << " expected " << ssrcs_[0];
+    return;
+  }
+
+  video_stream_encoder_->SendKeyFrame();
+}
+
 }  // namespace webrtc
diff --git a/video/encoder_key_frame_callback.h b/video/encoder_key_frame_callback.h
new file mode 100644
index 0000000..4e0ac56
--- /dev/null
+++ b/video/encoder_key_frame_callback.h
@@ -0,0 +1,53 @@
+/*
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+#ifndef VIDEO_ENCODER_KEY_FRAME_CALLBACK_H_
+#define VIDEO_ENCODER_KEY_FRAME_CALLBACK_H_
+
+#include <vector>
+
+#include "api/media_transport_interface.h"
+#include "api/video/video_stream_encoder_interface.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "rtc_base/critical_section.h"
+#include "system_wrappers/include/clock.h"
+
+namespace webrtc {
+
+class VideoStreamEncoderInterface;
+
+// This class receives keyframe requests from either Mediatransport or the
+// RtpRtcp module.
+// TODO(bugs.webrtc.org/9719): Should be eliminated when RtpMediaTransport is
+// implemented.
+class EncoderKeyFrameCallback : public RtcpIntraFrameObserver,
+                                public MediaTransportKeyFrameRequestCallback {
+ public:
+  EncoderKeyFrameCallback(Clock* clock,
+                          const std::vector<uint32_t>& ssrcs,
+                          VideoStreamEncoderInterface* encoder);
+  void OnReceivedIntraFrameRequest(uint32_t ssrc) override;
+
+  // Implements MediaTransportKeyFrameRequestCallback
+  void OnKeyFrameRequested(uint64_t channel_id) override;
+
+ private:
+  bool HasSsrc(uint32_t ssrc);
+
+  Clock* const clock_;
+  const std::vector<uint32_t> ssrcs_;
+  VideoStreamEncoderInterface* const video_stream_encoder_;
+
+  rtc::CriticalSection crit_;
+  int64_t time_last_intra_request_ms_ RTC_GUARDED_BY(crit_);
+};
+
+}  // namespace webrtc
+
+#endif  // VIDEO_ENCODER_KEY_FRAME_CALLBACK_H_
diff --git a/video/encoder_rtcp_feedback_unittest.cc b/video/encoder_key_frame_callback_unittest.cc
similarity index 64%
rename from video/encoder_rtcp_feedback_unittest.cc
rename to video/encoder_key_frame_callback_unittest.cc
index 1ce387b..2491fb8 100644
--- a/video/encoder_rtcp_feedback_unittest.cc
+++ b/video/encoder_key_frame_callback_unittest.cc
@@ -8,7 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
-#include "video/encoder_rtcp_feedback.h"
+#include "video/encoder_key_frame_callback.h"
 
 #include <memory>
 
@@ -25,7 +25,7 @@
   VieKeyRequestTest()
       : simulated_clock_(123456789),
         encoder_(),
-        encoder_rtcp_feedback_(
+        encoder_key_frame_callback_(
             &simulated_clock_,
             std::vector<uint32_t>(1, VieKeyRequestTest::kSsrc),
             &encoder_) {}
@@ -35,26 +35,31 @@
 
   SimulatedClock simulated_clock_;
   testing::StrictMock<MockVideoStreamEncoder> encoder_;
-  EncoderRtcpFeedback encoder_rtcp_feedback_;
+  EncoderKeyFrameCallback encoder_key_frame_callback_;
 };
 
 TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) {
   EXPECT_CALL(encoder_, SendKeyFrame()).Times(1);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
 }
 
 TEST_F(VieKeyRequestTest, TooManyOnReceivedIntraFrameRequest) {
   EXPECT_CALL(encoder_, SendKeyFrame()).Times(1);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
   simulated_clock_.AdvanceTimeMilliseconds(10);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
 
   EXPECT_CALL(encoder_, SendKeyFrame()).Times(1);
   simulated_clock_.AdvanceTimeMilliseconds(300);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
+  encoder_key_frame_callback_.OnReceivedIntraFrameRequest(kSsrc);
+}
+
+TEST_F(VieKeyRequestTest, TriggerRequestFromMediaTransport) {
+  EXPECT_CALL(encoder_, SendKeyFrame()).Times(1);
+  encoder_key_frame_callback_.OnKeyFrameRequested(kSsrc);
 }
 
 }  // namespace webrtc
diff --git a/video/encoder_rtcp_feedback.h b/video/encoder_rtcp_feedback.h
deleted file mode 100644
index bdae914..0000000
--- a/video/encoder_rtcp_feedback.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-#ifndef VIDEO_ENCODER_RTCP_FEEDBACK_H_
-#define VIDEO_ENCODER_RTCP_FEEDBACK_H_
-
-#include <vector>
-
-#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "rtc_base/critical_section.h"
-#include "system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class VideoStreamEncoderInterface;
-
-class EncoderRtcpFeedback : public RtcpIntraFrameObserver {
- public:
-  EncoderRtcpFeedback(Clock* clock,
-                      const std::vector<uint32_t>& ssrcs,
-                      VideoStreamEncoderInterface* encoder);
-  void OnReceivedIntraFrameRequest(uint32_t ssrc) override;
-
- private:
-  bool HasSsrc(uint32_t ssrc);
-
-  Clock* const clock_;
-  const std::vector<uint32_t> ssrcs_;
-  VideoStreamEncoderInterface* const video_stream_encoder_;
-
-  rtc::CriticalSection crit_;
-  int64_t time_last_intra_request_ms_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-
-#endif  // VIDEO_ENCODER_RTCP_FEEDBACK_H_
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index 2a8e646..5635550 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -133,7 +133,7 @@
 }
 
 RtpSenderObservers CreateObservers(CallStats* call_stats,
-                                   EncoderRtcpFeedback* encoder_feedback,
+                                   EncoderKeyFrameCallback* encoder_feedback,
                                    SendStatisticsProxy* stats_proxy,
                                    SendDelayStats* send_delay_stats) {
   RtpSenderObservers observers;
@@ -242,6 +242,7 @@
     // The configured ssrc is interpreted as a channel id, so there must be
     // exactly one.
     RTC_DCHECK_EQ(config_->rtp.ssrcs.size(), 1);
+    media_transport_->SetKeyFrameRequestCallback(&encoder_feedback_);
   } else {
     RTC_DCHECK(!config_->rtp.ssrcs.empty());
   }
@@ -324,6 +325,9 @@
       << "VideoSendStreamImpl::Stop not called";
   RTC_LOG(LS_INFO) << "~VideoSendStreamInternal: " << config_->ToString();
   transport_->DestroyRtpVideoSender(rtp_video_sender_);
+  if (media_transport_) {
+    media_transport_->SetKeyFrameRequestCallback(nullptr);
+  }
 }
 
 void VideoSendStreamImpl::RegisterProcessThread(
diff --git a/video/video_send_stream_impl.h b/video/video_send_stream_impl.h
index a453228..050da3e 100644
--- a/video/video_send_stream_impl.h
+++ b/video/video_send_stream_impl.h
@@ -40,7 +40,7 @@
 #include "rtc_base/thread_annotations.h"
 #include "rtc_base/weak_ptr.h"
 #include "video/call_stats.h"
-#include "video/encoder_rtcp_feedback.h"
+#include "video/encoder_key_frame_callback.h"
 #include "video/send_delay_stats.h"
 #include "video/send_statistics_proxy.h"
 #include "video/video_send_stream.h"
@@ -166,7 +166,7 @@
   bool has_packet_feedback_;
 
   VideoStreamEncoderInterface* const video_stream_encoder_;
-  EncoderRtcpFeedback encoder_feedback_;
+  EncoderKeyFrameCallback encoder_feedback_;
 
   RtcpBandwidthObserver* const bandwidth_observer_;
   RtpVideoSenderInterface* const rtp_video_sender_;