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