blob: 8e1375f20fb06ccc6c509c149c24d7a211a21818 [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
Peter Boströmf2f82832015-05-01 13:00:41 +020017#include "webrtc/base/criticalsection.h"
Peter Boström5811a392015-12-10 13:02:50 +010018#include "webrtc/base/event.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010019#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.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,
97 const FakeNetworkPipe::Config& configuration)
98 : test::DirectTransport(configuration, send_call),
99 observer_(observer),
100 transport_type_(transport_type) {}
101
102 private:
103 bool SendRtp(const uint8_t* packet,
104 size_t length,
105 const PacketOptions& options) override {
106 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
107 RtpRtcpObserver::Action action;
108 {
109 if (transport_type_ == kSender) {
110 action = observer_->OnSendRtp(packet, length);
111 } else {
112 action = observer_->OnReceiveRtp(packet, length);
113 }
114 }
115 switch (action) {
116 case RtpRtcpObserver::DROP_PACKET:
117 // Drop packet silently.
118 return true;
119 case RtpRtcpObserver::SEND_PACKET:
120 return test::DirectTransport::SendRtp(packet, length, options);
121 }
122 return true; // Will never happen, makes compiler happy.
123 }
124
125 bool SendRtcp(const uint8_t* packet, size_t length) override {
126 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
127 RtpRtcpObserver::Action action;
128 {
129 if (transport_type_ == kSender) {
130 action = observer_->OnSendRtcp(packet, length);
131 } else {
132 action = observer_->OnReceiveRtcp(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::SendRtcp(packet, length);
141 }
142 return true; // Will never happen, makes compiler happy.
143 }
144
145 RtpRtcpObserver* const observer_;
146 TransportType transport_type_;
147};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000148} // namespace test
149} // namespace webrtc
150
Peter Boström7623ce42015-12-09 12:13:30 +0100151#endif // WEBRTC_TEST_RTP_RTCP_OBSERVER_H_