blob: 97aa7b689e914335ffa22d95fd44e7b1cda9a802 [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 */
10#ifndef WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
11#define WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
12
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"
stefan@webrtc.org69969e22013-11-15 12:32:15 +000019#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000020#include "webrtc/test/direct_transport.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000021#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000022#include "webrtc/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000023
24namespace webrtc {
25namespace test {
26
27class RtpRtcpObserver {
28 public:
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000029 virtual ~RtpRtcpObserver() {}
pbos2d566682015-09-28 09:59:31 -070030 Transport* SendTransport() {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000031 return &send_transport_;
32 }
33
pbos2d566682015-09-28 09:59:31 -070034 Transport* ReceiveTransport() {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000035 return &receive_transport_;
36 }
37
pbos@webrtc.org3349ae02014-03-13 12:52:27 +000038 virtual void SetReceivers(PacketReceiver* send_transport_receiver,
39 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000040 send_transport_.SetReceiver(send_transport_receiver);
41 receive_transport_.SetReceiver(receive_transport_receiver);
42 }
43
44 void StopSending() {
45 send_transport_.StopSending();
46 receive_transport_.StopSending();
47 }
48
stefan@webrtc.org69969e22013-11-15 12:32:15 +000049 virtual EventTypeWrapper Wait() {
pbos@webrtc.org13d38a12013-11-28 11:59:31 +000050 EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
pbos@webrtc.org13d38a12013-11-28 11:59:31 +000051 return result;
stefan@webrtc.org69969e22013-11-15 12:32:15 +000052 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000053
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000054 protected:
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000055 RtpRtcpObserver(unsigned int event_timeout_ms,
Peter Boströmf2f82832015-05-01 13:00:41 +020056 const FakeNetworkPipe::Config& configuration)
57 : observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000058 parser_(RtpHeaderParser::Create()),
Peter Boströmf2f82832015-05-01 13:00:41 +020059 send_transport_(&crit_,
pbos@webrtc.org6917e192013-09-19 14:22:12 +000060 this,
61 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000062 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000063 configuration),
Peter Boströmf2f82832015-05-01 13:00:41 +020064 receive_transport_(&crit_,
pbos@webrtc.org6917e192013-09-19 14:22:12 +000065 this,
66 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000067 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000068 configuration),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000069 timeout_ms_(event_timeout_ms) {}
70
71 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
Peter Boströmf2f82832015-05-01 13:00:41 +020072 : observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000073 parser_(RtpHeaderParser::Create()),
Peter Boströmf2f82832015-05-01 13:00:41 +020074 send_transport_(&crit_,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000075 this,
76 &RtpRtcpObserver::OnSendRtp,
77 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000078 FakeNetworkPipe::Config()),
Peter Boströmf2f82832015-05-01 13:00:41 +020079 receive_transport_(&crit_,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000080 this,
81 &RtpRtcpObserver::OnReceiveRtp,
82 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000083 FakeNetworkPipe::Config()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000084 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000085
86 enum Action {
87 SEND_PACKET,
88 DROP_PACKET,
89 };
90
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000091 virtual Action OnSendRtp(const uint8_t* packet, size_t length)
92 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000093 return SEND_PACKET;
94 }
95
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000096 virtual Action OnSendRtcp(const uint8_t* packet, size_t length)
97 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000098 return SEND_PACKET;
99 }
100
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000101 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length)
102 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000103 return SEND_PACKET;
104 }
105
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000106 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length)
107 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000108 return SEND_PACKET;
109 }
110
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000111 private:
112 class PacketTransport : public test::DirectTransport {
113 public:
114 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
115 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000116
Peter Boströmf2f82832015-05-01 13:00:41 +0200117 PacketTransport(rtc::CriticalSection* lock,
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000118 RtpRtcpObserver* observer,
119 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000120 PacketTransportAction on_rtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000121 const FakeNetworkPipe::Config& configuration)
122 : test::DirectTransport(configuration),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000123 crit_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000124 observer_(observer),
125 on_rtp_(on_rtp),
126 on_rtcp_(on_rtcp) {}
127
128 private:
stefan1d8a5062015-10-02 03:39:33 -0700129 bool SendRtp(const uint8_t* packet,
130 size_t length,
131 const PacketOptions& options) override {
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000132 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000133 Action action;
134 {
Peter Boströmf2f82832015-05-01 13:00:41 +0200135 rtc::CritScope lock(crit_);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000136 action = (observer_->*on_rtp_)(packet, length);
137 }
138 switch (action) {
139 case DROP_PACKET:
140 // Drop packet silently.
141 return true;
142 case SEND_PACKET:
stefan1d8a5062015-10-02 03:39:33 -0700143 return test::DirectTransport::SendRtp(packet, length, options);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000144 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000145 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000146 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000147
kjellander@webrtc.org14665ff2015-03-04 12:58:35 +0000148 bool SendRtcp(const uint8_t* packet, size_t length) override {
pbos@webrtc.org62bafae2014-07-08 12:10:51 +0000149 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000150 Action action;
151 {
Peter Boströmf2f82832015-05-01 13:00:41 +0200152 rtc::CritScope lock(crit_);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000153 action = (observer_->*on_rtcp_)(packet, length);
154 }
155 switch (action) {
156 case DROP_PACKET:
157 // Drop packet silently.
158 return true;
159 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000160 return test::DirectTransport::SendRtcp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000161 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000162 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000163 }
164
165 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
Peter Boströmf2f82832015-05-01 13:00:41 +0200166 rtc::CriticalSection* const crit_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000167
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000168 RtpRtcpObserver* const observer_;
169 const PacketTransportAction on_rtp_, on_rtcp_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000170 };
171
172 protected:
Peter Boströmf2f82832015-05-01 13:00:41 +0200173 rtc::CriticalSection crit_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +0000174 const rtc::scoped_ptr<EventWrapper> observation_complete_;
175 const rtc::scoped_ptr<RtpHeaderParser> parser_;
stefan4fbd1452015-09-28 03:57:14 -0700176 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000177
178 private:
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000179 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000180};
181} // namespace test
182} // namespace webrtc
183
184#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_