Delete audio specific struct ReportBlock in favor of ReportBlockData

ReportBlockData class is better documented and has wider usage.

Bug: webrtc:13757
Change-Id: Ie5f2275f2f0236267172e6dd1ce5c2dfb2193ba0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/304101
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39980}
This commit is contained in:
Danil Chapovalov 2023-05-03 13:20:11 +02:00 committed by WebRTC LUCI CQ
parent 91d5fc2ed6
commit a9b9d4e3d0
6 changed files with 35 additions and 51 deletions

View File

@ -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;
}

View File

@ -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<ReportBlock> report_blocks;
webrtc::ReportBlock block = kReportBlock;
std::vector<ReportBlockData> 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<int32_t>(kReportBlock.interarrival_jitter /
(kIsacFormat.clockrate_hz / 1000)),
stats.jitter_ms);
EXPECT_EQ(stats.jitter_ms,
static_cast<int32_t>(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);

View File

@ -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<ReportBlock> GetRemoteRTCPReportBlocks() const override;
std::vector<ReportBlockData> 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<ReportBlock> ChannelSend::GetRemoteRTCPReportBlocks() const {
std::vector<ReportBlockData> 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<ReportBlock> 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 {

View File

@ -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<ReportBlock> GetRemoteRTCPReportBlocks() const = 0;
virtual std::vector<ReportBlockData> GetRemoteRTCPReportBlocks() const = 0;
virtual ANAStats GetANAStatistics() const = 0;
virtual void RegisterCngPayloadType(int payload_type,
int payload_frequency) = 0;

View File

@ -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<ReportBlock>,
MOCK_METHOD(std::vector<ReportBlockData>,
GetRemoteRTCPReportBlocks,
(),
(const, override));

View File

@ -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);