diff options
author | pbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-10-28 16:32:01 +0000 |
---|---|---|
committer | pbos@webrtc.org <pbos@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2013-10-28 16:32:01 +0000 |
commit | 16e03b7bd8b88ba569987e20a7f29061f91a3d0d (patch) | |
tree | a68dd3fa91336d403c8fe7bb64c3a60032e292fc /webrtc/test/rtp_rtcp_observer.h | |
parent | 850bcbe8556ef28d0276a01e56bbd382f1a81a31 (diff) | |
download | webrtc-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.h | 146 |
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_ |