blob: 5ed9a3f3eb15f7cc75e8e87abba4ccf472481da3 [file] [log] [blame]
pbos@webrtc.org8ce445e2013-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.orgc71929d2014-01-24 09:30:53 +000016#include "testing/gtest/include/gtest/gtest.h"
17
stefan@webrtc.org4985c7b2013-11-15 12:32:15 +000018#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000019#include "webrtc/typedefs.h"
pbos@webrtc.org24e20892013-10-28 16:32:01 +000020#include "webrtc/video_send_stream.h"
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000021
22namespace webrtc {
23namespace test {
24
25class RtpRtcpObserver {
26 public:
pbos@webrtc.orge1e050e2013-11-21 11:42:02 +000027 virtual ~RtpRtcpObserver() {}
pbos@webrtc.org8ce445e2013-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.orgc1797062013-08-23 09:19:30 +000036 void SetReceivers(PacketReceiver* send_transport_receiver,
37 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.org8ce445e2013-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.org4985c7b2013-11-15 12:32:15 +000047 virtual EventTypeWrapper Wait() {
pbos@webrtc.org66f43942013-11-28 11:59:31 +000048 EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
49 observation_complete_->Reset();
50 return result;
stefan@webrtc.org4985c7b2013-11-15 12:32:15 +000051 }
pbos@webrtc.org28a11662013-09-19 14:22:12 +000052
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000053 protected:
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000054 RtpRtcpObserver(unsigned int event_timeout_ms,
55 const FakeNetworkPipe::Config& configuration)
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000056 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org28a11662013-09-19 14:22:12 +000057 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org4985c7b2013-11-15 12:32:15 +000058 parser_(RtpHeaderParser::Create()),
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000059 send_transport_(lock_.get(),
pbos@webrtc.org28a11662013-09-19 14:22:12 +000060 this,
61 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orge0284102013-11-18 11:45:11 +000062 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000063 configuration),
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000064 receive_transport_(lock_.get(),
pbos@webrtc.org28a11662013-09-19 14:22:12 +000065 this,
66 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orge0284102013-11-18 11:45:11 +000067 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000068 configuration),
stefan@webrtc.orge0284102013-11-18 11:45:11 +000069 timeout_ms_(event_timeout_ms) {}
70
71 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
72 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
73 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org09f84e52013-11-18 11:58:24 +000074 parser_(RtpHeaderParser::Create()),
stefan@webrtc.orge0284102013-11-18 11:45:11 +000075 send_transport_(lock_.get(),
76 this,
77 &RtpRtcpObserver::OnSendRtp,
78 &RtpRtcpObserver::OnSendRtcp,
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000079 FakeNetworkPipe::Config()),
stefan@webrtc.orge0284102013-11-18 11:45:11 +000080 receive_transport_(lock_.get(),
81 this,
82 &RtpRtcpObserver::OnReceiveRtp,
83 &RtpRtcpObserver::OnReceiveRtcp,
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +000084 FakeNetworkPipe::Config()),
pbos@webrtc.org28a11662013-09-19 14:22:12 +000085 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +000086
87 enum Action {
88 SEND_PACKET,
89 DROP_PACKET,
90 };
91
92 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
93 return SEND_PACKET;
94 }
95
96 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
97 return SEND_PACKET;
98 }
99
100 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
101 return SEND_PACKET;
102 }
103
104 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
105 return SEND_PACKET;
106 }
107
108
109 private:
110 class PacketTransport : public test::DirectTransport {
111 public:
112 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
113 size_t);
stefan@webrtc.orge0284102013-11-18 11:45:11 +0000114
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000115 PacketTransport(CriticalSectionWrapper* lock,
116 RtpRtcpObserver* observer,
117 PacketTransportAction on_rtp,
stefan@webrtc.orge0284102013-11-18 11:45:11 +0000118 PacketTransportAction on_rtcp,
stefan@webrtc.orgaacdb9f2013-12-18 20:28:25 +0000119 const FakeNetworkPipe::Config& configuration)
120 : test::DirectTransport(configuration),
stefan@webrtc.orge0284102013-11-18 11:45:11 +0000121 lock_(lock),
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000122 observer_(observer),
123 on_rtp_(on_rtp),
124 on_rtcp_(on_rtcp) {}
125
126 private:
pbos@webrtc.org3009c812013-11-20 12:17:04 +0000127 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc71929d2014-01-24 09:30:53 +0000128 EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000129 Action action;
130 {
131 CriticalSectionScoped crit_(lock_);
132 action = (observer_->*on_rtp_)(packet, length);
133 }
134 switch (action) {
135 case DROP_PACKET:
136 // Drop packet silently.
137 return true;
138 case SEND_PACKET:
pbos@webrtc.org3009c812013-11-20 12:17:04 +0000139 return test::DirectTransport::SendRtp(packet, length);
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000140 }
pbos@webrtc.org96ff6ab2013-08-19 16:35:36 +0000141 return true; // Will never happen, makes compiler happy.
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000142 }
pbos@webrtc.org96ff6ab2013-08-19 16:35:36 +0000143
pbos@webrtc.org3009c812013-11-20 12:17:04 +0000144 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orgc71929d2014-01-24 09:30:53 +0000145 EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, static_cast<int>(length)));
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000146 Action action;
147 {
148 CriticalSectionScoped crit_(lock_);
149 action = (observer_->*on_rtcp_)(packet, length);
150 }
151 switch (action) {
152 case DROP_PACKET:
153 // Drop packet silently.
154 return true;
155 case SEND_PACKET:
pbos@webrtc.org3009c812013-11-20 12:17:04 +0000156 return test::DirectTransport::SendRtcp(packet, length);
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000157 }
pbos@webrtc.org96ff6ab2013-08-19 16:35:36 +0000158 return true; // Will never happen, makes compiler happy.
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000159 }
160
161 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
162 CriticalSectionWrapper* lock_;
163
164 RtpRtcpObserver* observer_;
165 PacketTransportAction on_rtp_, on_rtcp_;
166 };
167
168 protected:
169 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org28a11662013-09-19 14:22:12 +0000170 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org4985c7b2013-11-15 12:32:15 +0000171 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000172
173 private:
174 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org28a11662013-09-19 14:22:12 +0000175 unsigned int timeout_ms_;
pbos@webrtc.org8ce445e2013-08-19 16:09:34 +0000176};
177} // namespace test
178} // namespace webrtc
179
180#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_