blob: 39b43c0e0e14f18e440b62a1d1c1827572e790b3 [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()),
68 send_transport_(lock_.get(),
69 this,
70 &RtpRtcpObserver::OnSendRtp,
71 &RtpRtcpObserver::OnSendRtcp,
72 0),
73 receive_transport_(lock_.get(),
74 this,
75 &RtpRtcpObserver::OnReceiveRtp,
76 &RtpRtcpObserver::OnReceiveRtcp,
77 0),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000078 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000079
80 enum Action {
81 SEND_PACKET,
82 DROP_PACKET,
83 };
84
85 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
86 return SEND_PACKET;
87 }
88
89 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
90 return SEND_PACKET;
91 }
92
93 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
94 return SEND_PACKET;
95 }
96
97 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
98 return SEND_PACKET;
99 }
100
101
102 private:
103 class PacketTransport : public test::DirectTransport {
104 public:
105 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
106 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000107
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000108 PacketTransport(CriticalSectionWrapper* lock,
109 RtpRtcpObserver* observer,
110 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000111 PacketTransportAction on_rtcp,
112 int delay_ms)
113 : test::DirectTransport(delay_ms),
114 lock_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000115 observer_(observer),
116 on_rtp_(on_rtp),
117 on_rtcp_(on_rtcp) {}
118
119 private:
120 virtual bool SendRTP(const uint8_t* packet, size_t length) OVERRIDE {
121 Action action;
122 {
123 CriticalSectionScoped crit_(lock_);
124 action = (observer_->*on_rtp_)(packet, length);
125 }
126 switch (action) {
127 case DROP_PACKET:
128 // Drop packet silently.
129 return true;
130 case SEND_PACKET:
131 return test::DirectTransport::SendRTP(packet, length);
132 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000133 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000134 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000135
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000136 virtual bool SendRTCP(const uint8_t* packet, size_t length) OVERRIDE {
137 Action action;
138 {
139 CriticalSectionScoped crit_(lock_);
140 action = (observer_->*on_rtcp_)(packet, length);
141 }
142 switch (action) {
143 case DROP_PACKET:
144 // Drop packet silently.
145 return true;
146 case SEND_PACKET:
147 return test::DirectTransport::SendRTCP(packet, length);
148 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000149 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000150 }
151
152 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
153 CriticalSectionWrapper* lock_;
154
155 RtpRtcpObserver* observer_;
156 PacketTransportAction on_rtp_, on_rtcp_;
157 };
158
159 protected:
160 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000161 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org69969e22013-11-15 12:32:15 +0000162 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000163
164 private:
165 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000166 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000167};
168} // namespace test
169} // namespace webrtc
170
171#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_