aboutsummaryrefslogtreecommitdiff
path: root/webrtc/test/rtp_rtcp_observer.h
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/test/rtp_rtcp_observer.h')
-rw-r--r--webrtc/test/rtp_rtcp_observer.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/webrtc/test/rtp_rtcp_observer.h b/webrtc/test/rtp_rtcp_observer.h
new file mode 100644
index 0000000000..89b6dd06bd
--- /dev/null
+++ b/webrtc/test/rtp_rtcp_observer.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2013 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 WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
+#define WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
+
+#include <map>
+#include <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "webrtc/base/criticalsection.h"
+#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
+#include "webrtc/test/constants.h"
+#include "webrtc/test/direct_transport.h"
+#include "webrtc/typedefs.h"
+#include "webrtc/video_send_stream.h"
+
+namespace webrtc {
+namespace test {
+
+class PacketTransport;
+
+class RtpRtcpObserver {
+ public:
+ enum Action {
+ SEND_PACKET,
+ DROP_PACKET,
+ };
+
+ virtual ~RtpRtcpObserver() {}
+
+ virtual EventTypeWrapper Wait() {
+ EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
+ return result;
+ }
+
+ virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ protected:
+ explicit RtpRtcpObserver(unsigned int event_timeout_ms)
+ : observation_complete_(EventWrapper::Create()),
+ parser_(RtpHeaderParser::Create()),
+ timeout_ms_(event_timeout_ms) {
+ parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
+ kTOffsetExtensionId);
+ parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
+ kAbsSendTimeExtensionId);
+ parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
+ kTransportSequenceNumberExtensionId);
+ }
+
+ const rtc::scoped_ptr<EventWrapper> observation_complete_;
+ const rtc::scoped_ptr<RtpHeaderParser> parser_;
+
+ private:
+ unsigned int timeout_ms_;
+};
+
+class PacketTransport : public test::DirectTransport {
+ public:
+ enum TransportType { kReceiver, kSender };
+
+ PacketTransport(Call* send_call,
+ RtpRtcpObserver* observer,
+ TransportType transport_type,
+ const FakeNetworkPipe::Config& configuration)
+ : test::DirectTransport(configuration, send_call),
+ observer_(observer),
+ transport_type_(transport_type) {}
+
+ private:
+ bool SendRtp(const uint8_t* packet,
+ size_t length,
+ const PacketOptions& options) override {
+ EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
+ RtpRtcpObserver::Action action;
+ {
+ if (transport_type_ == kSender) {
+ action = observer_->OnSendRtp(packet, length);
+ } else {
+ action = observer_->OnReceiveRtp(packet, length);
+ }
+ }
+ switch (action) {
+ case RtpRtcpObserver::DROP_PACKET:
+ // Drop packet silently.
+ return true;
+ case RtpRtcpObserver::SEND_PACKET:
+ return test::DirectTransport::SendRtp(packet, length, options);
+ }
+ return true; // Will never happen, makes compiler happy.
+ }
+
+ bool SendRtcp(const uint8_t* packet, size_t length) override {
+ EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
+ RtpRtcpObserver::Action action;
+ {
+ if (transport_type_ == kSender) {
+ action = observer_->OnSendRtcp(packet, length);
+ } else {
+ action = observer_->OnReceiveRtcp(packet, length);
+ }
+ }
+ switch (action) {
+ case RtpRtcpObserver::DROP_PACKET:
+ // Drop packet silently.
+ return true;
+ case RtpRtcpObserver::SEND_PACKET:
+ return test::DirectTransport::SendRtcp(packet, length);
+ }
+ return true; // Will never happen, makes compiler happy.
+ }
+
+ RtpRtcpObserver* const observer_;
+ TransportType transport_type_;
+};
+} // namespace test
+} // namespace webrtc
+
+#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_