Fix missing local and remote ids in RtpStreamStats

Bug: chromium:1098266
Change-Id: I536464541c5971ea173bd7ed83d523fa50b43d0b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/178486
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31620}
This commit is contained in:
Eldar Rello 2020-07-03 11:08:07 +03:00 committed by Commit Bot
parent 1d50cb61d8
commit c07e904a25
2 changed files with 82 additions and 74 deletions

View File

@ -459,7 +459,7 @@ std::unique_ptr<RTCRemoteInboundRtpStreamStats>
ProduceRemoteInboundRtpStreamStatsFromReportBlockData(
const ReportBlockData& report_block_data,
cricket::MediaType media_type,
std::map<std::string, RTCOutboundRTPStreamStats*> outbound_rtps,
const std::map<std::string, RTCOutboundRTPStreamStats*>& outbound_rtps,
const RTCStatsReport& report) {
const auto& report_block = report_block_data.report_block();
// RTCStats' timestamp generally refers to when the metric was sampled, but
@ -1615,8 +1615,8 @@ void RTCStatsCollector::ProduceAudioRTPStreamStats_n(
track_media_info_map.voice_media_info()->senders) {
for (const auto& report_block_data : voice_sender_info.report_block_datas) {
report->AddStats(ProduceRemoteInboundRtpStreamStatsFromReportBlockData(
report_block_data, cricket::MEDIA_TYPE_AUDIO,
std::move(audio_outbound_rtps), *report));
report_block_data, cricket::MEDIA_TYPE_AUDIO, audio_outbound_rtps,
*report));
}
}
}
@ -1692,8 +1692,8 @@ void RTCStatsCollector::ProduceVideoRTPStreamStats_n(
track_media_info_map.video_media_info()->senders) {
for (const auto& report_block_data : video_sender_info.report_block_datas) {
report->AddStats(ProduceRemoteInboundRtpStreamStatsFromReportBlockData(
report_block_data, cricket::MEDIA_TYPE_VIDEO,
std::move(video_outbound_rtps), *report));
report_block_data, cricket::MEDIA_TYPE_VIDEO, video_outbound_rtps,
*report));
}
}
}

View File

