summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/test/rtp_rtcp_observer.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/test/rtp_rtcp_observer.h')
-rw-r--r--third_party/libwebrtc/test/rtp_rtcp_observer.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/third_party/libwebrtc/test/rtp_rtcp_observer.h b/third_party/libwebrtc/test/rtp_rtcp_observer.h
new file mode 100644
index 0000000000..06a438e712
--- /dev/null
+++ b/third_party/libwebrtc/test/rtp_rtcp_observer.h
@@ -0,0 +1,151 @@
+/*
+ * 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 TEST_RTP_RTCP_OBSERVER_H_
+#define TEST_RTP_RTCP_OBSERVER_H_
+
+#include <map>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "api/array_view.h"
+#include "api/test/simulated_network.h"
+#include "api/units/time_delta.h"
+#include "call/simulated_packet_receiver.h"
+#include "call/video_send_stream.h"
+#include "modules/rtp_rtcp/source/rtp_util.h"
+#include "rtc_base/event.h"
+#include "system_wrappers/include/field_trial.h"
+#include "test/direct_transport.h"
+#include "test/gtest.h"
+
+namespace {
+constexpr webrtc::TimeDelta kShortTimeout = webrtc::TimeDelta::Millis(500);
+}
+
+namespace webrtc {
+namespace test {
+
+class PacketTransport;
+
+class RtpRtcpObserver {
+ public:
+ enum Action {
+ SEND_PACKET,
+ DROP_PACKET,
+ };
+
+ virtual ~RtpRtcpObserver() {}
+
+ virtual bool Wait() {
+ if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
+ observation_complete_.Wait(kShortTimeout);
+ return true;
+ }
+ return observation_complete_.Wait(timeout_);
+ }
+
+ 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:
+ RtpRtcpObserver() : RtpRtcpObserver(TimeDelta::Zero()) {}
+ explicit RtpRtcpObserver(TimeDelta event_timeout) : timeout_(event_timeout) {}
+
+ rtc::Event observation_complete_;
+
+ private:
+ const TimeDelta timeout_;
+};
+
+class PacketTransport : public test::DirectTransport {
+ public:
+ enum TransportType { kReceiver, kSender };
+
+ PacketTransport(TaskQueueBase* task_queue,
+ Call* send_call,
+ RtpRtcpObserver* observer,
+ TransportType transport_type,
+ const std::map<uint8_t, MediaType>& payload_type_map,
+ std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe,
+ rtc::ArrayView<const RtpExtension> audio_extensions,
+ rtc::ArrayView<const RtpExtension> video_extensions)
+ : test::DirectTransport(task_queue,
+ std::move(nw_pipe),
+ send_call,
+ payload_type_map,
+ audio_extensions,
+ video_extensions),
+ observer_(observer),
+ transport_type_(transport_type) {}
+
+ private:
+ bool SendRtp(const uint8_t* packet,
+ size_t length,
+ const PacketOptions& options) override {
+ EXPECT_TRUE(IsRtpPacket(rtc::MakeArrayView(packet, length)));
+ RtpRtcpObserver::Action action = RtpRtcpObserver::SEND_PACKET;
+ if (observer_) {
+ 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(IsRtcpPacket(rtc::MakeArrayView(packet, length)));
+ RtpRtcpObserver::Action action = RtpRtcpObserver::SEND_PACKET;
+ if (observer_) {
+ 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 // TEST_RTP_RTCP_OBSERVER_H_