blob: f3c95a64cd02024c4605460b923b273b5d74ff14 [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:
Peter Boström5811a392015-12-10 13:02:50 +010070 explicit RtpRtcpObserver(int event_timeout_ms)
71 : observation_complete_(false, false),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000072 parser_(RtpHeaderParser::Create()),
Stefan Holmer12952972015-10-29 15:13:24 +010073 timeout_ms_(event_timeout_ms) {
74 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
75 kTOffsetExtensionId);
76 parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
77 kAbsSendTimeExtensionId);
78 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
79 kTransportSequenceNumberExtensionId);
80 }
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000081
Peter Boström5811a392015-12-10 13:02:50 +010082 rtc::Event observation_complete_;
kwibergbfefb032016-05-01 14:53:46 -070083 const std::unique_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000084
85 private:
Peter Boström5811a392015-12-10 13:02:50 +010086 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000087};
stefanf116bd02015-10-27 08:29:42 -070088
89class PacketTransport : public test::DirectTransport {
90 public:
91 enum TransportType { kReceiver, kSender };
92
93 PacketTransport(Call* send_call,
94 RtpRtcpObserver* observer,
95 TransportType transport_type,
96 const FakeNetworkPipe::Config& configuration)
97 : test::DirectTransport(configuration, send_call),
98 observer_(observer),
99 transport_type_(transport_type) {}
100
101 private:
102 bool SendRtp(const uint8_t* packet,
103 size_t length,
104 const PacketOptions& options) override {
105 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
106 RtpRtcpObserver::Action action;
107 {
108 if (transport_type_ == kSender) {
109 action = observer_->OnSendRtp(packet, length);
110 } else {
111 action = observer_->OnReceiveRtp(packet, length);
112 }
113 }
114 switch (action) {
115 case RtpRtcpObserver::DROP_PACKET:
116 // Drop packet silently.
117 return true;
118 case RtpRtcpObserver::SEND_PACKET:
119 return test::DirectTransport::SendRtp(packet, length, options);
120 }
121 return true; // Will never happen, makes compiler happy.
122 }
123
124 bool SendRtcp(const uint8_t* packet, size_t length) override {
125 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
126 RtpRtcpObserver::Action action;
127 {
128 if (transport_type_ == kSender) {
129 action = observer_->OnSendRtcp(packet, length);
130 } else {
131 action = observer_->OnReceiveRtcp(packet, length);
132 }
133 }
134 switch (action) {
135 case RtpRtcpObserver::DROP_PACKET:
136 // Drop packet silently.
137 return true;
138 case RtpRtcpObserver::SEND_PACKET:
139 return test::DirectTransport::SendRtcp(packet, length);
140 }
141 return true; // Will never happen, makes compiler happy.
142 }
143
144 RtpRtcpObserver* const observer_;
145 TransportType transport_type_;
146};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000147} // namespace test
148} // namespace webrtc
149
Peter Boström7623ce42015-12-09 12:13:30 +0100150#endif // WEBRTC_TEST_RTP_RTCP_OBSERVER_H_