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