Move RtpSenderAudioTest to its own file
Update RtpSenderAudioTest to call methods on RTPSenderAudio rather
than RTPSender, when possible. In particular, avoid
RTPSender::SendOutgoingData. Drop parameterization on the
WebRTC-SendSideBwe-WithOverhead field trial, since that appears
unrelated to these tests.
Also delete some unused parts of the RtpSender test.
Bug: webrtc:7135
Change-Id: I535bf48bb1720e2727f4a62fa3e49b2bb84394a0
Reviewed-on: https://webrtc-review.googlesource.com/c/120920
Reviewed-by: Minyue Li <minyue@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26516}
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 69fa724..cda54dd 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -411,6 +411,7 @@
"source/rtp_packet_history_unittest.cc",
"source/rtp_packet_unittest.cc",
"source/rtp_rtcp_impl_unittest.cc",
+ "source/rtp_sender_audio_unittest.cc",
"source/rtp_sender_unittest.cc",
"source/rtp_utility_unittest.cc",
"source/time_util_unittest.cc",
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc
new file mode 100644
index 0000000..b1c46c1
--- /dev/null
+++ b/modules/rtp_rtcp/source/rtp_sender_audio_unittest.cc
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include <vector>
+
+#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
+#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
+#include "modules/rtp_rtcp/source/rtp_sender.h"
+#include "modules/rtp_rtcp/source/rtp_sender_audio.h"
+#include "test/gmock.h"
+#include "test/gtest.h"
+
+namespace webrtc {
+
+namespace {
+const int kAudioLevelExtensionId = 9;
+const uint16_t kSeqNum = 33;
+const uint32_t kSsrc = 725242;
+const uint8_t kAudioLevel = 0x5a;
+const uint64_t kStartTime = 123456789;
+
+using ::testing::_;
+using ::testing::ElementsAreArray;
+
+class LoopbackTransportTest : public webrtc::Transport {
+ public:
+ LoopbackTransportTest() {
+ receivers_extensions_.Register(kRtpExtensionAudioLevel,
+ kAudioLevelExtensionId);
+ }
+
+ bool SendRtp(const uint8_t* data,
+ size_t len,
+ const PacketOptions& /*options*/) override {
+ sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
+ EXPECT_TRUE(sent_packets_.back().Parse(data, len));
+ return true;
+ }
+ bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
+ const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
+ int packets_sent() { return sent_packets_.size(); }
+
+ private:
+ RtpHeaderExtensionMap receivers_extensions_;
+ std::vector<RtpPacketReceived> sent_packets_;
+};
+
+} // namespace
+
+class RtpSenderAudioTest : public ::testing::Test {
+ public:
+ RtpSenderAudioTest()
+ : fake_clock_(kStartTime),
+ rtp_sender_(true,
+ &fake_clock_,
+ &transport_,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ nullptr,
+ false,
+ nullptr,
+ false,
+ false),
+ rtp_sender_audio_(&fake_clock_, &rtp_sender_) {
+ rtp_sender_.SetSSRC(kSsrc);
+ rtp_sender_.SetSequenceNumber(kSeqNum);
+ }
+
+ SimulatedClock fake_clock_;
+ LoopbackTransportTest transport_;
+ RTPSender rtp_sender_;
+ RTPSenderAudio rtp_sender_audio_;
+};
+
+TEST_F(RtpSenderAudioTest, SendAudio) {
+ const char payload_name[] = "PAYLOAD_NAME";
+ const uint8_t payload_type = 127;
+ ASSERT_EQ(0, rtp_sender_audio_.RegisterAudioPayload(
+ payload_name, payload_type, 48000, 0, 1500));
+ uint8_t payload[] = {47, 11, 32, 93, 89};
+
+ ASSERT_TRUE(rtp_sender_audio_.SendAudio(kAudioFrameCN, payload_type, 4321,
+ payload, sizeof(payload)));
+
+ auto sent_payload = transport_.last_sent_packet().payload();
+ EXPECT_THAT(sent_payload, ElementsAreArray(payload));
+}
+
+TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
+ EXPECT_EQ(0, rtp_sender_audio_.SetAudioLevel(kAudioLevel));
+ EXPECT_EQ(0, rtp_sender_.RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
+ kAudioLevelExtensionId));
+
+ const char payload_name[] = "PAYLOAD_NAME";
+ const uint8_t payload_type = 127;
+ ASSERT_EQ(0, rtp_sender_audio_.RegisterAudioPayload(
+ payload_name, payload_type, 48000, 0, 1500));
+
+ uint8_t payload[] = {47, 11, 32, 93, 89};
+
+ ASSERT_TRUE(rtp_sender_audio_.SendAudio(kAudioFrameCN, payload_type, 4321,
+ payload, sizeof(payload)));
+
+ auto sent_payload = transport_.last_sent_packet().payload();
+ EXPECT_THAT(sent_payload, ElementsAreArray(payload));
+ // Verify AudioLevel extension.
+ bool voice_activity;
+ uint8_t audio_level;
+ EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>(
+ &voice_activity, &audio_level));
+ EXPECT_EQ(kAudioLevel, audio_level);
+ EXPECT_FALSE(voice_activity);
+}
+
+// As RFC4733, named telephone events are carried as part of the audio stream
+// and must use the same sequence number and timestamp base as the regular
+// audio channel.
+// This test checks the marker bit for the first packet and the consequent
+// packets of the same telephone event. Since it is specifically for DTMF
+// events, ignoring audio packets and sending kEmptyFrame instead of those.
+TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) {
+ const char* kDtmfPayloadName = "telephone-event";
+ const uint32_t kPayloadFrequency = 8000;
+ const uint8_t kPayloadType = 126;
+ ASSERT_EQ(0, rtp_sender_audio_.RegisterAudioPayload(
+ kDtmfPayloadName, kPayloadType, kPayloadFrequency, 0, 0));
+ // For Telephone events, payload is not added to the registered payload list,
+ // it will register only the payload used for audio stream.
+ // Registering the payload again for audio stream with different payload name.
+ const char* kPayloadName = "payload_name";
+ ASSERT_EQ(0, rtp_sender_audio_.RegisterAudioPayload(
+ kPayloadName, kPayloadType, kPayloadFrequency, 1, 0));
+ // Start time is arbitrary.
+ uint32_t capture_timestamp = fake_clock_.TimeInMilliseconds();
+ // DTMF event key=9, duration=500 and attenuationdB=10
+ rtp_sender_audio_.SendTelephoneEvent(9, 500, 10);
+ // During start, it takes the starting timestamp as last sent timestamp.
+ // The duration is calculated as the difference of current and last sent
+ // timestamp. So for first call it will skip since the duration is zero.
+ ASSERT_TRUE(rtp_sender_audio_.SendAudio(kEmptyFrame, kPayloadType,
+ capture_timestamp, nullptr, 0));
+ // DTMF Sample Length is (Frequency/1000) * Duration.
+ // So in this case, it is (8000/1000) * 500 = 4000.
+ // Sending it as two packets.
+ ASSERT_TRUE(rtp_sender_audio_.SendAudio(
+ kEmptyFrame, kPayloadType, capture_timestamp + 2000, nullptr, 0));
+
+ // Marker Bit should be set to 1 for first packet.
+ EXPECT_TRUE(transport_.last_sent_packet().Marker());
+
+ ASSERT_TRUE(rtp_sender_audio_.SendAudio(
+ kEmptyFrame, kPayloadType, capture_timestamp + 4000, nullptr, 0));
+ // Marker Bit should be set to 0 for rest of the packets.
+ EXPECT_FALSE(transport_.last_sent_packet().Marker());
+}
+
+} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index 0effd01..c421cf9 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -31,7 +31,6 @@
#include "modules/rtp_rtcp/source/rtp_sender_video.h"
#include "modules/rtp_rtcp/source/rtp_utility.h"
#include "rtc_base/arraysize.h"
-#include "rtc_base/buffer.h"
#include "rtc_base/rate_limiter.h"
#include "test/field_trial.h"
#include "test/gmock.h"
@@ -57,9 +56,7 @@
const uint16_t kSeqNum = 33;
const uint32_t kSsrc = 725242;
const int kMaxPacketLength = 1500;
-const uint8_t kAudioLevel = 0x5a;
const uint16_t kTransportSequenceNumber = 0xaabbu;
-const int kAudioPayload = 103;
const uint64_t kStartTime = 123456789;
const size_t kMaxPaddingSize = 224u;
const size_t kGenericHeaderLength = 1;
@@ -179,7 +176,6 @@
mock_paced_sender_(),
retransmission_rate_limiter_(&fake_clock_, 1000),
rtp_sender_(),
- payload_(kPayload),
transport_(),
kMarkerBit(true),
field_trials_(GetParam() ? "WebRTC-SendSideBwe-WithOverhead/Enabled/"
@@ -207,31 +203,10 @@
testing::StrictMock<MockTransportFeedbackObserver> feedback_observer_;
RateLimiter retransmission_rate_limiter_;
std::unique_ptr<RTPSender> rtp_sender_;
- int payload_;
LoopbackTransportTest transport_;
const bool kMarkerBit;
test::ScopedFieldTrials field_trials_;
- void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) {
- VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0);
- }
-
- void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) {
- VerifyRTPHeaderCommon(rtp_header, marker_bit, 0);
- }
-
- void VerifyRTPHeaderCommon(const RTPHeader& rtp_header,
- bool marker_bit,
- uint8_t number_of_csrcs) {
- EXPECT_EQ(marker_bit, rtp_header.markerBit);
- EXPECT_EQ(payload_, rtp_header.payloadType);
- EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
- EXPECT_EQ(kTimestamp, rtp_header.timestamp);
- EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
- EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs);
- EXPECT_EQ(0U, rtp_header.paddingLength);
- }
-
std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
bool marker_bit,
uint32_t timestamp,
@@ -1549,21 +1524,6 @@
rtp_sender_.reset();
}
-class RtpSenderAudioTest : public RtpSenderTest {
- protected:
- RtpSenderAudioTest() {}
-
- void SetUp() override {
- payload_ = kAudioPayload;
- rtp_sender_.reset(new RTPSender(
- true, &fake_clock_, &transport_, nullptr, nullptr, nullptr, nullptr,
- nullptr, nullptr, nullptr, nullptr, &retransmission_rate_limiter_,
- nullptr, false, nullptr, false, false));
- rtp_sender_->SetSSRC(kSsrc);
- rtp_sender_->SetSequenceNumber(kSeqNum);
- }
-};
-
TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
class TestCallback : public StreamDataCountersCallback {
public:
@@ -1663,94 +1623,6 @@
rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
}
-TEST_P(RtpSenderAudioTest, SendAudio) {
- const char payload_name[] = "PAYLOAD_NAME";
- const uint8_t payload_type = 127;
- ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
- 0, 1500));
- uint8_t payload[] = {47, 11, 32, 93, 89};
-
- RTPVideoHeader video_header;
- ASSERT_TRUE(rtp_sender_->SendOutgoingData(
- kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
- nullptr, &video_header, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
- auto sent_payload = transport_.last_sent_packet().payload();
- EXPECT_THAT(sent_payload, ElementsAreArray(payload));
-}
-
-TEST_P(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
- EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
- EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
- kAudioLevelExtensionId));
-
- const char payload_name[] = "PAYLOAD_NAME";
- const uint8_t payload_type = 127;
- ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
- 0, 1500));
- uint8_t payload[] = {47, 11, 32, 93, 89};
-
- RTPVideoHeader video_header;
- ASSERT_TRUE(rtp_sender_->SendOutgoingData(
- kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
- nullptr, &video_header, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
- auto sent_payload = transport_.last_sent_packet().payload();
- EXPECT_THAT(sent_payload, ElementsAreArray(payload));
- // Verify AudioLevel extension.
- bool voice_activity;
- uint8_t audio_level;
- EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>(
- &voice_activity, &audio_level));
- EXPECT_EQ(kAudioLevel, audio_level);
- EXPECT_FALSE(voice_activity);
-}
-
-// As RFC4733, named telephone events are carried as part of the audio stream
-// and must use the same sequence number and timestamp base as the regular
-// audio channel.
-// This test checks the marker bit for the first packet and the consequent
-// packets of the same telephone event. Since it is specifically for DTMF
-// events, ignoring audio packets and sending kEmptyFrame instead of those.
-TEST_P(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) {
- const char* kDtmfPayloadName = "telephone-event";
- const uint32_t kPayloadFrequency = 8000;
- const uint8_t kPayloadType = 126;
- ASSERT_EQ(0, rtp_sender_->RegisterPayload(kDtmfPayloadName, kPayloadType,
- kPayloadFrequency, 0, 0));
- // For Telephone events, payload is not added to the registered payload list,
- // it will register only the payload used for audio stream.
- // Registering the payload again for audio stream with different payload name.
- const char* kPayloadName = "payload_name";
- ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType,
- kPayloadFrequency, 1, 0));
- int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
- // DTMF event key=9, duration=500 and attenuationdB=10
- rtp_sender_->SendTelephoneEvent(9, 500, 10);
- // During start, it takes the starting timestamp as last sent timestamp.
- // The duration is calculated as the difference of current and last sent
- // timestamp. So for first call it will skip since the duration is zero.
- RTPVideoHeader video_header;
- ASSERT_TRUE(rtp_sender_->SendOutgoingData(
- kEmptyFrame, kPayloadType, capture_time_ms, 0, nullptr, 0, nullptr,
- &video_header, nullptr, kDefaultExpectedRetransmissionTimeMs));
- // DTMF Sample Length is (Frequency/1000) * Duration.
- // So in this case, it is (8000/1000) * 500 = 4000.
- // Sending it as two packets.
- ASSERT_TRUE(rtp_sender_->SendOutgoingData(
- kEmptyFrame, kPayloadType, capture_time_ms + 2000, 0, nullptr, 0, nullptr,
- &video_header, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
- // Marker Bit should be set to 1 for first packet.
- EXPECT_TRUE(transport_.last_sent_packet().Marker());
-
- ASSERT_TRUE(rtp_sender_->SendOutgoingData(
- kEmptyFrame, kPayloadType, capture_time_ms + 4000, 0, nullptr, 0, nullptr,
- &video_header, nullptr, kDefaultExpectedRetransmissionTimeMs));
- // Marker Bit should be set to 0 for rest of the packets.
- EXPECT_FALSE(transport_.last_sent_packet().Marker());
-}
-
TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
const char* kPayloadName = "GENERIC";
const uint8_t kPayloadType = 127;
@@ -2295,7 +2167,5 @@
INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
RtpSenderVideoTest,
::testing::Bool());
-INSTANTIATE_TEST_SUITE_P(WithAndWithoutOverhead,
- RtpSenderAudioTest,
- ::testing::Bool());
+
} // namespace webrtc