blob: 5163d2248eed8f37ad29c86094e2ded51c68244f [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>
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000015#include <vector>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/rtp_rtcp/include/rtp_header_parser.h"
18#include "rtc_base/criticalsection.h"
19#include "rtc_base/event.h"
20#include "system_wrappers/include/field_trial.h"
21#include "test/constants.h"
22#include "test/direct_transport.h"
23#include "test/gtest.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020024#include "typedefs.h" // NOLINT(build/include)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "call/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000026
ilnik5328b9e2017-02-21 05:20:28 -080027namespace {
28const int kShortTimeoutMs = 500;
29}
30
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000031namespace webrtc {
32namespace test {
33
stefanf116bd02015-10-27 08:29:42 -070034class PacketTransport;
eladalon413ee9a2017-08-22 04:02:52 -070035class SingleThreadedTaskQueueForTesting;
stefanf116bd02015-10-27 08:29:42 -070036
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)
73 : observation_complete_(false, false),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000074 parser_(RtpHeaderParser::Create()),
Stefan Holmer12952972015-10-29 15:13:24 +010075 timeout_ms_(event_timeout_ms) {
76 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
77 kTOffsetExtensionId);
78 parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
79 kAbsSendTimeExtensionId);
80 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
81 kTransportSequenceNumberExtensionId);
82 }
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000083
Peter Boström5811a392015-12-10 13:02:50 +010084 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 14:53:46 -070085 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000086
87 private:
Peter Boström5811a392015-12-10 13:02:50 +010088 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000089};
stefanf116bd02015-10-27 08:29:42 -070090
91class PacketTransport : public test::DirectTransport {
92 public:
93 enum TransportType { kReceiver, kSender };
94
eladalon413ee9a2017-08-22 04:02:52 -070095 PacketTransport(SingleThreadedTaskQueueForTesting* task_queue,
96 Call* send_call,
stefanf116bd02015-10-27 08:29:42 -070097 RtpRtcpObserver* observer,
98 TransportType transport_type,
minyue20c84cc2017-04-10 16:57:57 -070099 const std::map<uint8_t, MediaType>& payload_type_map,
stefanf116bd02015-10-27 08:29:42 -0700100 const FakeNetworkPipe::Config& configuration)
eladalon413ee9a2017-08-22 04:02:52 -0700101 : test::DirectTransport(task_queue,
102 configuration,
103 send_call,
104 payload_type_map),
stefanf116bd02015-10-27 08:29:42 -0700105 observer_(observer),
106 transport_type_(transport_type) {}
107
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200108 PacketTransport(SingleThreadedTaskQueueForTesting* task_queue,
109 Call* send_call, RtpRtcpObserver* observer,
110 TransportType transport_type,
111 std::unique_ptr<FakeNetworkPipe> nw_pipe)
112 : test::DirectTransport(task_queue, std::move(nw_pipe), send_call),
113 observer_(observer),
114 transport_type_(transport_type) {}
115
stefanf116bd02015-10-27 08:29:42 -0700116 private:
117 bool SendRtp(const uint8_t* packet,
118 size_t length,
119 const PacketOptions& options) override {
120 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
121 RtpRtcpObserver::Action action;
122 {
123 if (transport_type_ == kSender) {
124 action = observer_->OnSendRtp(packet, length);
125 } else {
126 action = observer_->OnReceiveRtp(packet, length);
127 }
128 }
129 switch (action) {
130 case RtpRtcpObserver::DROP_PACKET:
131 // Drop packet silently.
132 return true;
133 case RtpRtcpObserver::SEND_PACKET:
134 return test::DirectTransport::SendRtp(packet, length, options);
135 }
136 return true; // Will never happen, makes compiler happy.
137 }
138
139 bool SendRtcp(const uint8_t* packet, size_t length) override {
140 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
141 RtpRtcpObserver::Action action;
142 {
143 if (transport_type_ == kSender) {
144 action = observer_->OnSendRtcp(packet, length);
145 } else {
146 action = observer_->OnReceiveRtcp(packet, length);
147 }
148 }
149 switch (action) {
150 case RtpRtcpObserver::DROP_PACKET:
151 // Drop packet silently.
152 return true;
153 case RtpRtcpObserver::SEND_PACKET:
154 return test::DirectTransport::SendRtcp(packet, length);
155 }
156 return true; // Will never happen, makes compiler happy.
157 }
158
159 RtpRtcpObserver* const observer_;
160 TransportType transport_type_;
161};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000162} // namespace test
163} // namespace webrtc
164
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200165#endif // TEST_RTP_RTCP_OBSERVER_H_