blob: 670a29def23be85bfbda0b94a103f9d5ef612537 [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
stefan@webrtc.org69969e22013-11-15 12:32:15 +000018#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
pbos@webrtc.org994d0b72014-06-27 08:47:52 +000019#include "webrtc/test/direct_transport.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000020#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000021#include "webrtc/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000022
23namespace webrtc {
24namespace test {
25
26class RtpRtcpObserver {
27 public:
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000028 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000029 newapi::Transport* SendTransport() {
30 return &send_transport_;
31 }
32
33 newapi::Transport* ReceiveTransport() {
34 return &receive_transport_;
35 }
36
pbos@webrtc.org3349ae02014-03-13 12:52:27 +000037 virtual void SetReceivers(PacketReceiver* send_transport_receiver,
38 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000039 send_transport_.SetReceiver(send_transport_receiver);
40 receive_transport_.SetReceiver(receive_transport_receiver);
41 }
42
43 void StopSending() {
44 send_transport_.StopSending();
45 receive_transport_.StopSending();
46 }
47
stefan@webrtc.org69969e22013-11-15 12:32:15 +000048 virtual EventTypeWrapper Wait() {
pbos@webrtc.org13d38a12013-11-28 11:59:31 +000049 EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
50 observation_complete_->Reset();
51 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,
56 const FakeNetworkPipe::Config& configuration)
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000057 : crit_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000058 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000059 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000060 send_transport_(crit_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000061 this,
62 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000063 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000064 configuration),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000065 receive_transport_(crit_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000066 this,
67 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000068 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000069 configuration),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000070 timeout_ms_(event_timeout_ms) {}
71
72 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000073 : crit_(CriticalSectionWrapper::CreateCriticalSection()),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000074 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000075 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000076 send_transport_(crit_.get(),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000077 this,
78 &RtpRtcpObserver::OnSendRtp,
79 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000080 FakeNetworkPipe::Config()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000081 receive_transport_(crit_.get(),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000082 this,
83 &RtpRtcpObserver::OnReceiveRtp,
84 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000085 FakeNetworkPipe::Config()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000086 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000087
88 enum Action {
89 SEND_PACKET,
90 DROP_PACKET,
91 };
92
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000093 virtual Action OnSendRtp(const uint8_t* packet, size_t length)
94 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000095 return SEND_PACKET;
96 }
97
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000098 virtual Action OnSendRtcp(const uint8_t* packet, size_t length)
99 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000100 return SEND_PACKET;
101 }
102
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000103 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length)
104 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000105 return SEND_PACKET;
106 }
107
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000108 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length)
109 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000110 return SEND_PACKET;
111 }
112
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000113 private:
114 class PacketTransport : public test::DirectTransport {
115 public:
116 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
117 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000118
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000119 PacketTransport(CriticalSectionWrapper* lock,
120 RtpRtcpObserver* observer,
121 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000122 PacketTransportAction on_rtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000123 const FakeNetworkPipe::Config& configuration)
124 : test::DirectTransport(configuration),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000125 crit_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000126 observer_(observer),
127 on_rtp_(on_rtp),
128 on_rtcp_(on_rtcp) {}
129
130 private:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000131 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc279a5d2014-01-24 09:30:53 +0000132 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000133 Action action;
134 {
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000135 CriticalSectionScoped 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:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000143 return test::DirectTransport::SendRtp(packet, length);
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
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000148 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc279a5d2014-01-24 09:30:53 +0000149 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000150 Action action;
151 {
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000152 CriticalSectionScoped 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.
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000166 CriticalSectionWrapper* 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:
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000173 const scoped_ptr<CriticalSectionWrapper> crit_;
174 const scoped_ptr<EventWrapper> observation_complete_;
175 const scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000176
177 private:
178 PacketTransport send_transport_, receive_transport_;
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_