blob: b6b521d6b6650a0f431329577d5ce7faf03aff84 [file] [log] [blame]
pbos@webrtc.orge7f056e2013-08-19 16:09:341/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Mirko Bonadei92ea95e2017-09-15 04:47:3110#ifndef TEST_RTP_RTCP_OBSERVER_H_
11#define TEST_RTP_RTCP_OBSERVER_H_
pbos@webrtc.orge7f056e2013-08-19 16:09:3412
13#include <map>
kwibergbfefb032016-05-01 21:53:4614#include <memory>
Elad Alond8d32482019-02-18 22:45:5715#include <utility>
pbos@webrtc.orge7f056e2013-08-19 16:09:3416#include <vector>
17
Artem Titov46c4e602018-08-17 12:26:5418#include "api/test/simulated_network.h"
19#include "call/simulated_packet_receiver.h"
Yves Gerey665174f2018-06-19 13:03:0520#include "call/video_send_stream.h"
Steve Anton10542f22019-01-11 17:11:0021#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/event.h"
23#include "system_wrappers/include/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "test/direct_transport.h"
25#include "test/gtest.h"
Tommi25eb47c2019-08-29 14:39:0526#include "test/rtp_header_parser.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:3427
ilnik5328b9e2017-02-21 13:20:2828namespace {
29const int kShortTimeoutMs = 500;
30}
31
pbos@webrtc.orge7f056e2013-08-19 16:09:3432namespace webrtc {
33namespace test {
34
stefanf116bd02015-10-27 15:29:4235class PacketTransport;
Yves Gerey6516f762019-08-29 09:50:2336class DEPRECATED_SingleThreadedTaskQueueForTesting;
stefanf116bd02015-10-27 15:29:4237
pbos@webrtc.orge7f056e2013-08-19 16:09:3438class RtpRtcpObserver {
39 public:
stefanf116bd02015-10-27 15:29:4240 enum Action {
41 SEND_PACKET,
42 DROP_PACKET,
43 };
44
pbos@webrtc.orgb3cc78d2013-11-21 11:42:0245 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:3446
ilnik5328b9e2017-02-21 13:20:2847 virtual bool Wait() {
sprangc1b57a12017-02-28 16:50:4748 if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
ilnik5328b9e2017-02-21 13:20:2849 observation_complete_.Wait(kShortTimeoutMs);
50 return true;
51 }
52 return observation_complete_.Wait(timeout_ms_);
53 }
pbos@webrtc.org6917e192013-09-19 14:22:1254
stefanf116bd02015-10-27 15:29:4255 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
56 return SEND_PACKET;
57 }
stefan@webrtc.orgb082ade2013-11-18 11:45:1158
stefanf116bd02015-10-27 15:29:4259 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
60 return SEND_PACKET;
61 }
62
63 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
64 return SEND_PACKET;
65 }
66
67 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
68 return SEND_PACKET;
69 }
70
71 protected:
philipele828c962017-03-21 10:24:2772 RtpRtcpObserver() : RtpRtcpObserver(0) {}
Peter Boström5811a392015-12-10 12:02:5073 explicit RtpRtcpObserver(int event_timeout_ms)
Tommi25eb47c2019-08-29 14:39:0574 : parser_(RtpHeaderParser::CreateForTest()),
75 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:3476
Peter Boström5811a392015-12-10 12:02:5077 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 21:53:4678 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:3479
80 private:
Peter Boström5811a392015-12-10 12:02:5081 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:3482};
stefanf116bd02015-10-27 15:29:4283
84class PacketTransport : public test::DirectTransport {
85 public:
86 enum TransportType { kReceiver, kSender };
87
Danil Chapovalov44db4362019-09-30 02:16:2888 PacketTransport(TaskQueueBase* task_queue,
Sebastian Jansson09408112018-04-24 12:41:2289 Call* send_call,
90 RtpRtcpObserver* observer,
Christoffer Rodbrod2817d82017-10-24 14:26:4991 TransportType transport_type,
Sebastian Jansson09408112018-04-24 12:41:2292 const std::map<uint8_t, MediaType>& payload_type_map,
Artem Titov46c4e602018-08-17 12:26:5493 std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe)
Sebastian Jansson09408112018-04-24 12:41:2294 : test::DirectTransport(task_queue,
95 std::move(nw_pipe),
96 send_call,
97 payload_type_map),
Christoffer Rodbrod2817d82017-10-24 14:26:4998 observer_(observer),
99 transport_type_(transport_type) {}
100
stefanf116bd02015-10-27 15:29:42101 private:
102 bool SendRtp(const uint8_t* packet,
103 size_t length,
104 const PacketOptions& options) override {
105 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
106 RtpRtcpObserver::Action action;
107 {
108 if (transport_type_ == kSender) {
109 action = observer_->OnSendRtp(packet, length);
110 } else {
111 action = observer_->OnReceiveRtp(packet, length);
112 }
113 }
114 switch (action) {
115 case RtpRtcpObserver::DROP_PACKET:
116 // Drop packet silently.
117 return true;
118 case RtpRtcpObserver::SEND_PACKET:
119 return test::DirectTransport::SendRtp(packet, length, options);
120 }
121 return true; // Will never happen, makes compiler happy.
122 }
123
124 bool SendRtcp(const uint8_t* packet, size_t length) override {
125 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
126 RtpRtcpObserver::Action action;
127 {
128 if (transport_type_ == kSender) {
129 action = observer_->OnSendRtcp(packet, length);
130 } else {
131 action = observer_->OnReceiveRtcp(packet, length);
132 }
133 }
134 switch (action) {
135 case RtpRtcpObserver::DROP_PACKET:
136 // Drop packet silently.
137 return true;
138 case RtpRtcpObserver::SEND_PACKET:
139 return test::DirectTransport::SendRtcp(packet, length);
140 }
141 return true; // Will never happen, makes compiler happy.
142 }
143
144 RtpRtcpObserver* const observer_;
145 TransportType transport_type_;
146};
pbos@webrtc.orge7f056e2013-08-19 16:09:34147} // namespace test
148} // namespace webrtc
149
Mirko Bonadei92ea95e2017-09-15 04:47:31150#endif // TEST_RTP_RTCP_OBSERVER_H_