blob: 5eb88d3f0d33ecb7178d165e816ce03c35d2b90c [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>
14#include <vector>
15
pbos@webrtc.orgc279a5d2014-01-24 09:30:53 +000016#include "testing/gtest/include/gtest/gtest.h"
17
Peter Boströmf2f82832015-05-01 13:00:41 +020018#include "webrtc/base/criticalsection.h"
Peter Boström5811a392015-12-10 13:02:50 +010019#include "webrtc/base/event.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010020#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.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"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000023#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000024#include "webrtc/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000025
26namespace webrtc {
27namespace test {
28
stefanf116bd02015-10-27 08:29:42 -070029class PacketTransport;
30
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000031class RtpRtcpObserver {
32 public:
stefanf116bd02015-10-27 08:29:42 -070033 enum Action {
34 SEND_PACKET,
35 DROP_PACKET,
36 };
37
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000038 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000039
Peter Boström5811a392015-12-10 13:02:50 +010040 virtual bool Wait() { return observation_complete_.Wait(timeout_ms_); }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000041
stefanf116bd02015-10-27 08:29:42 -070042 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
43 return SEND_PACKET;
44 }
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000045
stefanf116bd02015-10-27 08:29:42 -070046 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
47 return SEND_PACKET;
48 }
49
50 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
51 return SEND_PACKET;
52 }
53
54 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
55 return SEND_PACKET;
56 }
57
58 protected:
Peter Boström5811a392015-12-10 13:02:50 +010059 explicit RtpRtcpObserver(int event_timeout_ms)
60 : observation_complete_(false, false),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000061 parser_(RtpHeaderParser::Create()),
Stefan Holmer12952972015-10-29 15:13:24 +010062 timeout_ms_(event_timeout_ms) {
63 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
64 kTOffsetExtensionId);
65 parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
66 kAbsSendTimeExtensionId);
67 parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
68 kTransportSequenceNumberExtensionId);
69 }
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000070
Peter Boström5811a392015-12-10 13:02:50 +010071 rtc::Event observation_complete_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000072 const rtc::scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000073
74 private:
Peter Boström5811a392015-12-10 13:02:50 +010075 const int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000076};
stefanf116bd02015-10-27 08:29:42 -070077
78class PacketTransport : public test::DirectTransport {
79 public:
80 enum TransportType { kReceiver, kSender };
81
82 PacketTransport(Call* send_call,
83 RtpRtcpObserver* observer,
84 TransportType transport_type,
85 const FakeNetworkPipe::Config& configuration)
86 : test::DirectTransport(configuration, send_call),
87 observer_(observer),
88 transport_type_(transport_type) {}
89
90 private:
91 bool SendRtp(const uint8_t* packet,
92 size_t length,
93 const PacketOptions& options) override {
94 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
95 RtpRtcpObserver::Action action;
96 {
97 if (transport_type_ == kSender) {
98 action = observer_->OnSendRtp(packet, length);
99 } else {
100 action = observer_->OnReceiveRtp(packet, length);
101 }
102 }
103 switch (action) {
104 case RtpRtcpObserver::DROP_PACKET:
105 // Drop packet silently.
106 return true;
107 case RtpRtcpObserver::SEND_PACKET:
108 return test::DirectTransport::SendRtp(packet, length, options);
109 }
110 return true; // Will never happen, makes compiler happy.
111 }
112
113 bool SendRtcp(const uint8_t* packet, size_t length) override {
114 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
115 RtpRtcpObserver::Action action;
116 {
117 if (transport_type_ == kSender) {
118 action = observer_->OnSendRtcp(packet, length);
119 } else {
120 action = observer_->OnReceiveRtcp(packet, length);
121 }
122 }
123 switch (action) {
124 case RtpRtcpObserver::DROP_PACKET:
125 // Drop packet silently.
126 return true;
127 case RtpRtcpObserver::SEND_PACKET:
128 return test::DirectTransport::SendRtcp(packet, length);
129 }
130 return true; // Will never happen, makes compiler happy.
131 }
132
133 RtpRtcpObserver* const observer_;
134 TransportType transport_type_;
135};
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000136} // namespace test
137} // namespace webrtc
138
Peter Boström7623ce42015-12-09 12:13:30 +0100139#endif // WEBRTC_TEST_RTP_RTCP_OBSERVER_H_