blob: f82d27b766cb23b7cf2ed867ac7baf974f77b095 [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() {
46 return observation_complete_->Wait(timeout_ms_);
47 }
pbos@webrtc.org6917e192013-09-19 14:22:12 +000048
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000049 protected:
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000050 RtpRtcpObserver(unsigned int event_timeout_ms, int delay_ms)
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000051 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000052 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org69969e22013-11-15 12:32:15 +000053 parser_(RtpHeaderParser::Create()),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000054 send_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000055 this,
56 &RtpRtcpObserver::OnSendRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000057 &RtpRtcpObserver::OnSendRtcp,
58 delay_ms),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000059 receive_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000060 this,
61 &RtpRtcpObserver::OnReceiveRtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000062 &RtpRtcpObserver::OnReceiveRtcp,
63 delay_ms),
64 timeout_ms_(event_timeout_ms) {}
65
66 explicit RtpRtcpObserver(unsigned int event_timeout_ms)
67 : lock_(CriticalSectionWrapper::CreateCriticalSection()),
68 observation_complete_(EventWrapper::Create()),
stefan@webrtc.org28bf50f2013-11-18 11:58:24 +000069 parser_(RtpHeaderParser::Create()),
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +000070 send_transport_(lock_.get(),
71 this,
72 &RtpRtcpObserver::OnSendRtp,
73 &RtpRtcpObserver::OnSendRtcp,
74 0),
75 receive_transport_(lock_.get(),
76 this,
77 &RtpRtcpObserver::OnReceiveRtp,
78 &RtpRtcpObserver::OnReceiveRtcp,
79 0),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000080 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000081
82 enum Action {
83 SEND_PACKET,
84 DROP_PACKET,
85 };
86
87 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
88 return SEND_PACKET;
89 }
90
91 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
92 return SEND_PACKET;
93 }
94
95 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
96 return SEND_PACKET;
97 }
98
99 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
100 return SEND_PACKET;
101 }
102
103
104 private:
105 class PacketTransport : public test::DirectTransport {
106 public:
107 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
108 size_t);
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000109
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000110 PacketTransport(CriticalSectionWrapper* lock,
111 RtpRtcpObserver* observer,
112 PacketTransportAction on_rtp,
stefan@webrtc.orgb082ade2013-11-18 11:45:11 +0000113 PacketTransportAction on_rtcp,
114 int delay_ms)
115 : test::DirectTransport(delay_ms),
116 lock_(lock),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000117 observer_(observer),
118 on_rtp_(on_rtp),
119 on_rtcp_(on_rtcp) {}
120
121 private:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000122 virtual bool SendRtp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000123 Action action;
124 {
125 CriticalSectionScoped crit_(lock_);
126 action = (observer_->*on_rtp_)(packet, length);
127 }
128 switch (action) {
129 case DROP_PACKET:
130 // Drop packet silently.
131 return true;
132 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000133 return test::DirectTransport::SendRtp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000134 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000135 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000136 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000137
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000138 virtual bool SendRtcp(const uint8_t* packet, size_t length) OVERRIDE {
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000139 Action action;
140 {
141 CriticalSectionScoped crit_(lock_);
142 action = (observer_->*on_rtcp_)(packet, length);
143 }
144 switch (action) {
145 case DROP_PACKET:
146 // Drop packet silently.
147 return true;
148 case SEND_PACKET:
pbos@webrtc.org27326b62013-11-20 12:17:04 +0000149 return test::DirectTransport::SendRtcp(packet, length);
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000150 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000151 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000152 }
153
154 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
155 CriticalSectionWrapper* lock_;
156
157 RtpRtcpObserver* observer_;
158 PacketTransportAction on_rtp_, on_rtcp_;
159 };
160
161 protected:
162 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000163 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org69969e22013-11-15 12:32:15 +0000164 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000165
166 private:
167 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000168 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000169};
170} // namespace test
171} // namespace webrtc
172
173#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_