aboutsummaryrefslogtreecommitdiff
path: root/webrtc/test/rtp_rtcp_observer.h
diff options
context:
space:
mode:
authorpbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-10-28 16:32:01 +0000
committerpbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2013-10-28 16:32:01 +0000
commit16e03b7bd8b88ba569987e20a7f29061f91a3d0d (patch)
treea68dd3fa91336d403c8fe7bb64c3a60032e292fc /webrtc/test/rtp_rtcp_observer.h
parent850bcbe8556ef28d0276a01e56bbd382f1a81a31 (diff)
downloadwebrtc-16e03b7bd8b88ba569987e20a7f29061f91a3d0d.tar.gz
Separate Call API/build files from video_engine/.
BUG=2535 R=andrew@webrtc.org, mflodman@webrtc.org, niklas.enbom@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2659004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5042 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'webrtc/test/rtp_rtcp_observer.h')
-rw-r--r--webrtc/test/rtp_rtcp_observer.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/webrtc/test/rtp_rtcp_observer.h b/webrtc/test/rtp_rtcp_observer.h
new file mode 100644
index 0000000000..ee06e2a958
--- /dev/null
+++ b/webrtc/test/rtp_rtcp_observer.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+#ifndef WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
+#define WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_
+
+#include <map>
+#include <vector>
+
+#include "webrtc/typedefs.h"
+#include "webrtc/video_send_stream.h"
+
+namespace webrtc {
+namespace test {
+
+class RtpRtcpObserver {
+ public:
+ newapi::Transport* SendTransport() {
+ return &send_transport_;
+ }
+
+ newapi::Transport* ReceiveTransport() {
+ return &receive_transport_;
+ }
+
+ void SetReceivers(PacketReceiver* send_transport_receiver,
+ PacketReceiver* receive_transport_receiver) {
+ send_transport_.SetReceiver(send_transport_receiver);
+ receive_transport_.SetReceiver(receive_transport_receiver);
+ }
+
+ void StopSending() {
+ send_transport_.StopSending();
+ receive_transport_.StopSending();
+ }
+
+ EventTypeWrapper Wait() { return observation_complete_->Wait(timeout_ms_); }
+
+ protected:
+ RtpRtcpObserver(unsigned int event_timeout_ms)
+ : lock_(CriticalSectionWrapper::CreateCriticalSection()),
+ observation_complete_(EventWrapper::Create()),
+ send_transport_(lock_.get(),
+ this,
+ &RtpRtcpObserver::OnSendRtp,
+ &RtpRtcpObserver::OnSendRtcp),
+ receive_transport_(lock_.get(),
+ this,
+ &RtpRtcpObserver::OnReceiveRtp,
+ &RtpRtcpObserver::OnReceiveRtcp),
+ timeout_ms_(event_timeout_ms) {}
+
+ enum Action {
+ SEND_PACKET,
+ DROP_PACKET,
+ };
+
+ virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+ virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
+ return SEND_PACKET;
+ }
+
+
+ private:
+ class PacketTransport : public test::DirectTransport {
+ public:
+ typedef Action (RtpRtcpObserver::*PacketTransportAction)(const uint8_t*,
+ size_t);
+ PacketTransport(CriticalSectionWrapper* lock,
+ RtpRtcpObserver* observer,
+ PacketTransportAction on_rtp,
+ PacketTransportAction on_rtcp)
+ : lock_(lock),
+ observer_(observer),
+ on_rtp_(on_rtp),
+ on_rtcp_(on_rtcp) {}
+
+ private:
+ virtual bool SendRTP(const uint8_t* packet, size_t length) OVERRIDE {
+ Action action;
+ {
+ CriticalSectionScoped crit_(lock_);
+ action = (observer_->*on_rtp_)(packet, length);
+ }
+ switch (action) {
+ case DROP_PACKET:
+ // Drop packet silently.
+ return true;
+ case SEND_PACKET:
+ return test::DirectTransport::SendRTP(packet, length);
+ }
+ return true; // Will never happen, makes compiler happy.
+ }
+
+ virtual bool SendRTCP(const uint8_t* packet, size_t length) OVERRIDE {
+ Action action;
+ {
+ CriticalSectionScoped crit_(lock_);
+ action = (observer_->*on_rtcp_)(packet, length);
+ }
+ switch (action) {
+ case DROP_PACKET:
+ // Drop packet silently.
+ return true;
+ case SEND_PACKET:
+ return test::DirectTransport::SendRTCP(packet, length);
+ }
+ return true; // Will never happen, makes compiler happy.
+ }
+
+ // Pointer to shared lock instance protecting on_rtp_/on_rtcp_ calls.
+ CriticalSectionWrapper* lock_;
+
+ RtpRtcpObserver* observer_;
+ PacketTransportAction on_rtp_, on_rtcp_;
+ };
+
+ protected:
+ scoped_ptr<CriticalSectionWrapper> lock_;
+ scoped_ptr<EventWrapper> observation_complete_;
+
+ private:
+ PacketTransport send_transport_, receive_transport_;
+ unsigned int timeout_ms_;
+};
+} // namespace test
+} // namespace webrtc
+
+#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_