blob: 6996a69e48307d69359395867647e30367ce03d8 [file] [log] [blame]
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +00001/*
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 06:47:31 +020010#ifndef TEST_RTP_RTCP_OBSERVER_H_
11#define TEST_RTP_RTCP_OBSERVER_H_
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000012
13#include <map>
kwibergbfefb032016-05-01 14:53:46 -070014#include <memory>
Elad Alond8d32482019-02-18 23:45:57 +010015#include <utility>
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000016#include <vector>
17
Artem Titov46c4e602018-08-17 14:26:54 +020018#include "api/test/simulated_network.h"
19#include "call/simulated_packet_receiver.h"
Yves Gerey665174f2018-06-19 15:03:05 +020020#include "call/video_send_stream.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/event.h"
23#include "system_wrappers/include/field_trial.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/direct_transport.h"
25#include "test/gtest.h"
Tommi25eb47c2019-08-29 16:39:05 +020026#include "test/rtp_header_parser.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000027
ilnik5328b9e2017-02-21 05:20:28 -080028namespace {
29const int kShortTimeoutMs = 500;
30}
31
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000032namespace webrtc {
33namespace test {
34
stefanf116bd02015-10-27 08:29:42 -070035class PacketTransport;
36
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000037class RtpRtcpObserver {
38 public:
stefanf116bd02015-10-27 08:29:42 -070039 enum Action {
40 SEND_PACKET,
41 DROP_PACKET,
42 };
43
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000044 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000045
ilnik5328b9e2017-02-21 05:20:28 -080046 virtual bool Wait() {
sprangc1b57a12017-02-28 08:50:47 -080047 if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
ilnik5328b9e2017-02-21 05:20:28 -080048 observation_complete_.Wait(kShortTimeoutMs);
49 return true;
50 }
51 return observation_complete_.Wait(timeout_ms_);
52 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000053
stefanf116bd02015-10-27 08:29:42 -070054 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
55 return SEND_PACKET;
56 }
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000057
stefanf116bd02015-10-27 08:29:42 -070058 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
59 return SEND_PACKET;
60 }
61
62 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
63 return SEND_PACKET;
64 }
65
66 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
67 return SEND_PACKET;
68 }
69
70 protected:
philipele828c962017-03-21 03:24:27 -070071 RtpRtcpObserver() : RtpRtcpObserver(0) {}
Peter Boström5811a392015-12-10 13:02:50 +010072 explicit RtpRtcpObserver(int event_timeout_ms)
Tommi25eb47c2019-08-29 16:39:05 +020073 : parser_(RtpHeaderParser::CreateForTest()),
74 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000075
Peter Boström5811a392015-12-10 13:02:50 +010076 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 14:53:46 -070077 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000078
79 private:
Peter Boström5811a392015-12-10 13:02:50 +010080 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000081};
stefanf116bd02015-10-27 08:29:42 -070082
83class PacketTransport : public test::DirectTransport {
84 public:
85 enum TransportType { kReceiver, kSender };
86
Danil Chapovalov44db4362019-09-30 04:16:28 +020087 PacketTransport(TaskQueueBase* task_queue,
Sebastian Jansson09408112018-04-24 14:41:22 +020088 Call* send_call,
89 RtpRtcpObserver* observer,
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020090 TransportType transport_type,
Sebastian Jansson09408112018-04-24 14:41:22 +020091 const std::map<uint8_t, MediaType>& payload_type_map,
Artem Titov46c4e602018-08-17 14:26:54 +020092 std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe)
Sebastian Jansson09408112018-04-24 14:41:22 +020093 : test::DirectTransport(task_queue,
94 std::move(nw_pipe),
95 send_call,
96 payload_type_map),
Christoffer Rodbrod2817d82017-10-24 16:26:49 +020097 observer_(observer),
98 transport_type_(transport_type) {}
99
stefanf116bd02015-10-27 08:29:42 -0700100 private:
101 bool SendRtp(const uint8_t* packet,
102 size_t length,
103 const PacketOptions& options) override {
104 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
105 RtpRtcpObserver::Action action;
106 {
107 if (transport_type_ == kSender) {
108 action = observer_->OnSendRtp(packet, length);
109 } else {
110 action = observer_->OnReceiveRtp(packet, length);
111 }
112 }
113 switch (action) {
114 case RtpRtcpObserver::DROP_PACKET:
115 // Drop packet silently.
116 return true;
117 case RtpRtcpObserver::SEND_PACKET:
118 return test::DirectTransport::SendRtp(packet, length, options);
119 }
120 return true; // Will never happen, makes compiler happy.
121 }
122
123 bool SendRtcp(const uint8_t* packet, size_t length) override {
124 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
125 RtpRtcpObserver::Action action;
126 {
127 if (transport_type_ == kSender) {
128 action = observer_->OnSendRtcp(packet, length);
129 } else {
130 action = observer_->OnReceiveRtcp(packet, length);
131 }
132 }
133 switch (action) {
134 case RtpRtcpObserver::DROP_PACKET:
135 // Drop packet silently.
136 return true;
137 case RtpRtcpObserver::SEND_PACKET:
138 return test::DirectTransport::SendRtcp(packet, length);
139 }
140 return true; // Will never happen, makes compiler happy.
141 }
142
143 RtpRtcpObserver* const observer_;
144 TransportType transport_type_;
145};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000146} // namespace test
147} // namespace webrtc
148
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200149#endif // TEST_RTP_RTCP_OBSERVER_H_