blob: e042685e66f5d50d272266dd5ae4680b81b298f5 [file] [log] [blame]
solenberg18f54272017-09-15 16:56:081/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Elad Alond8d32482019-02-18 22:45:5711#include <string>
12#include <utility>
13#include <vector>
14
Danil Chapovalov1b4e4bf2019-12-06 11:34:5715#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
16#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
17#include "modules/rtp_rtcp/source/rtp_packet.h"
solenberg18f54272017-09-15 16:56:0818#include "test/call_test.h"
Per Kjellander914351d2019-02-15 09:54:5519#include "test/field_trial.h"
solenberg18f54272017-09-15 16:56:0820#include "test/gtest.h"
21#include "test/rtcp_packet_parser.h"
Artem Titov8a9f3a82023-04-25 07:56:4922#include "test/video_test_constants.h"
solenberg18f54272017-09-15 16:56:0823
24namespace webrtc {
25namespace test {
26namespace {
27
Elad Alond8d32482019-02-18 22:45:5728enum : int { // The first valid value is 1.
29 kAudioLevelExtensionId = 1,
30 kTransportSequenceNumberExtensionId,
31};
32
solenberg18f54272017-09-15 16:56:0833class AudioSendTest : public SendTest {
34 public:
Artem Titov8a9f3a82023-04-25 07:56:4935 AudioSendTest() : SendTest(VideoTestConstants::kDefaultTimeout) {}
solenberg18f54272017-09-15 16:56:0836
Yves Gerey665174f2018-06-19 13:03:0537 size_t GetNumVideoStreams() const override { return 0; }
38 size_t GetNumAudioStreams() const override { return 1; }
39 size_t GetNumFlexfecStreams() const override { return 0; }
solenberg18f54272017-09-15 16:56:0840};
41} // namespace
42
43using AudioSendStreamCallTest = CallTest;
44
45TEST_F(AudioSendStreamCallTest, SupportsCName) {
46 static std::string kCName = "PjqatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
47 class CNameObserver : public AudioSendTest {
48 public:
49 CNameObserver() = default;
50
51 private:
Harald Alvestrandd43af912023-08-15 11:41:4552 Action OnSendRtcp(rtc::ArrayView<const uint8_t> packet) override {
solenberg18f54272017-09-15 16:56:0853 RtcpPacketParser parser;
Harald Alvestrandd43af912023-08-15 11:41:4554 EXPECT_TRUE(parser.Parse(packet));
solenberg18f54272017-09-15 16:56:0855 if (parser.sdes()->num_packets() > 0) {
56 EXPECT_EQ(1u, parser.sdes()->chunks().size());
57 EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname);
58
59 observation_complete_.Set();
60 }
61
62 return SEND_PACKET;
63 }
64
Tommi3176ef72022-05-22 18:47:2865 void ModifyAudioConfigs(AudioSendStream::Config* send_config,
66 std::vector<AudioReceiveStreamInterface::Config>*
Dor Henb52416e2024-10-27 13:59:5167 /* receive_configs */) override {
solenberg18f54272017-09-15 16:56:0868 send_config->rtp.c_name = kCName;
69 }
70
71 void PerformTest() override {
72 EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
73 }
74 } test;
75
76 RunBaseTest(&test);
77}
78
79TEST_F(AudioSendStreamCallTest, NoExtensionsByDefault) {
80 class NoExtensionsObserver : public AudioSendTest {
81 public:
82 NoExtensionsObserver() = default;
83
84 private:
Harald Alvestrandd43af912023-08-15 11:41:4585 Action OnSendRtp(rtc::ArrayView<const uint8_t> packet) override {
Danil Chapovalov1b4e4bf2019-12-06 11:34:5786 RtpPacket rtp_packet;
Harald Alvestrandd43af912023-08-15 11:41:4587 EXPECT_TRUE(rtp_packet.Parse(packet)); // rtp packet is valid.
Danil Chapovalov1b4e4bf2019-12-06 11:34:5788 EXPECT_EQ(packet[0] & 0b0001'0000, 0); // extension bit not set.
solenberg18f54272017-09-15 16:56:0889
solenberg18f54272017-09-15 16:56:0890 observation_complete_.Set();
solenberg18f54272017-09-15 16:56:0891 return SEND_PACKET;
92 }
93
Tommi3176ef72022-05-22 18:47:2894 void ModifyAudioConfigs(AudioSendStream::Config* send_config,
95 std::vector<AudioReceiveStreamInterface::Config>*
Dor Henb52416e2024-10-27 13:59:5196 /* receive_configs */) override {
solenberg18f54272017-09-15 16:56:0897 send_config->rtp.extensions.clear();
98 }
99
100 void PerformTest() override {
101 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
102 }
103 } test;
104
105 RunBaseTest(&test);
106}
107
108TEST_F(AudioSendStreamCallTest, SupportsAudioLevel) {
109 class AudioLevelObserver : public AudioSendTest {
110 public:
111 AudioLevelObserver() : AudioSendTest() {
Joachim Reiersen4a974882024-02-22 19:26:04112 extensions_.Register<AudioLevelExtension>(kAudioLevelExtensionId);
solenberg18f54272017-09-15 16:56:08113 }
114
Harald Alvestrandd43af912023-08-15 11:41:45115 Action OnSendRtp(rtc::ArrayView<const uint8_t> packet) override {
Danil Chapovalov1b4e4bf2019-12-06 11:34:57116 RtpPacket rtp_packet(&extensions_);
Harald Alvestrandd43af912023-08-15 11:41:45117 EXPECT_TRUE(rtp_packet.Parse(packet));
solenberg18f54272017-09-15 16:56:08118
Joachim Reiersen5075cb42024-03-22 01:08:54119 AudioLevel audio_level;
120 EXPECT_TRUE(rtp_packet.GetExtension<AudioLevelExtension>(&audio_level));
121 if (audio_level.level() != 0) {
solenberg18f54272017-09-15 16:56:08122 // Wait for at least one packet with a non-zero level.
123 observation_complete_.Set();
124 } else {
Mirko Bonadei675513b2017-11-09 10:09:25125 RTC_LOG(LS_WARNING) << "Got a packet with zero audioLevel - waiting"
126 " for another packet...";
solenberg18f54272017-09-15 16:56:08127 }
128
129 return SEND_PACKET;
130 }
131
Tommi3176ef72022-05-22 18:47:28132 void ModifyAudioConfigs(AudioSendStream::Config* send_config,
133 std::vector<AudioReceiveStreamInterface::Config>*
Dor Henb52416e2024-10-27 13:59:51134 /* receive_configs */) override {
solenberg18f54272017-09-15 16:56:08135 send_config->rtp.extensions.clear();
Elad Alond8d32482019-02-18 22:45:57136 send_config->rtp.extensions.push_back(
137 RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelExtensionId));
solenberg18f54272017-09-15 16:56:08138 }
139
140 void PerformTest() override {
141 EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
142 }
Danil Chapovalov1b4e4bf2019-12-06 11:34:57143
144 private:
145 RtpHeaderExtensionMap extensions_;
solenberg18f54272017-09-15 16:56:08146 } test;
147
148 RunBaseTest(&test);
149}
150
Per Kjellander914351d2019-02-15 09:54:55151class TransportWideSequenceNumberObserver : public AudioSendTest {
152 public:
153 explicit TransportWideSequenceNumberObserver(bool expect_sequence_number)
154 : AudioSendTest(), expect_sequence_number_(expect_sequence_number) {
Danil Chapovalov1b4e4bf2019-12-06 11:34:57155 extensions_.Register<TransportSequenceNumber>(
156 kTransportSequenceNumberExtensionId);
Per Kjellander914351d2019-02-15 09:54:55157 }
solenberg18f54272017-09-15 16:56:08158
Per Kjellander914351d2019-02-15 09:54:55159 private:
Harald Alvestrandd43af912023-08-15 11:41:45160 Action OnSendRtp(rtc::ArrayView<const uint8_t> packet) override {
Danil Chapovalov1b4e4bf2019-12-06 11:34:57161 RtpPacket rtp_packet(&extensions_);
Harald Alvestrandd43af912023-08-15 11:41:45162 EXPECT_TRUE(rtp_packet.Parse(packet));
solenberg18f54272017-09-15 16:56:08163
Danil Chapovalov1b4e4bf2019-12-06 11:34:57164 EXPECT_EQ(rtp_packet.HasExtension<TransportSequenceNumber>(),
Per Kjellander914351d2019-02-15 09:54:55165 expect_sequence_number_);
Danil Chapovalov1b4e4bf2019-12-06 11:34:57166 EXPECT_FALSE(rtp_packet.HasExtension<TransmissionOffset>());
167 EXPECT_FALSE(rtp_packet.HasExtension<AbsoluteSendTime>());
solenberg18f54272017-09-15 16:56:08168
Per Kjellander914351d2019-02-15 09:54:55169 observation_complete_.Set();
solenberg18f54272017-09-15 16:56:08170
Per Kjellander914351d2019-02-15 09:54:55171 return SEND_PACKET;
172 }
solenberg18f54272017-09-15 16:56:08173
Tommi3176ef72022-05-22 18:47:28174 void ModifyAudioConfigs(AudioSendStream::Config* send_config,
175 std::vector<AudioReceiveStreamInterface::Config>*
Dor Henb52416e2024-10-27 13:59:51176 /* receive_configs */) override {
Per Kjellander914351d2019-02-15 09:54:55177 send_config->rtp.extensions.clear();
178 send_config->rtp.extensions.push_back(
179 RtpExtension(RtpExtension::kTransportSequenceNumberUri,
180 kTransportSequenceNumberExtensionId));
181 }
solenberg18f54272017-09-15 16:56:08182
Per Kjellander914351d2019-02-15 09:54:55183 void PerformTest() override {
184 EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
185 }
186 const bool expect_sequence_number_;
Danil Chapovalov1b4e4bf2019-12-06 11:34:57187 RtpHeaderExtensionMap extensions_;
Per Kjellander914351d2019-02-15 09:54:55188};
solenberg18f54272017-09-15 16:56:08189
Per Kjellander914351d2019-02-15 09:54:55190TEST_F(AudioSendStreamCallTest, SendsTransportWideSequenceNumbersInFieldTrial) {
Per Kjellander914351d2019-02-15 09:54:55191 TransportWideSequenceNumberObserver test(/*expect_sequence_number=*/true);
192 RunBaseTest(&test);
193}
194
solenberg18f54272017-09-15 16:56:08195TEST_F(AudioSendStreamCallTest, SendDtmf) {
196 static const uint8_t kDtmfPayloadType = 120;
197 static const int kDtmfPayloadFrequency = 8000;
198 static const int kDtmfEventFirst = 12;
199 static const int kDtmfEventLast = 31;
200 static const int kDtmfDuration = 50;
201 class DtmfObserver : public AudioSendTest {
202 public:
203 DtmfObserver() = default;
204
205 private:
Harald Alvestrandd43af912023-08-15 11:41:45206 Action OnSendRtp(rtc::ArrayView<const uint8_t> packet) override {
Danil Chapovalov1b4e4bf2019-12-06 11:34:57207 RtpPacket rtp_packet;
Harald Alvestrandd43af912023-08-15 11:41:45208 EXPECT_TRUE(rtp_packet.Parse(packet));
solenberg18f54272017-09-15 16:56:08209
Danil Chapovalov1b4e4bf2019-12-06 11:34:57210 if (rtp_packet.PayloadType() == kDtmfPayloadType) {
211 EXPECT_EQ(rtp_packet.headers_size(), 12u);
212 EXPECT_EQ(rtp_packet.size(), 16u);
213 const int event = rtp_packet.payload()[0];
solenberg18f54272017-09-15 16:56:08214 if (event != expected_dtmf_event_) {
215 ++expected_dtmf_event_;
216 EXPECT_EQ(event, expected_dtmf_event_);
217 if (expected_dtmf_event_ == kDtmfEventLast) {
218 observation_complete_.Set();
219 }
220 }
221 }
222
223 return SEND_PACKET;
224 }
225
Tommi3176ef72022-05-22 18:47:28226 void OnAudioStreamsCreated(AudioSendStream* send_stream,
227 const std::vector<AudioReceiveStreamInterface*>&
Dor Henb52416e2024-10-27 13:59:51228 /* receive_streams */) override {
solenberg18f54272017-09-15 16:56:08229 // Need to start stream here, else DTMF events are dropped.
230 send_stream->Start();
231 for (int event = kDtmfEventFirst; event <= kDtmfEventLast; ++event) {
232 send_stream->SendTelephoneEvent(kDtmfPayloadType, kDtmfPayloadFrequency,
233 event, kDtmfDuration);
234 }
235 }
236
237 void PerformTest() override {
238 EXPECT_TRUE(Wait()) << "Timed out while waiting for DTMF stream.";
239 }
240
241 int expected_dtmf_event_ = kDtmfEventFirst;
242 } test;
243
244 RunBaseTest(&test);
245}
246
247} // namespace test
248} // namespace webrtc