Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 00e7279adbd875f7a722e5eb8a0b6d48fd509e36..7224478e142efc5f3e6e907d9ec83036d7d7311e 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -15,6 +15,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "webrtc/base/checks.h" |
+#include "webrtc/base/event.h" |
#include "webrtc/base/scoped_ptr.h" |
#include "webrtc/call.h" |
#include "webrtc/frame_callback.h" |
@@ -1445,6 +1446,68 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { |
tester.RunTest(); |
} |
+TEST_F(EndToEndTest, ReceivesTransportFeedback) { |
+ static const int kExtensionId = 5; |
+ |
+ class TransportFeedbackObserver : public test::DirectTransport { |
+ public: |
+ TransportFeedbackObserver(rtc::Event* done_event) : done_(done_event) {} |
+ virtual ~TransportFeedbackObserver() {} |
+ |
+ bool SendRtcp(const uint8_t* data, size_t length) override { |
+ RTCPUtility::RTCPParserV2 parser(data, length, true); |
+ EXPECT_TRUE(parser.IsValid()); |
+ |
+ RTCPUtility::RTCPPacketTypes packet_type = parser.Begin(); |
+ while (packet_type != RTCPUtility::RTCPPacketTypes::kInvalid) { |
+ if (packet_type == RTCPUtility::RTCPPacketTypes::kTransportFeedback) { |
+ done_->Set(); |
+ break; |
+ } |
+ packet_type = parser.Iterate(); |
+ } |
+ |
+ return test::DirectTransport::SendRtcp(data, length); |
+ } |
+ |
+ rtc::Event* done_; |
+ }; |
+ |
+ class TransportFeedbackTester : public MultiStreamTest { |
+ public: |
+ TransportFeedbackTester() : done_(false, false) {} |
+ virtual ~TransportFeedbackTester() {} |
+ |
+ protected: |
+ void Wait() override { |
+ EXPECT_TRUE(done_.Wait(CallTest::kDefaultTimeoutMs)); |
+ } |
+ |
+ void UpdateSendConfig( |
+ size_t stream_index, |
+ VideoSendStream::Config* send_config, |
+ VideoEncoderConfig* encoder_config, |
+ test::FrameGeneratorCapturer** frame_generator) override { |
+ send_config->rtp.extensions.push_back( |
+ RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
+ } |
+ |
+ void UpdateReceiveConfig( |
+ size_t stream_index, |
+ VideoReceiveStream::Config* receive_config) override { |
+ receive_config->rtp.extensions.push_back( |
+ RtpExtension(RtpExtension::kTransportSequenceNumber, kExtensionId)); |
+ } |
+ |
+ virtual test::DirectTransport* CreateReceiveTransport() { |
+ return new TransportFeedbackObserver(&done_); |
+ } |
+ |
+ private: |
+ rtc::Event done_; |
+ } tester; |
+ tester.RunTest(); |
+} |
TEST_F(EndToEndTest, ObserversEncodedFrames) { |
class EncodedFrameTestObserver : public EncodedFrameObserver { |
public: |