blob: aa6fc490f06e612cced8cf70dadfc4c2a7ceba36 [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
Artem Titov46c4e602018-08-17 14:26:54 +020017#include "api/test/simulated_network.h"
18#include "call/simulated_packet_receiver.h"
Yves Gerey665174f2018-06-19 15:03:05 +020019#include "call/video_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/rtp_rtcp/include/rtp_header_parser.h"
21#include "rtc_base/criticalsection.h"
22#include "rtc_base/event.h"
23#include "system_wrappers/include/field_trial.h"
24#include "test/constants.h"
25#include "test/direct_transport.h"
26#include "test/gtest.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;
eladalon413ee9a2017-08-22 04:02:52 -070036class SingleThreadedTaskQueueForTesting;
stefanf116bd02015-10-27 08:29:42 -070037
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000038class RtpRtcpObserver {
39 public:
stefanf116bd02015-10-27 08:29:42 -070040 enum Action {
41 SEND_PACKET,
42 DROP_PACKET,
43 };
44
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000045 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000046
ilnik5328b9e2017-02-21 05:20:28 -080047 virtual bool Wait() {
sprangc1b57a12017-02-28 08:50:47 -080048 if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
ilnik5328b9e2017-02-21 05:20:28 -080049 observation_complete_.Wait(kShortTimeoutMs);
50 return true;
51 }
52 return observation_complete_.Wait(timeout_ms_);
53 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000054
stefanf116bd02015-10-27 08:29:42 -070055 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
56 return SEND_PACKET;
57 }
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000058
stefanf116bd02015-10-27 08:29:42 -070059 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 03:24:27 -070072 RtpRtcpObserver() : RtpRtcpObserver(0) {}
Peter Boström5811a392015-12-10 13:02:50 +010073 explicit RtpRtcpObserver(int event_timeout_ms)
74 : observation_complete_(false, false),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000075 parser_(RtpHeaderParser::Create()),
Stefan Holmer12952972015-10-29 15:13:24 +010076 timeout_ms_(event_timeout_ms) {
77 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
78 kTOffsetExtensionId);
79 parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
80 kAbsSendTimeExtensionId);
81 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
82 kTransportSequenceNumberExtensionId);
83 }
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000084
Peter Boström5811a392015-12-10 13:02:50 +010085 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 14:53:46 -070086 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000087
88 private:
Peter Boström5811a392015-12-10 13:02:50 +010089 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000090};
stefanf116bd02015-10-27 08:29:42 -070091
92class PacketTransport : public test::DirectTransport {
93 public:
94 enum TransportType { kReceiver, kSender };
95
eladalon413ee9a2017-08-22 04:02:52 -070096 PacketTransport(SingleThreadedTaskQueueForTesting* task_queue,
97 Call* send_call,
stefanf116bd02015-10-27 08:29:42 -070098 RtpRtcpObserver* observer,
99 TransportType transport_type,
minyue20c84cc2017-04-10 16:57:57 -0700100 const std::map<uint8_t, MediaType>& payload_type_map,
Artem Titov46c4e602018-08-17 14:26:54 +0200101 const DefaultNetworkSimulationConfig& configuration)
eladalon413ee9a2017-08-22 04:02:52 -0700102 : test::DirectTransport(task_queue,
103 configuration,
104 send_call,
105 payload_type_map),
stefanf116bd02015-10-27 08:29:42 -0700106 observer_(observer),
107 transport_type_(transport_type) {}
108
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200109 PacketTransport(SingleThreadedTaskQueueForTesting* task_queue,
Sebastian Jansson09408112018-04-24 14:41:22 +0200110 Call* send_call,
111 RtpRtcpObserver* observer,
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200112 TransportType transport_type,
Sebastian Jansson09408112018-04-24 14:41:22 +0200113 const std::map<uint8_t, MediaType>& payload_type_map,
Artem Titov46c4e602018-08-17 14:26:54 +0200114 std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe)
Sebastian Jansson09408112018-04-24 14:41:22 +0200115 : test::DirectTransport(task_queue,
116 std::move(nw_pipe),
117 send_call,
118 payload_type_map),
Christoffer Rodbrod2817d82017-10-24 16:26:49 +0200119 observer_(observer),
120 transport_type_(transport_type) {}
121
stefanf116bd02015-10-27 08:29:42 -0700122 private:
123 bool SendRtp(const uint8_t* packet,
124 size_t length,
125 const PacketOptions& options) override {
126 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
127 RtpRtcpObserver::Action action;
128 {
129 if (transport_type_ == kSender) {
130 action = observer_->OnSendRtp(packet, length);
131 } else {
132 action = observer_->OnReceiveRtp(packet, length);
133 }
134 }
135 switch (action) {
136 case RtpRtcpObserver::DROP_PACKET:
137 // Drop packet silently.
138 return true;
139 case RtpRtcpObserver::SEND_PACKET:
140 return test::DirectTransport::SendRtp(packet, length, options);
141 }
142 return true; // Will never happen, makes compiler happy.
143 }
144
145 bool SendRtcp(const uint8_t* packet, size_t length) override {
146 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
147 RtpRtcpObserver::Action action;
148 {
149 if (transport_type_ == kSender) {
150 action = observer_->OnSendRtcp(packet, length);
151 } else {
152 action = observer_->OnReceiveRtcp(packet, length);
153 }
154 }
155 switch (action) {
156 case RtpRtcpObserver::DROP_PACKET:
157 // Drop packet silently.
158 return true;
159 case RtpRtcpObserver::SEND_PACKET:
160 return test::DirectTransport::SendRtcp(packet, length);
161 }
162 return true; // Will never happen, makes compiler happy.
163 }
164
165 RtpRtcpObserver* const observer_;
166 TransportType transport_type_;
167};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000168} // namespace test
169} // namespace webrtc
170
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200171#endif // TEST_RTP_RTCP_OBSERVER_H_