diff options
Diffstat (limited to 'webrtc/test/rtp_rtcp_observer.h')
-rw-r--r-- | webrtc/test/rtp_rtcp_observer.h | 141 |
1 files changed, 141 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..89b6dd06bd --- /dev/null +++ b/webrtc/test/rtp_rtcp_observer.h @@ -0,0 +1,141 @@ +/* + * 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 "testing/gtest/include/gtest/gtest.h" + +#include "webrtc/base/criticalsection.h" +#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" +#include "webrtc/test/constants.h" +#include "webrtc/test/direct_transport.h" +#include "webrtc/typedefs.h" +#include "webrtc/video_send_stream.h" + +namespace webrtc { +namespace test { + +class PacketTransport; + +class RtpRtcpObserver { + public: + enum Action { + SEND_PACKET, + DROP_PACKET, + }; + + virtual ~RtpRtcpObserver() {} + + virtual EventTypeWrapper Wait() { + EventTypeWrapper result = observation_complete_->Wait(timeout_ms_); + return result; + } + + 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; + } + + protected: + explicit RtpRtcpObserver(unsigned int event_timeout_ms) + : observation_complete_(EventWrapper::Create()), + parser_(RtpHeaderParser::Create()), + timeout_ms_(event_timeout_ms) { + parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, + kTOffsetExtensionId); + parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, + kAbsSendTimeExtensionId); + parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber, + kTransportSequenceNumberExtensionId); + } + + const rtc::scoped_ptr<EventWrapper> observation_complete_; + const rtc::scoped_ptr<RtpHeaderParser> parser_; + + private: + unsigned int timeout_ms_; +}; + +class PacketTransport : public test::DirectTransport { + public: + enum TransportType { kReceiver, kSender }; + + PacketTransport(Call* send_call, + RtpRtcpObserver* observer, + TransportType transport_type, + const FakeNetworkPipe::Config& configuration) + : test::DirectTransport(configuration, send_call), + observer_(observer), + transport_type_(transport_type) {} + + private: + bool SendRtp(const uint8_t* packet, + size_t length, + const PacketOptions& options) override { + EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length)); + RtpRtcpObserver::Action action; + { + if (transport_type_ == kSender) { + action = observer_->OnSendRtp(packet, length); + } else { + action = observer_->OnReceiveRtp(packet, length); + } + } + switch (action) { + case RtpRtcpObserver::DROP_PACKET: + // Drop packet silently. + return true; + case RtpRtcpObserver::SEND_PACKET: + return test::DirectTransport::SendRtp(packet, length, options); + } + return true; // Will never happen, makes compiler happy. + } + + bool SendRtcp(const uint8_t* packet, size_t length) override { + EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length)); + RtpRtcpObserver::Action action; + { + if (transport_type_ == kSender) { + action = observer_->OnSendRtcp(packet, length); + } else { + action = observer_->OnReceiveRtcp(packet, length); + } + } + switch (action) { + case RtpRtcpObserver::DROP_PACKET: + // Drop packet silently. + return true; + case RtpRtcpObserver::SEND_PACKET: + return test::DirectTransport::SendRtcp(packet, length); + } + return true; // Will never happen, makes compiler happy. + } + + RtpRtcpObserver* const observer_; + TransportType transport_type_; +}; +} // namespace test +} // namespace webrtc + +#endif // WEBRTC_VIDEO_ENGINE_TEST_COMMON_RTP_RTCP_OBSERVER_H_ |