blob: 922981cc4d1764225bc703e70140a906d0a2dd4f [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:
pbos@webrtc.org6917e192013-09-19 14:22:12 +000049 RtpRtcpObserver(unsigned int event_timeout_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,
56 &RtpRtcpObserver::OnSendRtcp),
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000057 receive_transport_(lock_.get(),
pbos@webrtc.org6917e192013-09-19 14:22:12 +000058 this,
59 &RtpRtcpObserver::OnReceiveRtp,
60 &RtpRtcpObserver::OnReceiveRtcp),
61 timeout_ms_(event_timeout_ms) {}
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +000062
63 enum Action {
64 SEND_PACKET,
65 DROP_PACKET,
66 };
67
68 virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
69 return SEND_PACKET;
70 }
71
72 virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
73 return SEND_PACKET;
74 }
75
76 virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
77 return SEND_PACKET;
78 }
79
80 virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
81 return SEND_PACKET;
82 }
83
84
85 private:
86 class PacketTransport : public test::DirectTransport {
87 public:
88 typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
89 size_t);
90 PacketTransport(CriticalSectionWrapper* lock,
91 RtpRtcpObserver* observer,
92 PacketTransportAction on_rtp,
93 PacketTransportAction on_rtcp)
94 : lock_(lock),
95 observer_(observer),
96 on_rtp_(on_rtp),
97 on_rtcp_(on_rtcp) {}
98
99 private:
100 virtual bool SendRTP(const uint8_t* packet, size_t length) OVERRIDE {
101 Action action;
102 {
103 CriticalSectionScoped crit_(lock_);
104 action = (observer_->*on_rtp_)(packet, length);
105 }
106 switch (action) {
107 case DROP_PACKET:
108 // Drop packet silently.
109 return true;
110 case SEND_PACKET:
111 return test::DirectTransport::SendRTP(packet, length);
112 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000113 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000114 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000115
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000116 virtual bool SendRTCP(const uint8_t* packet, size_t length) OVERRIDE {
117 Action action;
118 {
119 CriticalSectionScoped crit_(lock_);
120 action = (observer_->*on_rtcp_)(packet, length);
121 }
122 switch (action) {
123 case DROP_PACKET:
124 // Drop packet silently.
125 return true;
126 case SEND_PACKET:
127 return test::DirectTransport::SendRTCP(packet, length);
128 }
pbos@webrtc.orgd5f4c152013-08-19 16:35:36 +0000129 return true; // Will never happen, makes compiler happy.
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000130 }
131
132 // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
133 CriticalSectionWrapper* lock_;
134
135 RtpRtcpObserver* observer_;
136 PacketTransportAction on_rtp_, on_rtcp_;
137 };
138
139 protected:
140 scoped_ptr<CriticalSectionWrapper> lock_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000141 scoped_ptr<EventWrapper> observation_complete_;
stefan@webrtc.org69969e22013-11-15 12:32:15 +0000142 scoped_ptr<RtpHeaderParser> parser_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000143
144 private:
145 PacketTransport send_transport_, receive_transport_;
pbos@webrtc.org6917e192013-09-19 14:22:12 +0000146 unsigned int timeout_ms_;
pbos@webrtc.orge7f056e2013-08-19 16:09:34 +0000147};
148} // namespace test
149} // namespace webrtc
150
151#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_