blob: 90e7b98242eec565909d1b6c901897a69488a3b9 [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:
25 newapi::Transport* SendTransport() {
26 return &send_transport_;
27 }
28
29 newapi::Transport* ReceiveTransport() {
30 return &receive_transport_;
31 }
32
pbos@webrtc.org74fa4892013-08-23 09:19:30 +000033 void SetReceivers(PacketReceiver* send_transport_receiver,
34 PacketReceiver* receive_transport_receiver) {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000035 send_transport_.SetReceiver(send_transport_receiver);
36 receive_transport_.SetReceiver(receive_transport_receiver);
37 }
38
39 void StopSending() {
40 send_transport_.StopSending();
41 receive_transport_.StopSending();
42 }
43
stefan@webrtc.org69969e22013-11-15 12:32:15 +000044 virtual EventTypeWrapper Wait() {
45 return observation_complete_->Wait(timeout_ms_);
46 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000047
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000048 protected:
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000049 RtpRtcpObserver(unsigned int event_timeout_ms, int delay_ms)
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000050 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000051 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000052 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000053 send_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000054 this,
55 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000056 &RtpRtcpObserver::OnSendRtcp,
57 delay_ms),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000058 receive_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000059 this,
60 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000061 &RtpRtcpObserver::OnReceiveRtcp,
62 delay_ms),
63 timeout_ms_(event_timeout_ms) {}
64
65 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
66 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
67 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000068 parser_(RtpHeaderParser::Create()),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000069 send_transport_(lock_.get(),
70 this,
71 &RtpRtcpObserver::OnSendRtp,
72 &RtpRtcpObserver::OnSendRtcp,
73 0),
74 receive_transport_(lock_.get(),
75 this,
76 &RtpRtcpObserver::OnReceiveRtp,
77 &RtpRtcpObserver::OnReceiveRtcp,
78 0),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000079 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000080
81 enum Action {
82 SEND_PACKET,
83 DROP_PACKET,
84 };
85
86 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
87 return SEND_PACKET;
88 }
89
90 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
91 return SEND_PACKET;
92 }
93
94 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
95 return SEND_PACKET;
96 }
97
98 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
99 return SEND_PACKET;
100 }
101
102
103 private:
104 class PacketTransport : public test::DirectTransport {
105 public:
106 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
107 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000108
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000109 PacketTransport(CriticalSectionWrapper* lock,
110 RtpRtcpObserver* observer,
111 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000112 PacketTransportAction on_rtcp,
113 int delay_ms)
114 : test::DirectTransport(delay_ms),
115 lock_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000116 observer_(observer),
117 on_rtp_(on_rtp),
118 on_rtcp_(on_rtcp) {}
119
120 private:
121 virtual bool SendRTP(const uint8_t* packet, size_t length) OVERRIDE {
122 Action action;
123 {
124 CriticalSectionScoped crit_(lock_);
125 action = (observer_->*on_rtp_)(packet, length);
126 }
127 switch (action) {
128 case DROP_PACKET:
129 // Drop packet silently.
130 return true;
131 case SEND_PACKET:
132 return test::DirectTransport::SendRTP(packet, length);
133 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000134 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000135 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000136
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000137 virtual bool SendRTCP(const uint8_t* packet, size_t length) OVERRIDE {
138 Action action;
139 {
140 CriticalSectionScoped crit_(lock_);
141 action = (observer_->*on_rtcp_)(packet, length);
142 }
143 switch (action) {
144 case DROP_PACKET:
145 // Drop packet silently.
146 return true;
147 case SEND_PACKET:
148 return test::DirectTransport::SendRTCP(packet, length);
149 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000150 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000151 }
152
153 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
154 CriticalSectionWrapper* lock_;
155
156 RtpRtcpObserver* observer_;
157 PacketTransportAction on_rtp_, on_rtcp_;
158 };
159
160 protected:
161 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000162 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org69969e22013-11-15 12:32:15 +0000163 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000164
165 private:
166 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000167 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000168};
169} // namespace test
170} // namespace webrtc
171
172#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_