blob: 56c96fae7eed8a45a61d98bd90adf64bc9b7cbb6 [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
stefan@webrtc.org69969e22013-11-15 12:32:15 +000016#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000017#include "webrtc/typedefs.h"
pbos@webrtc.org16e03b72013-10-28 16:32:01 +000018#include "webrtc/video_send_stream.h"
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000019
20namespace webrtc {
21namespace test {
22
23class RtpRtcpObserver {
24 public:
pbos@webrtc.orgb3cc78d2013-11-21 11:42:02 +000025 virtual ~RtpRtcpObserver() {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000026 newapi::Transport* SendTransport() {
27 return &send_transport_;
28 }
29
30 newapi::Transport* ReceiveTransport() {
31 return &receive_transport_;
32 }
33
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000034 void SetReceivers(PacketReceiver* send_transport_receiver,
35 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000036 send_transport_.SetReceiver(send_transport_receiver);
37 receive_transport_.SetReceiver(receive_transport_receiver);
38 }
39
40 void StopSending() {
41 send_transport_.StopSending();
42 receive_transport_.StopSending();
43 }
44
stefan@webrtc.org69969e22013-11-15 12:32:15 +000045 virtual EventTypeWrapper Wait() {
pbos@webrtc.org13d38a12013-11-28 11:59:31 +000046 EventTypeWrapper result = observation_complete_->Wait(timeout_ms_);
47 observation_complete_->Reset();
48 return result;
stefan@webrtc.org69969e22013-11-15 12:32:15 +000049 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000050
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000051 protected:
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000052 RtpRtcpObserver(unsigned int event_timeout_ms, int delay_ms)
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000053 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000054 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000055 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000056 send_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000057 this,
58 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000059 &RtpRtcpObserver::OnSendRtcp,
60 delay_ms),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000061 receive_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000062 this,
63 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000064 &RtpRtcpObserver::OnReceiveRtcp,
65 delay_ms),
66 timeout_ms_(event_timeout_ms) {}
67
68 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
69 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
70 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000071 parser_(RtpHeaderParser::Create()),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000072 send_transport_(lock_.get(),
73 this,
74 &RtpRtcpObserver::OnSendRtp,
75 &RtpRtcpObserver::OnSendRtcp,
76 0),
77 receive_transport_(lock_.get(),
78 this,
79 &RtpRtcpObserver::OnReceiveRtp,
80 &RtpRtcpObserver::OnReceiveRtcp,
81 0),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000082 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000083
84 enum Action {
85 SEND_PACKET,
86 DROP_PACKET,
87 };
88
89 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
90 return SEND_PACKET;
91 }
92
93 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
94 return SEND_PACKET;
95 }
96
97 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
98 return SEND_PACKET;
99 }
100
101 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
102 return SEND_PACKET;
103 }
104
105
106 private:
107 class PacketTransport : public test::DirectTransport {
108 public:
109 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
110 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000111
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000112 PacketTransport(CriticalSectionWrapper* lock,
113 RtpRtcpObserver* observer,
114 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000115 PacketTransportAction on_rtcp,
116 int delay_ms)
117 : test::DirectTransport(delay_ms),
118 lock_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000119 observer_(observer),
120 on_rtp_(on_rtp),
121 on_rtcp_(on_rtcp) {}
122
123 private:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000124 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000125 Action action;
126 {
127 CriticalSectionScoped crit_(lock_);
128 action = (observer_->*on_rtp_)(packet, length);
129 }
130 switch (action) {
131 case DROP_PACKET:
132 // Drop packet silently.
133 return true;
134 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000135 return test::DirectTransport::SendRtp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000136 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000137 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000138 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000139
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000140 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000141 Action action;
142 {
143 CriticalSectionScoped crit_(lock_);
144 action = (observer_->*on_rtcp_)(packet, length);
145 }
146 switch (action) {
147 case DROP_PACKET:
148 // Drop packet silently.
149 return true;
150 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000151 return test::DirectTransport::SendRtcp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000152 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000153 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000154 }
155
156 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
157 CriticalSectionWrapper* lock_;
158
159 RtpRtcpObserver* observer_;
160 PacketTransportAction on_rtp_, on_rtcp_;
161 };
162
163 protected:
164 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000165 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org69969e22013-11-15 12:32:15 +0000166 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000167
168 private:
169 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000170 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000171};
172} // namespace test
173} // namespace webrtc
174
175#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_