| Index: webrtc/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
|
| index b0531c3c51a820ec7fd361b7653b06f1df00b586..e20d2d52a911d6ad3254830fc684f44ad29ae058 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
|
| @@ -255,4 +255,88 @@ TEST_F(RtpReceiverTest, GetSourcesRemoveOutdatedSource) {
|
| csrc_sources.begin()->timestamp_ms());
|
| }
|
|
|
| +// The audio level from the RTPHeader extension should be stored in the
|
| +// RtpSource with the matching SSRC.
|
| +TEST_F(RtpReceiverTest, GetSourcesContainsAudioLevelExtension) {
|
| + RTPHeader header;
|
| + int64_t time1_ms = fake_clock_.TimeInMilliseconds();
|
| + header.payloadType = kPcmuPayloadType;
|
| + header.ssrc = kSsrc1;
|
| + header.timestamp = rtp_timestamp(time1_ms);
|
| + header.extension.hasAudioLevel = true;
|
| + header.extension.audioLevel = 10;
|
| + PayloadUnion payload_specific = {AudioPayload()};
|
| +
|
| + EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
|
| + header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
|
| + auto sources = rtp_receiver_->GetSources();
|
| + EXPECT_THAT(sources, UnorderedElementsAre(RtpSource(
|
| + time1_ms, kSsrc1, RtpSourceType::SSRC, 10)));
|
| +
|
| + // Receive a packet from a different SSRC with a different level and check
|
| + // that they are both remembered.
|
| + fake_clock_.AdvanceTimeMilliseconds(1);
|
| + int64_t time2_ms = fake_clock_.TimeInMilliseconds();
|
| + header.ssrc = kSsrc2;
|
| + header.timestamp = rtp_timestamp(time2_ms);
|
| + header.extension.hasAudioLevel = true;
|
| + header.extension.audioLevel = 20;
|
| +
|
| + EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
|
| + header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
|
| + sources = rtp_receiver_->GetSources();
|
| + EXPECT_THAT(sources,
|
| + UnorderedElementsAre(
|
| + RtpSource(time1_ms, kSsrc1, RtpSourceType::SSRC, 10),
|
| + RtpSource(time2_ms, kSsrc2, RtpSourceType::SSRC, 20)));
|
| +
|
| + // Receive a packet from the first SSRC again and check that the level is
|
| + // updated.
|
| + fake_clock_.AdvanceTimeMilliseconds(1);
|
| + int64_t time3_ms = fake_clock_.TimeInMilliseconds();
|
| + header.ssrc = kSsrc1;
|
| + header.timestamp = rtp_timestamp(time3_ms);
|
| + header.extension.hasAudioLevel = true;
|
| + header.extension.audioLevel = 30;
|
| +
|
| + EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
|
| + header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
|
| + sources = rtp_receiver_->GetSources();
|
| + EXPECT_THAT(sources,
|
| + UnorderedElementsAre(
|
| + RtpSource(time3_ms, kSsrc1, RtpSourceType::SSRC, 30),
|
| + RtpSource(time2_ms, kSsrc2, RtpSourceType::SSRC, 20)));
|
| +}
|
| +
|
| +TEST_F(RtpReceiverTest,
|
| + MissingAudioLevelHeaderExtensionClearsRtpSourceAudioLevel) {
|
| + RTPHeader header;
|
| + int64_t time1_ms = fake_clock_.TimeInMilliseconds();
|
| + header.payloadType = kPcmuPayloadType;
|
| + header.ssrc = kSsrc1;
|
| + header.timestamp = rtp_timestamp(time1_ms);
|
| + header.extension.hasAudioLevel = true;
|
| + header.extension.audioLevel = 10;
|
| + PayloadUnion payload_specific = {AudioPayload()};
|
| +
|
| + EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
|
| + header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
|
| + auto sources = rtp_receiver_->GetSources();
|
| + EXPECT_THAT(sources, UnorderedElementsAre(RtpSource(
|
| + time1_ms, kSsrc1, RtpSourceType::SSRC, 10)));
|
| +
|
| + // Receive a second packet without the audio level header extension and check
|
| + // that the audio level is cleared.
|
| + fake_clock_.AdvanceTimeMilliseconds(1);
|
| + int64_t time2_ms = fake_clock_.TimeInMilliseconds();
|
| + header.timestamp = rtp_timestamp(time2_ms);
|
| + header.extension.hasAudioLevel = false;
|
| +
|
| + EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
|
| + header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
|
| + sources = rtp_receiver_->GetSources();
|
| + EXPECT_THAT(sources, UnorderedElementsAre(
|
| + RtpSource(time2_ms, kSsrc1, RtpSourceType::SSRC)));
|
| +}
|
| +
|
| } // namespace webrtc
|
|
|