Index: webrtc/modules/audio_coding/neteq/neteq_unittest.cc |
diff --git a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc |
index 68a4921147a788b82cb19db4ffe56c10edfeabe2..03a788eed0bd7587980d8e273ae0f267253f7f4d 100644 |
--- a/webrtc/modules/audio_coding/neteq/neteq_unittest.cc |
+++ b/webrtc/modules/audio_coding/neteq/neteq_unittest.cc |
@@ -270,8 +270,6 @@ class NetEqDecodingTest : public ::testing::Test { |
void DuplicateCng(); |
- rtc::Optional<uint32_t> PlayoutTimestamp(); |
- |
NetEq* neteq_; |
NetEq::Config config_; |
std::unique_ptr<test::RtpFileSource> rtp_source_; |
@@ -644,7 +642,7 @@ void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor, |
} |
EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); |
- rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp(); |
+ rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp(); |
ASSERT_TRUE(playout_timestamp); |
int32_t delay_before = timestamp - *playout_timestamp; |
@@ -736,7 +734,7 @@ void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor, |
// Check that the speech starts again within reasonable time. |
double time_until_speech_returns_ms = t_ms - speech_restart_time_ms; |
EXPECT_LT(time_until_speech_returns_ms, max_time_to_speech_ms); |
- playout_timestamp = PlayoutTimestamp(); |
+ playout_timestamp = neteq_->GetPlayoutTimestamp(); |
ASSERT_TRUE(playout_timestamp); |
int32_t delay_after = timestamp - *playout_timestamp; |
// Compare delay before and after, and make sure it differs less than 20 ms. |
@@ -1128,7 +1126,7 @@ void NetEqDecodingTest::WrapTest(uint16_t start_seq_no, |
ASSERT_EQ(1u, output.num_channels_); |
// Expect delay (in samples) to be less than 2 packets. |
- rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp(); |
+ rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp(); |
ASSERT_TRUE(playout_timestamp); |
EXPECT_LE(timestamp - *playout_timestamp, |
static_cast<uint32_t>(kSamples * 2)); |
@@ -1207,7 +1205,8 @@ void NetEqDecodingTest::DuplicateCng() { |
ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); |
ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); |
EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); |
- EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG. |
+ EXPECT_FALSE( |
+ neteq_->GetPlayoutTimestamp()); // Returns empty value during CNG. |
EXPECT_EQ(timestamp - algorithmic_delay_samples, |
out_frame_.timestamp_ + out_frame_.samples_per_channel_); |
@@ -1223,7 +1222,8 @@ void NetEqDecodingTest::DuplicateCng() { |
ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); |
ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); |
EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_); |
- EXPECT_FALSE(PlayoutTimestamp()); // Returns empty value during CNG. |
+ EXPECT_FALSE( |
+ neteq_->GetPlayoutTimestamp()); // Returns empty value during CNG. |
EXPECT_EQ(timestamp - algorithmic_delay_samples, |
out_frame_.timestamp_ + out_frame_.samples_per_channel_); |
} |
@@ -1238,16 +1238,12 @@ void NetEqDecodingTest::DuplicateCng() { |
ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted)); |
ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_); |
EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_); |
- rtc::Optional<uint32_t> playout_timestamp = PlayoutTimestamp(); |
+ rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp(); |
ASSERT_TRUE(playout_timestamp); |
EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples, |
*playout_timestamp); |
} |
-rtc::Optional<uint32_t> NetEqDecodingTest::PlayoutTimestamp() { |
- return neteq_->GetPlayoutTimestamp(); |
-} |
- |
TEST_F(NetEqDecodingTest, DiscardDuplicateCng) { DuplicateCng(); } |
TEST_F(NetEqDecodingTest, CngFirst) { |
@@ -1590,4 +1586,65 @@ TEST_F(NetEqDecodingTestTwoInstances, CompareMutedStateOnOff) { |
EXPECT_FALSE(muted); |
} |
+TEST_F(NetEqDecodingTest, LastDecodedTimestampsEmpty) { |
+ EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty()); |
+ |
+ // Pull out data once. |
+ AudioFrame output; |
+ bool muted; |
+ ASSERT_EQ(0, neteq_->GetAudio(&output, &muted)); |
+ |
+ EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty()); |
+} |
+ |
+TEST_F(NetEqDecodingTest, LastDecodedTimestampsOneDecoded) { |
+ // Insert one packet with PCM16b WB data (this is what PopulateRtpInfo does by |
+ // default). Make the length 10 ms. |
+ constexpr size_t kPayloadSamples = 16 * 10; |
+ constexpr size_t kPayloadBytes = 2 * kPayloadSamples; |
+ uint8_t payload[kPayloadBytes] = {0}; |
+ |
+ RTPHeader rtp_info; |
+ constexpr uint32_t kRtpTimestamp = 0x1234; |
+ PopulateRtpInfo(0, kRtpTimestamp, &rtp_info); |
+ EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); |
+ |
+ // Pull out data once. |
+ AudioFrame output; |
+ bool muted; |
+ ASSERT_EQ(0, neteq_->GetAudio(&output, &muted)); |
+ |
+ EXPECT_EQ(std::vector<uint32_t>({kRtpTimestamp}), |
+ neteq_->LastDecodedTimestamps()); |
+ |
+ // Nothing decoded on the second call. |
+ ASSERT_EQ(0, neteq_->GetAudio(&output, &muted)); |
+ EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty()); |
+} |
+ |
+TEST_F(NetEqDecodingTest, LastDecodedTimestampsTwoDecoded) { |
+ // Insert two packets with PCM16b WB data (this is what PopulateRtpInfo does |
+ // by default). Make the length 5 ms so that NetEq must decode them both in |
+ // the same GetAudio call. |
+ constexpr size_t kPayloadSamples = 16 * 5; |
+ constexpr size_t kPayloadBytes = 2 * kPayloadSamples; |
+ uint8_t payload[kPayloadBytes] = {0}; |
+ |
+ RTPHeader rtp_info; |
+ constexpr uint32_t kRtpTimestamp1 = 0x1234; |
+ PopulateRtpInfo(0, kRtpTimestamp1, &rtp_info); |
+ EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); |
+ constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp1 + kPayloadSamples; |
+ PopulateRtpInfo(1, kRtpTimestamp2, &rtp_info); |
+ EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0)); |
+ |
+ // Pull out data once. |
+ AudioFrame output; |
+ bool muted; |
+ ASSERT_EQ(0, neteq_->GetAudio(&output, &muted)); |
+ |
+ EXPECT_EQ(std::vector<uint32_t>({kRtpTimestamp1, kRtpTimestamp2}), |
+ neteq_->LastDecodedTimestamps()); |
+} |
+ |
} // namespace webrtc |