xref: /aosp_15_r20/external/webrtc/test/rtp_rtcp_observer.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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