diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc index e0ad1a8bd6..41e0b5179d 100644 --- a/audio/audio_send_stream.cc +++ b/audio/audio_send_stream.cc @@ -454,15 +454,14 @@ webrtc::AudioSendStream::Stats AudioSendStream::GetStats( stats.codec_payload_type = spec.payload_type; // Get data from the last remote RTCP report. - for (const auto& block : channel_send_->GetRemoteRTCPReportBlocks()) { + for (const ReportBlockData& block : + channel_send_->GetRemoteRTCPReportBlocks()) { // Lookup report for send ssrc only. - if (block.source_SSRC == stats.local_ssrc) { - stats.packets_lost = block.cumulative_num_packets_lost; - stats.fraction_lost = Q8ToFloat(block.fraction_lost); - // Convert timestamps to milliseconds. - if (spec.format.clockrate_hz / 1000 > 0) { - stats.jitter_ms = - block.interarrival_jitter / (spec.format.clockrate_hz / 1000); + if (block.source_ssrc() == stats.local_ssrc) { + stats.packets_lost = block.cumulative_lost(); + stats.fraction_lost = block.fraction_lost(); + if (spec.format.clockrate_hz > 0) { + stats.jitter_ms = block.jitter(spec.format.clockrate_hz).ms(); } break; } diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc index a6450d3e89..1826793164 100644 --- a/audio/audio_send_stream_unittest.cc +++ b/audio/audio_send_stream_unittest.cc @@ -66,7 +66,9 @@ const double kEchoReturnLossEnhancement = 101; const double kResidualEchoLikelihood = -1.0f; const double kResidualEchoLikelihoodMax = 23.0f; const CallSendStatistics kCallStats = {112, 12, 13456, 17890}; -const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354}; +constexpr int kFractionLost = 123; +constexpr int kCumulativeLost = 567; +constexpr uint32_t kInterarrivalJitter = 132; const int kTelephoneEventPayloadType = 123; const int kTelephoneEventPayloadFrequency = 65432; const int kTelephoneEventCode = 45; @@ -279,12 +281,16 @@ struct ConfigHelper { using ::testing::SetArgPointee; using ::testing::SetArgReferee; - std::vector report_blocks; - webrtc::ReportBlock block = kReportBlock; + std::vector report_blocks; + ReportBlockData block; + block.set_source_ssrc(780); + block.set_fraction_lost_raw(kFractionLost); + block.set_cumulative_lost(kCumulativeLost); + block.set_jitter(kInterarrivalJitter); report_blocks.push_back(block); // Has wrong SSRC. - block.source_SSRC = kSsrc; + block.set_source_ssrc(kSsrc); report_blocks.push_back(block); // Correct block. - block.fraction_lost = 0; + block.set_fraction_lost_raw(0); report_blocks.push_back(block); // Duplicate SSRC, bad fraction_lost. EXPECT_TRUE(channel_send_); @@ -435,12 +441,12 @@ TEST(AudioSendStreamTest, GetStats) { EXPECT_EQ(kCallStats.header_and_padding_bytes_sent, stats.header_and_padding_bytes_sent); EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent); - EXPECT_EQ(kReportBlock.cumulative_num_packets_lost, stats.packets_lost); - EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost); + EXPECT_EQ(stats.packets_lost, kCumulativeLost); + EXPECT_FLOAT_EQ(stats.fraction_lost, Q8ToFloat(kFractionLost)); EXPECT_EQ(kIsacFormat.name, stats.codec_name); - EXPECT_EQ(static_cast(kReportBlock.interarrival_jitter / - (kIsacFormat.clockrate_hz / 1000)), - stats.jitter_ms); + EXPECT_EQ(stats.jitter_ms, + static_cast(kInterarrivalJitter / + (kIsacFormat.clockrate_hz / 1000))); EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms); EXPECT_EQ(0, stats.audio_level); EXPECT_EQ(0, stats.total_input_energy); diff --git a/audio/channel_send.cc b/audio/channel_send.cc index 91a17d4d72..229b379f51 100644 --- a/audio/channel_send.cc +++ b/audio/channel_send.cc @@ -119,7 +119,7 @@ class ChannelSend : public ChannelSendInterface, RtcpBandwidthObserver* bandwidth_observer) override; void ResetSenderCongestionControlObjects() override; void SetRTCP_CNAME(absl::string_view c_name) override; - std::vector GetRemoteRTCPReportBlocks() const override; + std::vector GetRemoteRTCPReportBlocks() const override; CallSendStatistics GetRTCPStatistics() const override; // ProcessAndEncodeAudio() posts a task on the shared encoder task queue, @@ -735,28 +735,12 @@ void ChannelSend::SetRTCP_CNAME(absl::string_view c_name) { RTC_DCHECK_EQ(0, ret) << "SetRTCP_CNAME() failed to set RTCP CNAME"; } -std::vector ChannelSend::GetRemoteRTCPReportBlocks() const { +std::vector ChannelSend::GetRemoteRTCPReportBlocks() const { RTC_DCHECK_RUN_ON(&worker_thread_checker_); // Get the report blocks from the latest received RTCP Sender or Receiver // Report. Each element in the vector contains the sender's SSRC and a // report block according to RFC 3550. - std::vector report_blocks; - for (const ReportBlockData& data : rtp_rtcp_->GetLatestReportBlockData()) { - ReportBlock report_block; - report_block.sender_SSRC = data.report_block().sender_ssrc; - report_block.source_SSRC = data.report_block().source_ssrc; - report_block.fraction_lost = data.report_block().fraction_lost; - report_block.cumulative_num_packets_lost = data.report_block().packets_lost; - report_block.extended_highest_sequence_number = - data.report_block().extended_highest_sequence_number; - report_block.interarrival_jitter = data.report_block().jitter; - report_block.last_SR_timestamp = - data.report_block().last_sender_report_timestamp; - report_block.delay_since_last_SR = - data.report_block().delay_since_last_sender_report; - report_blocks.push_back(report_block); - } - return report_blocks; + return rtp_rtcp_->GetLatestReportBlockData(); } CallSendStatistics ChannelSend::GetRTCPStatistics() const { diff --git a/audio/channel_send.h b/audio/channel_send.h index 08d3f92f1d..a0aa42a706 100644 --- a/audio/channel_send.h +++ b/audio/channel_send.h @@ -51,18 +51,6 @@ struct CallSendStatistics { uint32_t nacks_received; }; -// See section 6.4.2 in http://www.ietf.org/rfc/rfc3550.txt for details. -struct ReportBlock { - uint32_t sender_SSRC; // SSRC of sender - uint32_t source_SSRC; - uint8_t fraction_lost; - int32_t cumulative_num_packets_lost; - uint32_t extended_highest_sequence_number; - uint32_t interarrival_jitter; - uint32_t last_SR_timestamp; - uint32_t delay_since_last_SR; -}; - namespace voe { class ChannelSendInterface { @@ -86,7 +74,7 @@ class ChannelSendInterface { RtpTransportControllerSendInterface* transport, RtcpBandwidthObserver* bandwidth_observer) = 0; virtual void ResetSenderCongestionControlObjects() = 0; - virtual std::vector GetRemoteRTCPReportBlocks() const = 0; + virtual std::vector GetRemoteRTCPReportBlocks() const = 0; virtual ANAStats GetANAStatistics() const = 0; virtual void RegisterCngPayloadType(int payload_type, int payload_frequency) = 0; diff --git a/audio/mock_voe_channel_proxy.h b/audio/mock_voe_channel_proxy.h index a02bee38ad..671de08bd4 100644 --- a/audio/mock_voe_channel_proxy.h +++ b/audio/mock_voe_channel_proxy.h @@ -135,7 +135,7 @@ class MockChannelSend : public voe::ChannelSendInterface { (override)); MOCK_METHOD(void, ResetSenderCongestionControlObjects, (), (override)); MOCK_METHOD(CallSendStatistics, GetRTCPStatistics, (), (const, override)); - MOCK_METHOD(std::vector, + MOCK_METHOD(std::vector, GetRemoteRTCPReportBlocks, (), (const, override)); diff --git a/modules/rtp_rtcp/include/report_block_data.h b/modules/rtp_rtcp/include/report_block_data.h index 48a4d93006..2efdb9d845 100644 --- a/modules/rtp_rtcp/include/report_block_data.h +++ b/modules/rtp_rtcp/include/report_block_data.h @@ -96,6 +96,13 @@ class ReportBlockData { size_t num_rtts() const { return num_rtts_; } bool has_rtt() const { return num_rtts_ != 0; } + void set_source_ssrc(uint32_t ssrc) { report_block_.source_ssrc = ssrc; } + void set_fraction_lost_raw(uint8_t lost) { + report_block_.fraction_lost = lost; + } + void set_cumulative_lost(int lost) { report_block_.packets_lost = lost; } + void set_jitter(uint32_t jitter) { report_block_.jitter = jitter; } + void SetReportBlock(uint32_t sender_ssrc, const rtcp::ReportBlock& report_block, Timestamp report_block_timestamp_utc);