blob: 54db770729d32027be92076c6c996665522e8461 [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 */
Peter Boström7623ce42015-12-09 12:13:30 +010010#ifndef WEBRTC_TEST_RTP_RTCP_OBSERVER_H_
11#define WEBRTC_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
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010017#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/criticalsection.h"
19#include "webrtc/rtc_base/event.h"
ilnik5328b9e2017-02-21 05:20:28 -080020#include "webrtc/system_wrappers/include/field_trial.h"
Stefan Holmer12952972015-10-29 15:13:24 +010021#include "webrtc/test/constants.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000022#include "webrtc/test/direct_transport.h"
kwibergac9f8762016-09-30 22:29:43 -070023#include "webrtc/test/gtest.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000024#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000025#include "webrtc/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;
35
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000036class RtpRtcpObserver {
37 public:
stefanf116bd02015-10-27 08:29:42 -070038 enum Action {
39 SEND_PACKET,
40 DROP_PACKET,
41 };
42
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000043 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000044
ilnik5328b9e2017-02-21 05:20:28 -080045 virtual bool Wait() {
sprangc1b57a12017-02-28 08:50:47 -080046 if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
ilnik5328b9e2017-02-21 05:20:28 -080047 observation_complete_.Wait(kShortTimeoutMs);
48 return true;
49 }
50 return observation_complete_.Wait(timeout_ms_);
51 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000052
stefanf116bd02015-10-27 08:29:42 -070053 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
54 return SEND_PACKET;
55 }
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000056
stefanf116bd02015-10-27 08:29:42 -070057 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
58 return SEND_PACKET;
59 }
60
61 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
62 return SEND_PACKET;
63 }
64
65 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
66 return SEND_PACKET;
67 }
68
69 protected:
philipele828c962017-03-21 03:24:27 -070070 RtpRtcpObserver() : RtpRtcpObserver(0) {}
Peter Boström5811a392015-12-10 13:02:50 +010071 explicit RtpRtcpObserver(int event_timeout_ms)
72 : observation_complete_(false, false),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000073 parser_(RtpHeaderParser::Create()),
Stefan Holmer12952972015-10-29 15:13:24 +010074 timeout_ms_(event_timeout_ms) {
75 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
76 kTOffsetExtensionId);
77 parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
78 kAbsSendTimeExtensionId);
79 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
80 kTransportSequenceNumberExtensionId);
81 }
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000082
Peter Boström5811a392015-12-10 13:02:50 +010083 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 14:53:46 -070084 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000085
86 private:
Peter Boström5811a392015-12-10 13:02:50 +010087 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000088};
stefanf116bd02015-10-27 08:29:42 -070089
90class PacketTransport : public test::DirectTransport {
91 public:
92 enum TransportType { kReceiver, kSender };
93
94 PacketTransport(Call* send_call,
95 RtpRtcpObserver* observer,
96 TransportType transport_type,
minyue20c84cc2017-04-10 16:57:57 -070097 const std::map<uint8_t, MediaType>& payload_type_map,
stefanf116bd02015-10-27 08:29:42 -070098 const FakeNetworkPipe::Config& configuration)
minyue20c84cc2017-04-10 16:57:57 -070099 : test::DirectTransport(configuration, send_call, payload_type_map),
stefanf116bd02015-10-27 08:29:42 -0700100 observer_(observer),
101 transport_type_(transport_type) {}
102
103 private:
104 bool SendRtp(const uint8_t* packet,
105 size_t length,
106 const PacketOptions& options) override {
107 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
108 RtpRtcpObserver::Action action;
109 {
110 if (transport_type_ == kSender) {
111 action = observer_->OnSendRtp(packet, length);
112 } else {
113 action = observer_->OnReceiveRtp(packet, length);
114 }
115 }
116 switch (action) {
117 case RtpRtcpObserver::DROP_PACKET:
118 // Drop packet silently.
119 return true;
120 case RtpRtcpObserver::SEND_PACKET:
121 return test::DirectTransport::SendRtp(packet, length, options);
122 }
123 return true; // Will never happen, makes compiler happy.
124 }
125
126 bool SendRtcp(const uint8_t* packet, size_t length) override {
127 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
128 RtpRtcpObserver::Action action;
129 {
130 if (transport_type_ == kSender) {
131 action = observer_->OnSendRtcp(packet, length);
132 } else {
133 action = observer_->OnReceiveRtcp(packet, length);
134 }
135 }
136 switch (action) {
137 case RtpRtcpObserver::DROP_PACKET:
138 // Drop packet silently.
139 return true;
140 case RtpRtcpObserver::SEND_PACKET:
141 return test::DirectTransport::SendRtcp(packet, length);
142 }
143 return true; // Will never happen, makes compiler happy.
144 }
145
146 RtpRtcpObserver* const observer_;
147 TransportType transport_type_;
148};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000149} // namespace test
150} // namespace webrtc
151
Peter Boström7623ce42015-12-09 12:13:30 +0100152#endif // WEBRTC_TEST_RTP_RTCP_OBSERVER_H_