@ -2563,44 +2563,46 @@ class RTCStatsCollectorTestWithParamKind
// Adds a sender and channel of the appropriate kind, creating a sender info
// with the report block's |source_ssrc| and report block data.
void AddSenderInfoAndMediaChannel(std::string transport_name,
ReportBlockData report_block_data,
absl::optional<RtpCodecParameters> codec) {
void AddSenderInfoAndMediaChannel(
std::string transport_name,
const std::vector<ReportBlockData>& report_block_datas,
absl::optional<RtpCodecParameters> codec) {
switch (media_type_) {
case cricket::MEDIA_TYPE_AUDIO: {
cricket::VoiceMediaInfo voice_media_info;
voice_media_info.senders.push_back(cricket::VoiceSenderInfo());
voice_media_info.senders[0].local_stats.push_back(
cricket::SsrcSenderInfo());
voice_media_info.senders[0].local_stats[0].ssrc =
report_block_data.report_block().source_ssrc;
if (codec.has_value()) {
voice_media_info.senders[0].codec_payload_type = codec->payload_type;
voice_media_info.send_codecs.insert(
std::make_pair(codec->payload_type, *codec));
for (const auto& report_block_data : report_block_datas) {
cricket::VoiceSenderInfo sender;
sender.local_stats.push_back(cricket::SsrcSenderInfo());
sender.local_stats[0].ssrc =
report_block_data.report_block().source_ssrc;
if (codec.has_value()) {
sender.codec_payload_type = codec->payload_type;
voice_media_info.send_codecs.insert(
std::make_pair(codec->payload_type, *codec));
}
sender.report_block_datas.push_back(report_block_data);
voice_media_info.senders.push_back(sender);
}
voice_media_info.senders[0].report_block_datas.push_back(
report_block_data);
auto* voice_media_channel = pc_->AddVoiceChannel("mid", transport_name);
voice_media_channel->SetStats(voice_media_info);
return;
}
case cricket::MEDIA_TYPE_VIDEO: {
cricket::VideoMediaInfo video_media_info;
video_media_info.senders.push_back(cricket::VideoSenderInfo());
video_media_info.senders[0].local_stats.push_back(
cricket::SsrcSenderInfo());
video_media_info.senders[0].local_stats[0].ssrc =
report_block_data.report_block().source_ssrc;
if (codec.has_value()) {
video_media_info.senders[0].codec_payload_type = codec->payload_type;
video_media_info.send_codecs.insert(
std::make_pair(codec->payload_type, *codec));
for (const auto& report_block_data : report_block_datas) {
cricket::VideoSenderInfo sender;
sender.local_stats.push_back(cricket::SsrcSenderInfo());
sender.local_stats[0].ssrc =
report_block_data.report_block().source_ssrc;
if (codec.has_value()) {
sender.codec_payload_type = codec->payload_type;
video_media_info.send_codecs.insert(
std::make_pair(codec->payload_type, *codec));
}
sender.report_block_datas.push_back(report_block_data);
video_media_info.aggregated_senders.push_back(sender);
video_media_info.senders.push_back(sender);
}
video_media_info.senders[0].report_block_datas.push_back(
report_block_data);
video_media_info.aggregated_senders.push_back(
video_media_info.senders[0]);
auto* video_media_channel = pc_->AddVideoChannel("mid", transport_name);
video_media_channel->SetStats(video_media_info);
return;
@ -2625,49 +2627,55 @@ TEST_P(RTCStatsCollectorTestWithParamKind,
// The report block's timestamp cannot be from the future, set the fake clock
// to match.
fake_clock_.SetTime(Timestamp::Micros(kReportBlockTimestampUtcUs));
RTCPReportBlock report_block;
// The remote-inbound-rtp SSRC and the outbound-rtp SSRC is the same as the
// |source_ssrc|, "SSRC of the RTP packet sender".
report_block.source_ssrc = 12;
report_block.packets_lost = 7;
ReportBlockData report_block_data;
report_block_data.SetReportBlock(report_block, kReportBlockTimestampUtcUs);
report_block_data.AddRoundTripTimeSample(1234);
// Only the last sample should be exposed as the
// |RTCRemoteInboundRtpStreamStats::round_trip_time|.
report_block_data.AddRoundTripTimeSample(kRoundTripTimeMs);
AddSenderInfoAndMediaChannel("TransportName", report_block_data,
auto ssrcs = {12, 13};
std::vector<ReportBlockData> report_block_datas;
for (auto ssrc : ssrcs) {
RTCPReportBlock report_block;
// The remote-inbound-rtp SSRC and the outbound-rtp SSRC is the same as the
// |source_ssrc|, "SSRC of the RTP packet sender".
report_block.source_ssrc = ssrc;
report_block.packets_lost = 7;
ReportBlockData report_block_data;
report_block_data.SetReportBlock(report_block, kReportBlockTimestampUtcUs);
report_block_data.AddRoundTripTimeSample(1234);
// Only the last sample should be exposed as the
// |RTCRemoteInboundRtpStreamStats::round_trip_time|.
report_block_data.AddRoundTripTimeSample(kRoundTripTimeMs);
report_block_datas.push_back(report_block_data);
}
AddSenderInfoAndMediaChannel("TransportName", report_block_datas,
absl::nullopt);
rtc::scoped_refptr<const RTCStatsReport> report = stats_->GetStatsReport();
for (auto ssrc : ssrcs) {
std::string stream_id = "Stream_" + std::to_string(ssrc);
RTCRemoteInboundRtpStreamStats expected_remote_inbound_rtp(
"RTCRemoteInboundRtp" + MediaTypeUpperCase() + stream_id,
kReportBlockTimestampUtcUs);
expected_remote_inbound_rtp.ssrc = ssrc;
expected_remote_inbound_rtp.kind = MediaTypeLowerCase();
expected_remote_inbound_rtp.transport_id =
"RTCTransport_TransportName_1"; // 1 for RTP (we have no RTCP
// transport)
expected_remote_inbound_rtp.packets_lost = 7;
expected_remote_inbound_rtp.local_id =
"RTCOutboundRTP" + MediaTypeUpperCase() + stream_id;
expected_remote_inbound_rtp.round_trip_time = kRoundTripTimeSeconds;
// This test does not set up RTCCodecStats, so |codec_id| and |jitter| are
// expected to be missing. These are tested separately.
RTCRemoteInboundRtpStreamStats expected_remote_inbound_rtp(
"RTCRemoteInboundRtp" + MediaTypeUpperCase() + "Stream_12",
kReportBlockTimestampUtcUs);
expected_remote_inbound_rtp.ssrc = 12;
expected_remote_inbound_rtp.kind = MediaTypeLowerCase();
expected_remote_inbound_rtp.transport_id =
"RTCTransport_TransportName_1"; // 1 for RTP (we have no RTCP transport)
expected_remote_inbound_rtp.packets_lost = 7;
expected_remote_inbound_rtp.local_id =
"RTCOutboundRTP" + MediaTypeUpperCase() + "Stream_12";
expected_remote_inbound_rtp.round_trip_time = kRoundTripTimeSeconds;
// This test does not set up RTCCodecStats, so |codec_id| and |jitter| are
// expected to be missing. These are tested separately.
ASSERT_TRUE(report->Get(expected_remote_inbound_rtp.id()));
EXPECT_EQ(report->Get(expected_remote_inbound_rtp.id())
->cast_to<RTCRemoteInboundRtpStreamStats>(),
expected_remote_inbound_rtp);
EXPECT_TRUE(report->Get(*expected_remote_inbound_rtp.transport_id));
ASSERT_TRUE(report->Get(*expected_remote_inbound_rtp.local_id));
// Lookup works in both directions.
EXPECT_EQ(*report->Get(*expected_remote_inbound_rtp.local_id)
->cast_to<RTCOutboundRTPStreamStats>()
.remote_id,
expected_remote_inbound_rtp.id());
ASSERT_TRUE(report->Get(expected_remote_inbound_rtp.id()));
EXPECT_EQ(report->Get(expected_remote_inbound_rtp.id())
->cast_to<RTCRemoteInboundRtpStreamStats>(),
expected_remote_inbound_rtp);
EXPECT_TRUE(report->Get(*expected_remote_inbound_rtp.transport_id));
ASSERT_TRUE(report->Get(*expected_remote_inbound_rtp.local_id));
// Lookup works in both directions.
EXPECT_EQ(*report->Get(*expected_remote_inbound_rtp.local_id)
->cast_to<RTCOutboundRTPStreamStats>()
.remote_id,
expected_remote_inbound_rtp.id());
}
}
TEST_P(RTCStatsCollectorTestWithParamKind,
@ -2682,7 +2690,7 @@ TEST_P(RTCStatsCollectorTestWithParamKind,
ReportBlockData report_block_data;
report_block_data.SetReportBlock(report_block, kReportBlockTimestampUtcUs);
AddSenderInfoAndMediaChannel("TransportName", report_block_data,
AddSenderInfoAndMediaChannel("TransportName", {report_block_data},
absl::nullopt);
// Advance time, it should be OK to have fresher reports than report blocks.
@ -2720,7 +2728,7 @@ TEST_P(RTCStatsCollectorTestWithParamKind,
codec.kind = media_type_;
codec.clock_rate = 1000;
AddSenderInfoAndMediaChannel("TransportName", report_block_data, codec);
AddSenderInfoAndMediaChannel("TransportName", {report_block_data}, codec);
rtc::scoped_refptr<const RTCStatsReport> report = stats_->GetStatsReport();
@ -2760,7 +2768,7 @@ TEST_P(RTCStatsCollectorTestWithParamKind,
rtcp_transport_channel_stats.dtls_state = cricket::DTLS_TRANSPORT_NEW;
pc_->SetTransportStats("TransportName", {rtp_transport_channel_stats,
rtcp_transport_channel_stats});
AddSenderInfoAndMediaChannel("TransportName", report_block_data,
AddSenderInfoAndMediaChannel("TransportName", {report_block_data},
absl::nullopt);
rtc::scoped_refptr<const RTCStatsReport> report = stats_->GetStatsReport();