xref: /aosp_15_r20/external/webrtc/audio/audio_send_stream_tests.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2017 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 
11*d9f75844SAndroid Build Coastguard Worker #include <string>
12*d9f75844SAndroid Build Coastguard Worker #include <utility>
13*d9f75844SAndroid Build Coastguard Worker #include <vector>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
16*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
17*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_packet.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/call_test.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/field_trial.h"
20*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
21*d9f75844SAndroid Build Coastguard Worker #include "test/rtcp_packet_parser.h"
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
24*d9f75844SAndroid Build Coastguard Worker namespace test {
25*d9f75844SAndroid Build Coastguard Worker namespace {
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker enum : int {  // The first valid value is 1.
28*d9f75844SAndroid Build Coastguard Worker   kAudioLevelExtensionId = 1,
29*d9f75844SAndroid Build Coastguard Worker   kTransportSequenceNumberExtensionId,
30*d9f75844SAndroid Build Coastguard Worker };
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker class AudioSendTest : public SendTest {
33*d9f75844SAndroid Build Coastguard Worker  public:
AudioSendTest()34*d9f75844SAndroid Build Coastguard Worker   AudioSendTest() : SendTest(CallTest::kDefaultTimeout) {}
35*d9f75844SAndroid Build Coastguard Worker 
GetNumVideoStreams() const36*d9f75844SAndroid Build Coastguard Worker   size_t GetNumVideoStreams() const override { return 0; }
GetNumAudioStreams() const37*d9f75844SAndroid Build Coastguard Worker   size_t GetNumAudioStreams() const override { return 1; }
GetNumFlexfecStreams() const38*d9f75844SAndroid Build Coastguard Worker   size_t GetNumFlexfecStreams() const override { return 0; }
39*d9f75844SAndroid Build Coastguard Worker };
40*d9f75844SAndroid Build Coastguard Worker }  // namespace
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker using AudioSendStreamCallTest = CallTest;
43*d9f75844SAndroid Build Coastguard Worker 
TEST_F(AudioSendStreamCallTest,SupportsCName)44*d9f75844SAndroid Build Coastguard Worker TEST_F(AudioSendStreamCallTest, SupportsCName) {
45*d9f75844SAndroid Build Coastguard Worker   static std::string kCName = "PjqatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
46*d9f75844SAndroid Build Coastguard Worker   class CNameObserver : public AudioSendTest {
47*d9f75844SAndroid Build Coastguard Worker    public:
48*d9f75844SAndroid Build Coastguard Worker     CNameObserver() = default;
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker    private:
51*d9f75844SAndroid Build Coastguard Worker     Action OnSendRtcp(const uint8_t* packet, size_t length) override {
52*d9f75844SAndroid Build Coastguard Worker       RtcpPacketParser parser;
53*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(parser.Parse(packet, length));
54*d9f75844SAndroid Build Coastguard Worker       if (parser.sdes()->num_packets() > 0) {
55*d9f75844SAndroid Build Coastguard Worker         EXPECT_EQ(1u, parser.sdes()->chunks().size());
56*d9f75844SAndroid Build Coastguard Worker         EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname);
57*d9f75844SAndroid Build Coastguard Worker 
58*d9f75844SAndroid Build Coastguard Worker         observation_complete_.Set();
59*d9f75844SAndroid Build Coastguard Worker       }
60*d9f75844SAndroid Build Coastguard Worker 
61*d9f75844SAndroid Build Coastguard Worker       return SEND_PACKET;
62*d9f75844SAndroid Build Coastguard Worker     }
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker     void ModifyAudioConfigs(AudioSendStream::Config* send_config,
65*d9f75844SAndroid Build Coastguard Worker                             std::vector<AudioReceiveStreamInterface::Config>*
66*d9f75844SAndroid Build Coastguard Worker                                 receive_configs) override {
67*d9f75844SAndroid Build Coastguard Worker       send_config->rtp.c_name = kCName;
68*d9f75844SAndroid Build Coastguard Worker     }
69*d9f75844SAndroid Build Coastguard Worker 
70*d9f75844SAndroid Build Coastguard Worker     void PerformTest() override {
71*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
72*d9f75844SAndroid Build Coastguard Worker     }
73*d9f75844SAndroid Build Coastguard Worker   } test;
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker   RunBaseTest(&test);
76*d9f75844SAndroid Build Coastguard Worker }
77*d9f75844SAndroid Build Coastguard Worker 
TEST_F(AudioSendStreamCallTest,NoExtensionsByDefault)78*d9f75844SAndroid Build Coastguard Worker TEST_F(AudioSendStreamCallTest, NoExtensionsByDefault) {
79*d9f75844SAndroid Build Coastguard Worker   class NoExtensionsObserver : public AudioSendTest {
80*d9f75844SAndroid Build Coastguard Worker    public:
81*d9f75844SAndroid Build Coastguard Worker     NoExtensionsObserver() = default;
82*d9f75844SAndroid Build Coastguard Worker 
83*d9f75844SAndroid Build Coastguard Worker    private:
84*d9f75844SAndroid Build Coastguard Worker     Action OnSendRtp(const uint8_t* packet, size_t length) override {
85*d9f75844SAndroid Build Coastguard Worker       RtpPacket rtp_packet;
86*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtp_packet.Parse(packet, length));  // rtp packet is valid.
87*d9f75844SAndroid Build Coastguard Worker       EXPECT_EQ(packet[0] & 0b0001'0000, 0);          // extension bit not set.
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker       observation_complete_.Set();
90*d9f75844SAndroid Build Coastguard Worker       return SEND_PACKET;
91*d9f75844SAndroid Build Coastguard Worker     }
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker     void ModifyAudioConfigs(AudioSendStream::Config* send_config,
94*d9f75844SAndroid Build Coastguard Worker                             std::vector<AudioReceiveStreamInterface::Config>*
95*d9f75844SAndroid Build Coastguard Worker                                 receive_configs) override {
96*d9f75844SAndroid Build Coastguard Worker       send_config->rtp.extensions.clear();
97*d9f75844SAndroid Build Coastguard Worker     }
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker     void PerformTest() override {
100*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
101*d9f75844SAndroid Build Coastguard Worker     }
102*d9f75844SAndroid Build Coastguard Worker   } test;
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker   RunBaseTest(&test);
105*d9f75844SAndroid Build Coastguard Worker }
106*d9f75844SAndroid Build Coastguard Worker 
TEST_F(AudioSendStreamCallTest,SupportsAudioLevel)107*d9f75844SAndroid Build Coastguard Worker TEST_F(AudioSendStreamCallTest, SupportsAudioLevel) {
108*d9f75844SAndroid Build Coastguard Worker   class AudioLevelObserver : public AudioSendTest {
109*d9f75844SAndroid Build Coastguard Worker    public:
110*d9f75844SAndroid Build Coastguard Worker     AudioLevelObserver() : AudioSendTest() {
111*d9f75844SAndroid Build Coastguard Worker       extensions_.Register<AudioLevel>(kAudioLevelExtensionId);
112*d9f75844SAndroid Build Coastguard Worker     }
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker     Action OnSendRtp(const uint8_t* packet, size_t length) override {
115*d9f75844SAndroid Build Coastguard Worker       RtpPacket rtp_packet(&extensions_);
116*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtp_packet.Parse(packet, length));
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker       uint8_t audio_level = 0;
119*d9f75844SAndroid Build Coastguard Worker       bool voice = false;
120*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtp_packet.GetExtension<AudioLevel>(&voice, &audio_level));
121*d9f75844SAndroid Build Coastguard Worker       if (audio_level != 0) {
122*d9f75844SAndroid Build Coastguard Worker         // Wait for at least one packet with a non-zero level.
123*d9f75844SAndroid Build Coastguard Worker         observation_complete_.Set();
124*d9f75844SAndroid Build Coastguard Worker       } else {
125*d9f75844SAndroid Build Coastguard Worker         RTC_LOG(LS_WARNING) << "Got a packet with zero audioLevel - waiting"
126*d9f75844SAndroid Build Coastguard Worker                                " for another packet...";
127*d9f75844SAndroid Build Coastguard Worker       }
128*d9f75844SAndroid Build Coastguard Worker 
129*d9f75844SAndroid Build Coastguard Worker       return SEND_PACKET;
130*d9f75844SAndroid Build Coastguard Worker     }
131*d9f75844SAndroid Build Coastguard Worker 
132*d9f75844SAndroid Build Coastguard Worker     void ModifyAudioConfigs(AudioSendStream::Config* send_config,
133*d9f75844SAndroid Build Coastguard Worker                             std::vector<AudioReceiveStreamInterface::Config>*
134*d9f75844SAndroid Build Coastguard Worker                                 receive_configs) override {
135*d9f75844SAndroid Build Coastguard Worker       send_config->rtp.extensions.clear();
136*d9f75844SAndroid Build Coastguard Worker       send_config->rtp.extensions.push_back(
137*d9f75844SAndroid Build Coastguard Worker           RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelExtensionId));
138*d9f75844SAndroid Build Coastguard Worker     }
139*d9f75844SAndroid Build Coastguard Worker 
140*d9f75844SAndroid Build Coastguard Worker     void PerformTest() override {
141*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
142*d9f75844SAndroid Build Coastguard Worker     }
143*d9f75844SAndroid Build Coastguard Worker 
144*d9f75844SAndroid Build Coastguard Worker    private:
145*d9f75844SAndroid Build Coastguard Worker     RtpHeaderExtensionMap extensions_;
146*d9f75844SAndroid Build Coastguard Worker   } test;
147*d9f75844SAndroid Build Coastguard Worker 
148*d9f75844SAndroid Build Coastguard Worker   RunBaseTest(&test);
149*d9f75844SAndroid Build Coastguard Worker }
150*d9f75844SAndroid Build Coastguard Worker 
151*d9f75844SAndroid Build Coastguard Worker class TransportWideSequenceNumberObserver : public AudioSendTest {
152*d9f75844SAndroid Build Coastguard Worker  public:
TransportWideSequenceNumberObserver(bool expect_sequence_number)153*d9f75844SAndroid Build Coastguard Worker   explicit TransportWideSequenceNumberObserver(bool expect_sequence_number)
154*d9f75844SAndroid Build Coastguard Worker       : AudioSendTest(), expect_sequence_number_(expect_sequence_number) {
155*d9f75844SAndroid Build Coastguard Worker     extensions_.Register<TransportSequenceNumber>(
156*d9f75844SAndroid Build Coastguard Worker         kTransportSequenceNumberExtensionId);
157*d9f75844SAndroid Build Coastguard Worker   }
158*d9f75844SAndroid Build Coastguard Worker 
159*d9f75844SAndroid Build Coastguard Worker  private:
OnSendRtp(const uint8_t * packet,size_t length)160*d9f75844SAndroid Build Coastguard Worker   Action OnSendRtp(const uint8_t* packet, size_t length) override {
161*d9f75844SAndroid Build Coastguard Worker     RtpPacket rtp_packet(&extensions_);
162*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(rtp_packet.Parse(packet, length));
163*d9f75844SAndroid Build Coastguard Worker 
164*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(rtp_packet.HasExtension<TransportSequenceNumber>(),
165*d9f75844SAndroid Build Coastguard Worker               expect_sequence_number_);
166*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(rtp_packet.HasExtension<TransmissionOffset>());
167*d9f75844SAndroid Build Coastguard Worker     EXPECT_FALSE(rtp_packet.HasExtension<AbsoluteSendTime>());
168*d9f75844SAndroid Build Coastguard Worker 
169*d9f75844SAndroid Build Coastguard Worker     observation_complete_.Set();
170*d9f75844SAndroid Build Coastguard Worker 
171*d9f75844SAndroid Build Coastguard Worker     return SEND_PACKET;
172*d9f75844SAndroid Build Coastguard Worker   }
173*d9f75844SAndroid Build Coastguard Worker 
ModifyAudioConfigs(AudioSendStream::Config * send_config,std::vector<AudioReceiveStreamInterface::Config> * receive_configs)174*d9f75844SAndroid Build Coastguard Worker   void ModifyAudioConfigs(AudioSendStream::Config* send_config,
175*d9f75844SAndroid Build Coastguard Worker                           std::vector<AudioReceiveStreamInterface::Config>*
176*d9f75844SAndroid Build Coastguard Worker                               receive_configs) override {
177*d9f75844SAndroid Build Coastguard Worker     send_config->rtp.extensions.clear();
178*d9f75844SAndroid Build Coastguard Worker     send_config->rtp.extensions.push_back(
179*d9f75844SAndroid Build Coastguard Worker         RtpExtension(RtpExtension::kTransportSequenceNumberUri,
180*d9f75844SAndroid Build Coastguard Worker                      kTransportSequenceNumberExtensionId));
181*d9f75844SAndroid Build Coastguard Worker   }
182*d9f75844SAndroid Build Coastguard Worker 
PerformTest()183*d9f75844SAndroid Build Coastguard Worker   void PerformTest() override {
184*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
185*d9f75844SAndroid Build Coastguard Worker   }
186*d9f75844SAndroid Build Coastguard Worker   const bool expect_sequence_number_;
187*d9f75844SAndroid Build Coastguard Worker   RtpHeaderExtensionMap extensions_;
188*d9f75844SAndroid Build Coastguard Worker };
189*d9f75844SAndroid Build Coastguard Worker 
TEST_F(AudioSendStreamCallTest,SendsTransportWideSequenceNumbersInFieldTrial)190*d9f75844SAndroid Build Coastguard Worker TEST_F(AudioSendStreamCallTest, SendsTransportWideSequenceNumbersInFieldTrial) {
191*d9f75844SAndroid Build Coastguard Worker   TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/true);
192*d9f75844SAndroid Build Coastguard Worker   RunBaseTest(&test);
193*d9f75844SAndroid Build Coastguard Worker }
194*d9f75844SAndroid Build Coastguard Worker 
TEST_F(AudioSendStreamCallTest,SendDtmf)195*d9f75844SAndroid Build Coastguard Worker TEST_F(AudioSendStreamCallTest, SendDtmf) {
196*d9f75844SAndroid Build Coastguard Worker   static const uint8_t kDtmfPayloadType = 120;
197*d9f75844SAndroid Build Coastguard Worker   static const int kDtmfPayloadFrequency = 8000;
198*d9f75844SAndroid Build Coastguard Worker   static const int kDtmfEventFirst = 12;
199*d9f75844SAndroid Build Coastguard Worker   static const int kDtmfEventLast = 31;
200*d9f75844SAndroid Build Coastguard Worker   static const int kDtmfDuration = 50;
201*d9f75844SAndroid Build Coastguard Worker   class DtmfObserver : public AudioSendTest {
202*d9f75844SAndroid Build Coastguard Worker    public:
203*d9f75844SAndroid Build Coastguard Worker     DtmfObserver() = default;
204*d9f75844SAndroid Build Coastguard Worker 
205*d9f75844SAndroid Build Coastguard Worker    private:
206*d9f75844SAndroid Build Coastguard Worker     Action OnSendRtp(const uint8_t* packet, size_t length) override {
207*d9f75844SAndroid Build Coastguard Worker       RtpPacket rtp_packet;
208*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(rtp_packet.Parse(packet, length));
209*d9f75844SAndroid Build Coastguard Worker 
210*d9f75844SAndroid Build Coastguard Worker       if (rtp_packet.PayloadType() == kDtmfPayloadType) {
211*d9f75844SAndroid Build Coastguard Worker         EXPECT_EQ(rtp_packet.headers_size(), 12u);
212*d9f75844SAndroid Build Coastguard Worker         EXPECT_EQ(rtp_packet.size(), 16u);
213*d9f75844SAndroid Build Coastguard Worker         const int event = rtp_packet.payload()[0];
214*d9f75844SAndroid Build Coastguard Worker         if (event != expected_dtmf_event_) {
215*d9f75844SAndroid Build Coastguard Worker           ++expected_dtmf_event_;
216*d9f75844SAndroid Build Coastguard Worker           EXPECT_EQ(event, expected_dtmf_event_);
217*d9f75844SAndroid Build Coastguard Worker           if (expected_dtmf_event_ == kDtmfEventLast) {
218*d9f75844SAndroid Build Coastguard Worker             observation_complete_.Set();
219*d9f75844SAndroid Build Coastguard Worker           }
220*d9f75844SAndroid Build Coastguard Worker         }
221*d9f75844SAndroid Build Coastguard Worker       }
222*d9f75844SAndroid Build Coastguard Worker 
223*d9f75844SAndroid Build Coastguard Worker       return SEND_PACKET;
224*d9f75844SAndroid Build Coastguard Worker     }
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker     void OnAudioStreamsCreated(AudioSendStream* send_stream,
227*d9f75844SAndroid Build Coastguard Worker                                const std::vector<AudioReceiveStreamInterface*>&
228*d9f75844SAndroid Build Coastguard Worker                                    receive_streams) override {
229*d9f75844SAndroid Build Coastguard Worker       // Need to start stream here, else DTMF events are dropped.
230*d9f75844SAndroid Build Coastguard Worker       send_stream->Start();
231*d9f75844SAndroid Build Coastguard Worker       for (int event = kDtmfEventFirst; event <= kDtmfEventLast; ++event) {
232*d9f75844SAndroid Build Coastguard Worker         send_stream->SendTelephoneEvent(kDtmfPayloadType, kDtmfPayloadFrequency,
233*d9f75844SAndroid Build Coastguard Worker                                         event, kDtmfDuration);
234*d9f75844SAndroid Build Coastguard Worker       }
235*d9f75844SAndroid Build Coastguard Worker     }
236*d9f75844SAndroid Build Coastguard Worker 
237*d9f75844SAndroid Build Coastguard Worker     void PerformTest() override {
238*d9f75844SAndroid Build Coastguard Worker       EXPECT_TRUE(Wait()) << "Timed out while waiting for DTMF stream.";
239*d9f75844SAndroid Build Coastguard Worker     }
240*d9f75844SAndroid Build Coastguard Worker 
241*d9f75844SAndroid Build Coastguard Worker     int expected_dtmf_event_ = kDtmfEventFirst;
242*d9f75844SAndroid Build Coastguard Worker   } test;
243*d9f75844SAndroid Build Coastguard Worker 
244*d9f75844SAndroid Build Coastguard Worker   RunBaseTest(&test);
245*d9f75844SAndroid Build Coastguard Worker }
246*d9f75844SAndroid Build Coastguard Worker 
247*d9f75844SAndroid Build Coastguard Worker }  // namespace test
248*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
249