blob: e4486534c9f6de57500f1825f861a5a76ab3a534 [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.orge7f056e2013-08-19 16:09:34 +000019#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000020#include "webrtc/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000021
22namespace webrtc {
23namespace test {
24
25class RtpRtcpObserver {
26 public:
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000027 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000028 newapi::Transport* SendTransport() {
29 return &send_transport_;
30 }
31
32 newapi::Transport* ReceiveTransport() {
33 return &receive_transport_;
34 }
35
pbos@webrtc.org3349ae02014-03-13 12:52:27 +000036 virtual void SetReceivers(PacketReceiver* send_transport_receiver,
37 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000038 send_transport_.SetReceiver(send_transport_receiver);
39 receive_transport_.SetReceiver(receive_transport_receiver);
40 }
41
42 void StopSending() {
43 send_transport_.StopSending();
44 receive_transport_.StopSending();
45 }
46
stefan@webrtc.org69969e22013-11-15 12:32:15 +000047 virtual EventTypeWrapper Wait() {
pbos@webrtc.org13d38a12013-11-28 11:59:31 +000048 EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
49 observation_complete_->Reset();
50 return result;
stefan@webrtc.org69969e22013-11-15 12:32:15 +000051 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000052
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000053 protected:
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000054 RtpRtcpObserver(unsigned int event_timeout_ms,
55 const FakeNetworkPipe::Config& configuration)
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000056 : crit_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000057 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000058 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000059 send_transport_(crit_.get(),
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),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000064 receive_transport_(crit_.get(),
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)
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000072 : crit_(CriticalSectionWrapper::CreateCriticalSection()),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000073 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000074 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000075 send_transport_(crit_.get(),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000076 this,
77 &RtpRtcpObserver::OnSendRtp,
78 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000079 FakeNetworkPipe::Config()),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000080 receive_transport_(crit_.get(),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000081 this,
82 &RtpRtcpObserver::OnReceiveRtp,
83 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +000084 FakeNetworkPipe::Config()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000085 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000086
87 enum Action {
88 SEND_PACKET,
89 DROP_PACKET,
90 };
91
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000092 virtual Action OnSendRtp(const uint8_t* packet, size_t length)
93 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000094 return SEND_PACKET;
95 }
96
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +000097 virtual Action OnSendRtcp(const uint8_t* packet, size_t length)
98 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000099 return SEND_PACKET;
100 }
101
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000102 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length)
103 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000104 return SEND_PACKET;
105 }
106
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000107 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length)
108 EXCLUSIVE_LOCKS_REQUIRED(crit_) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000109 return SEND_PACKET;
110 }
111
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000112 private:
113 class PacketTransport : public test::DirectTransport {
114 public:
115 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
116 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000117
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000118 PacketTransport(CriticalSectionWrapper* lock,
119 RtpRtcpObserver* observer,
120 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000121 PacketTransportAction on_rtcp,
stefan@webrtc.orgfaada6e2013-12-18 20:28:25 +0000122 const FakeNetworkPipe::Config& configuration)
123 : test::DirectTransport(configuration),
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000124 crit_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000125 observer_(observer),
126 on_rtp_(on_rtp),
127 on_rtcp_(on_rtcp) {}
128
129 private:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000130 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc279a5d2014-01-24 09:30:53 +0000131 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000132 Action action;
133 {
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000134 CriticalSectionScoped lock(crit_);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000135 action = (observer_->*on_rtp_)(packet, length);
136 }
137 switch (action) {
138 case DROP_PACKET:
139 // Drop packet silently.
140 return true;
141 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000142 return test::DirectTransport::SendRtp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000143 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000144 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000145 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000146
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000147 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc279a5d2014-01-24 09:30:53 +0000148 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000149 Action action;
150 {
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000151 CriticalSectionScoped lock(crit_);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000152 action = (observer_->*on_rtcp_)(packet, length);
153 }
154 switch (action) {
155 case DROP_PACKET:
156 // Drop packet silently.
157 return true;
158 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000159 return test::DirectTransport::SendRtcp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000160 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000161 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000162 }
163
164 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000165 CriticalSectionWrapper* const crit_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000166
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000167 RtpRtcpObserver* const observer_;
168 const PacketTransportAction on_rtp_, on_rtcp_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000169 };
170
171 protected:
pbos@webrtc.orgde1429e2014-04-28 13:00:21 +0000172 const scoped_ptr<CriticalSectionWrapper> crit_;
173 const scoped_ptr<EventWrapper> observation_complete_;
174 const scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000175
176 private:
177 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000178 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000179};
180} // namespace test
181} // namespace webrtc
182
183#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_