1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_RTP_RTCP_OBSERVER_H_ 11*d9f75844SAndroid Build Coastguard Worker #define TEST_RTP_RTCP_OBSERVER_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <map> 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <utility> 16*d9f75844SAndroid Build Coastguard Worker #include <vector> 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/test/simulated_network.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/units/time_delta.h" 21*d9f75844SAndroid Build Coastguard Worker #include "call/simulated_packet_receiver.h" 22*d9f75844SAndroid Build Coastguard Worker #include "call/video_send_stream.h" 23*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_util.h" 24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/event.h" 25*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/field_trial.h" 26*d9f75844SAndroid Build Coastguard Worker #include "test/direct_transport.h" 27*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h" 28*d9f75844SAndroid Build Coastguard Worker 29*d9f75844SAndroid Build Coastguard Worker namespace { 30*d9f75844SAndroid Build Coastguard Worker constexpr webrtc::TimeDelta kShortTimeout = webrtc::TimeDelta::Millis(500); 31*d9f75844SAndroid Build Coastguard Worker } 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 34*d9f75844SAndroid Build Coastguard Worker namespace test { 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker class PacketTransport; 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker class RtpRtcpObserver { 39*d9f75844SAndroid Build Coastguard Worker public: 40*d9f75844SAndroid Build Coastguard Worker enum Action { 41*d9f75844SAndroid Build Coastguard Worker SEND_PACKET, 42*d9f75844SAndroid Build Coastguard Worker DROP_PACKET, 43*d9f75844SAndroid Build Coastguard Worker }; 44*d9f75844SAndroid Build Coastguard Worker ~RtpRtcpObserver()45*d9f75844SAndroid Build Coastguard Worker virtual ~RtpRtcpObserver() {} 46*d9f75844SAndroid Build Coastguard Worker Wait()47*d9f75844SAndroid Build Coastguard Worker virtual bool Wait() { 48*d9f75844SAndroid Build Coastguard Worker if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) { 49*d9f75844SAndroid Build Coastguard Worker observation_complete_.Wait(kShortTimeout); 50*d9f75844SAndroid Build Coastguard Worker return true; 51*d9f75844SAndroid Build Coastguard Worker } 52*d9f75844SAndroid Build Coastguard Worker return observation_complete_.Wait(timeout_); 53*d9f75844SAndroid Build Coastguard Worker } 54*d9f75844SAndroid Build Coastguard Worker OnSendRtp(const uint8_t * packet,size_t length)55*d9f75844SAndroid Build Coastguard Worker virtual Action OnSendRtp(const uint8_t* packet, size_t length) { 56*d9f75844SAndroid Build Coastguard Worker return SEND_PACKET; 57*d9f75844SAndroid Build Coastguard Worker } 58*d9f75844SAndroid Build Coastguard Worker OnSendRtcp(const uint8_t * packet,size_t length)59*d9f75844SAndroid Build Coastguard Worker virtual Action OnSendRtcp(const uint8_t* packet, size_t length) { 60*d9f75844SAndroid Build Coastguard Worker return SEND_PACKET; 61*d9f75844SAndroid Build Coastguard Worker } 62*d9f75844SAndroid Build Coastguard Worker OnReceiveRtp(const uint8_t * packet,size_t length)63*d9f75844SAndroid Build Coastguard Worker virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) { 64*d9f75844SAndroid Build Coastguard Worker return SEND_PACKET; 65*d9f75844SAndroid Build Coastguard Worker } 66*d9f75844SAndroid Build Coastguard Worker OnReceiveRtcp(const uint8_t * packet,size_t length)67*d9f75844SAndroid Build Coastguard Worker virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) { 68*d9f75844SAndroid Build Coastguard Worker return SEND_PACKET; 69*d9f75844SAndroid Build Coastguard Worker } 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker protected: RtpRtcpObserver()72*d9f75844SAndroid Build Coastguard Worker RtpRtcpObserver() : RtpRtcpObserver(TimeDelta::Zero()) {} RtpRtcpObserver(TimeDelta event_timeout)73*d9f75844SAndroid Build Coastguard Worker explicit RtpRtcpObserver(TimeDelta event_timeout) : timeout_(event_timeout) {} 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker rtc::Event observation_complete_; 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker private: 78*d9f75844SAndroid Build Coastguard Worker const TimeDelta timeout_; 79*d9f75844SAndroid Build Coastguard Worker }; 80*d9f75844SAndroid Build Coastguard Worker 81*d9f75844SAndroid Build Coastguard Worker class PacketTransport : public test::DirectTransport { 82*d9f75844SAndroid Build Coastguard Worker public: 83*d9f75844SAndroid Build Coastguard Worker enum TransportType { kReceiver, kSender }; 84*d9f75844SAndroid Build Coastguard Worker PacketTransport(TaskQueueBase * task_queue,Call * send_call,RtpRtcpObserver * observer,TransportType transport_type,const std::map<uint8_t,MediaType> & payload_type_map,std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe)85*d9f75844SAndroid Build Coastguard Worker PacketTransport(TaskQueueBase* task_queue, 86*d9f75844SAndroid Build Coastguard Worker Call* send_call, 87*d9f75844SAndroid Build Coastguard Worker RtpRtcpObserver* observer, 88*d9f75844SAndroid Build Coastguard Worker TransportType transport_type, 89*d9f75844SAndroid Build Coastguard Worker const std::map<uint8_t, MediaType>& payload_type_map, 90*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<SimulatedPacketReceiverInterface> nw_pipe) 91*d9f75844SAndroid Build Coastguard Worker : test::DirectTransport(task_queue, 92*d9f75844SAndroid Build Coastguard Worker std::move(nw_pipe), 93*d9f75844SAndroid Build Coastguard Worker send_call, 94*d9f75844SAndroid Build Coastguard Worker payload_type_map), 95*d9f75844SAndroid Build Coastguard Worker observer_(observer), 96*d9f75844SAndroid Build Coastguard Worker transport_type_(transport_type) {} 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker private: SendRtp(const uint8_t * packet,size_t length,const PacketOptions & options)99*d9f75844SAndroid Build Coastguard Worker bool SendRtp(const uint8_t* packet, 100*d9f75844SAndroid Build Coastguard Worker size_t length, 101*d9f75844SAndroid Build Coastguard Worker const PacketOptions& options) override { 102*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtpPacket(rtc::MakeArrayView(packet, length))); 103*d9f75844SAndroid Build Coastguard Worker RtpRtcpObserver::Action action; 104*d9f75844SAndroid Build Coastguard Worker { 105*d9f75844SAndroid Build Coastguard Worker if (transport_type_ == kSender) { 106*d9f75844SAndroid Build Coastguard Worker action = observer_->OnSendRtp(packet, length); 107*d9f75844SAndroid Build Coastguard Worker } else { 108*d9f75844SAndroid Build Coastguard Worker action = observer_->OnReceiveRtp(packet, length); 109*d9f75844SAndroid Build Coastguard Worker } 110*d9f75844SAndroid Build Coastguard Worker } 111*d9f75844SAndroid Build Coastguard Worker switch (action) { 112*d9f75844SAndroid Build Coastguard Worker case RtpRtcpObserver::DROP_PACKET: 113*d9f75844SAndroid Build Coastguard Worker // Drop packet silently. 114*d9f75844SAndroid Build Coastguard Worker return true; 115*d9f75844SAndroid Build Coastguard Worker case RtpRtcpObserver::SEND_PACKET: 116*d9f75844SAndroid Build Coastguard Worker return test::DirectTransport::SendRtp(packet, length, options); 117*d9f75844SAndroid Build Coastguard Worker } 118*d9f75844SAndroid Build Coastguard Worker return true; // Will never happen, makes compiler happy. 119*d9f75844SAndroid Build Coastguard Worker } 120*d9f75844SAndroid Build Coastguard Worker SendRtcp(const uint8_t * packet,size_t length)121*d9f75844SAndroid Build Coastguard Worker bool SendRtcp(const uint8_t* packet, size_t length) override { 122*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(IsRtcpPacket(rtc::MakeArrayView(packet, length))); 123*d9f75844SAndroid Build Coastguard Worker RtpRtcpObserver::Action action; 124*d9f75844SAndroid Build Coastguard Worker { 125*d9f75844SAndroid Build Coastguard Worker if (transport_type_ == kSender) { 126*d9f75844SAndroid Build Coastguard Worker action = observer_->OnSendRtcp(packet, length); 127*d9f75844SAndroid Build Coastguard Worker } else { 128*d9f75844SAndroid Build Coastguard Worker action = observer_->OnReceiveRtcp(packet, length); 129*d9f75844SAndroid Build Coastguard Worker } 130*d9f75844SAndroid Build Coastguard Worker } 131*d9f75844SAndroid Build Coastguard Worker switch (action) { 132*d9f75844SAndroid Build Coastguard Worker case RtpRtcpObserver::DROP_PACKET: 133*d9f75844SAndroid Build Coastguard Worker // Drop packet silently. 134*d9f75844SAndroid Build Coastguard Worker return true; 135*d9f75844SAndroid Build Coastguard Worker case RtpRtcpObserver::SEND_PACKET: 136*d9f75844SAndroid Build Coastguard Worker return test::DirectTransport::SendRtcp(packet, length); 137*d9f75844SAndroid Build Coastguard Worker } 138*d9f75844SAndroid Build Coastguard Worker return true; // Will never happen, makes compiler happy. 139*d9f75844SAndroid Build Coastguard Worker } 140*d9f75844SAndroid Build Coastguard Worker 141*d9f75844SAndroid Build Coastguard Worker RtpRtcpObserver* const observer_; 142*d9f75844SAndroid Build Coastguard Worker TransportType transport_type_; 143*d9f75844SAndroid Build Coastguard Worker }; 144*d9f75844SAndroid Build Coastguard Worker } // namespace test 145*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 146*d9f75844SAndroid Build Coastguard Worker 147*d9f75844SAndroid Build Coastguard Worker #endif // TEST_RTP_RTCP_OBSERVER_H_ 148