Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Unified Diff: webrtc/api/rtcstatscollector.cc

Issue 2610843003: RTC[In/Out]boundRTPStreamStats.mediaTrackId collected. (Closed)
Patch Set: Addressed comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/api/rtcstatscollector.cc
diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc
index 3ab7ac94e1e12429a423d05d7180da4f84fdbef3..99d931bae89c62199a8e8d1a76aff81c92a9ebc0 100644
--- a/webrtc/api/rtcstatscollector.cc
+++ b/webrtc/api/rtcstatscollector.cc
@@ -54,8 +54,9 @@ std::string RTCIceCandidatePairStatsIDFromConnectionInfo(
}
std::string RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
- const MediaStreamTrackInterface& track) {
- return "RTCMediaStreamTrack_" + track.id();
+ const MediaStreamTrackInterface& track, bool is_local) {
+ return (is_local ? "RTCMediaStreamTrack_local_" + track.id()
+ : "RTCMediaStreamTrack_remote_" + track.id());
}
std::string RTCTransportStatsIDFromTransportChannel(
@@ -328,7 +329,7 @@ void ProduceMediaStreamAndTrackStats(
for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
stream->GetAudioTracks()) {
std::string id = RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
- *audio_track.get());
+ *audio_track.get(), is_local);
if (report->Get(id)) {
// Skip track, stats already exist for it.
continue;
@@ -366,7 +367,7 @@ void ProduceMediaStreamAndTrackStats(
for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
stream->GetVideoTracks()) {
std::string id = RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
- *video_track.get());
+ *video_track.get(), is_local);
if (report->Get(id)) {
// Skip track, stats already exist for it.
continue;
@@ -450,7 +451,7 @@ void RTCStatsCollector::GetStatsReport(
num_pending_partial_reports_ = 2;
partial_report_timestamp_us_ = cache_now_us;
- // Prepare |channel_names_| and |media_info_| for use in
+ // Prepare |channel_name_pairs_| for use in
// |ProducePartialResultsOnNetworkThread|.
channel_name_pairs_.reset(new ChannelNamePairs());
if (pc_->session()->voice_channel()) {
@@ -468,7 +469,10 @@ void RTCStatsCollector::GetStatsReport(
ChannelNamePair(pc_->session()->data_channel()->content_name(),
pc_->session()->data_channel()->transport_name()));
}
- media_info_.reset(PrepareMediaInfo_s().release());
+ // Prepare |track_media_info_map_| for use in
+ // |ProducePartialResultsOnNetworkThread| and
+ // |ProducePartialResultsOnSignalingThread|.
+ track_media_info_map_.reset(PrepareTrackMediaInfoMap_s().release());
invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_,
rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread,
@@ -521,11 +525,11 @@ void RTCStatsCollector::ProducePartialResultsOnNetworkThread(
ProduceCertificateStats_n(
timestamp_us, transport_cert_stats, report.get());
ProduceCodecStats_n(
- timestamp_us, *media_info_, report.get());
+ timestamp_us, *track_media_info_map_, report.get());
ProduceIceCandidateAndPairStats_n(
timestamp_us, *session_stats, report.get());
ProduceRTPStreamStats_n(
- timestamp_us, *session_stats, *media_info_, report.get());
+ timestamp_us, *session_stats, *track_media_info_map_, report.get());
ProduceTransportStats_n(
timestamp_us, *session_stats, transport_cert_stats, report.get());
}
@@ -558,6 +562,8 @@ void RTCStatsCollector::AddPartialResults_s(
cache_timestamp_us_ = partial_report_timestamp_us_;
cached_report_ = partial_report_;
partial_report_ = nullptr;
+ channel_name_pairs_.reset();
+ track_media_info_map_.reset();
DeliverCachedReport();
}
}
@@ -591,31 +597,35 @@ void RTCStatsCollector::ProduceCertificateStats_n(
}
void RTCStatsCollector::ProduceCodecStats_n(
- int64_t timestamp_us, const MediaInfo& media_info,
+ int64_t timestamp_us, const TrackMediaInfoMap& track_media_info_map,
RTCStatsReport* report) const {
RTC_DCHECK(network_thread_->IsCurrent());
// Audio
- if (media_info.voice) {
+ if (track_media_info_map.voice_media_info()) {
// Inbound
- for (const auto& pair : media_info.voice->receive_codecs) {
+ for (const auto& pair :
+ track_media_info_map.voice_media_info()->receive_codecs) {
report->AddStats(CodecStatsFromRtpCodecParameters(
timestamp_us, true, true, pair.second));
}
// Outbound
- for (const auto& pair : media_info.voice->send_codecs) {
+ for (const auto& pair :
+ track_media_info_map.voice_media_info()->send_codecs) {
report->AddStats(CodecStatsFromRtpCodecParameters(
timestamp_us, false, true, pair.second));
}
}
// Video
- if (media_info.video) {
+ if (track_media_info_map.video_media_info()) {
// Inbound
- for (const auto& pair : media_info.video->receive_codecs) {
+ for (const auto& pair :
+ track_media_info_map.video_media_info()->receive_codecs) {
report->AddStats(CodecStatsFromRtpCodecParameters(
timestamp_us, true, false, pair.second));
}
// Outbound
- for (const auto& pair : media_info.video->send_codecs) {
+ for (const auto& pair :
+ track_media_info_map.video_media_info()->send_codecs) {
report->AddStats(CodecStatsFromRtpCodecParameters(
timestamp_us, false, false, pair.second));
}
@@ -725,17 +735,18 @@ void RTCStatsCollector::ProducePeerConnectionStats_s(
void RTCStatsCollector::ProduceRTPStreamStats_n(
int64_t timestamp_us, const SessionStats& session_stats,
- const MediaInfo& media_info, RTCStatsReport* report) const {
+ const TrackMediaInfoMap& track_media_info_map,
+ RTCStatsReport* report) const {
RTC_DCHECK(network_thread_->IsCurrent());
// Audio
- if (media_info.voice) {
+ if (track_media_info_map.voice_media_info()) {
std::string transport_id = RTCTransportStatsIDFromBaseChannel(
session_stats.proxy_to_transport, *pc_->session()->voice_channel());
RTC_DCHECK(!transport_id.empty());
// Inbound
for (const cricket::VoiceReceiverInfo& voice_receiver_info :
- media_info.voice->receivers) {
+ track_media_info_map.voice_media_info()->receivers) {
// TODO(nisse): SSRC == 0 currently means none. Delete check when that
// is fixed.
if (voice_receiver_info.ssrc() == 0)
@@ -747,6 +758,12 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
timestamp_us));
SetInboundRTPStreamStatsFromVoiceReceiverInfo(
voice_receiver_info, inbound_audio.get());
+ rtc::scoped_refptr<AudioTrackInterface> audio_track =
+ track_media_info_map_->GetAudioTrack(voice_receiver_info);
+ RTC_DCHECK(audio_track);
+ inbound_audio->media_track_id =
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *audio_track, false);
inbound_audio->transport_id = transport_id;
if (voice_receiver_info.codec_payload_type) {
inbound_audio->codec_id =
@@ -757,7 +774,7 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
}
// Outbound
for (const cricket::VoiceSenderInfo& voice_sender_info :
- media_info.voice->senders) {
+ track_media_info_map.voice_media_info()->senders) {
// TODO(nisse): SSRC == 0 currently means none. Delete check when that
// is fixed.
if (voice_sender_info.ssrc() == 0)
@@ -769,6 +786,13 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
timestamp_us));
SetOutboundRTPStreamStatsFromVoiceSenderInfo(
voice_sender_info, outbound_audio.get());
+ rtc::scoped_refptr<AudioTrackInterface> audio_track =
+ track_media_info_map_->GetAudioTrack(voice_sender_info);
+ if (audio_track) {
+ outbound_audio->media_track_id =
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *audio_track, true);
+ }
outbound_audio->transport_id = transport_id;
if (voice_sender_info.codec_payload_type) {
outbound_audio->codec_id =
@@ -779,13 +803,13 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
}
}
// Video
- if (media_info.video) {
+ if (track_media_info_map.video_media_info()) {
std::string transport_id = RTCTransportStatsIDFromBaseChannel(
session_stats.proxy_to_transport, *pc_->session()->video_channel());
RTC_DCHECK(!transport_id.empty());
// Inbound
for (const cricket::VideoReceiverInfo& video_receiver_info :
- media_info.video->receivers) {
+ track_media_info_map.video_media_info()->receivers) {
// TODO(nisse): SSRC == 0 currently means none. Delete check when that
// is fixed.
if (video_receiver_info.ssrc() == 0)
@@ -797,6 +821,13 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
timestamp_us));
SetInboundRTPStreamStatsFromVideoReceiverInfo(
video_receiver_info, inbound_video.get());
+ rtc::scoped_refptr<VideoTrackInterface> video_track =
+ track_media_info_map_->GetVideoTrack(video_receiver_info);
Taylor Brandstetter 2017/01/09 18:58:10 nit: If you add a DCHECK for remote audio tracks'
hbos 2017/01/10 09:34:09 Nice catch. Done.
+ if (video_track) {
+ inbound_video->media_track_id =
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *video_track, false);
+ }
inbound_video->transport_id = transport_id;
if (video_receiver_info.codec_payload_type) {
inbound_video->codec_id =
@@ -807,7 +838,7 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
}
// Outbound
for (const cricket::VideoSenderInfo& video_sender_info :
- media_info.video->senders) {
+ track_media_info_map.video_media_info()->senders) {
// TODO(nisse): SSRC == 0 currently means none. Delete check when that
// is fixed.
if (video_sender_info.ssrc() == 0)
@@ -819,6 +850,13 @@ void RTCStatsCollector::ProduceRTPStreamStats_n(
timestamp_us));
SetOutboundRTPStreamStatsFromVideoSenderInfo(
video_sender_info, outbound_video.get());
+ rtc::scoped_refptr<VideoTrackInterface> video_track =
+ track_media_info_map_->GetVideoTrack(video_sender_info);
+ if (video_track) {
+ outbound_video->media_track_id =
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *video_track, true);
+ }
outbound_video->transport_id = transport_id;
if (video_sender_info.codec_payload_type) {
outbound_video->codec_id =
@@ -922,25 +960,29 @@ RTCStatsCollector::PrepareTransportCertificateStats_n(
return transport_cert_stats;
}
-std::unique_ptr<RTCStatsCollector::MediaInfo>
-RTCStatsCollector::PrepareMediaInfo_s() const {
+std::unique_ptr<TrackMediaInfoMap>
+RTCStatsCollector::PrepareTrackMediaInfoMap_s() const {
RTC_DCHECK(signaling_thread_->IsCurrent());
- std::unique_ptr<MediaInfo> media_info(new MediaInfo());
+ std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info;
if (pc_->session()->voice_channel()) {
- cricket::VoiceMediaInfo voice_media_info;
- if (pc_->session()->voice_channel()->GetStats(&voice_media_info)) {
- media_info->voice = rtc::Optional<cricket::VoiceMediaInfo>(
- std::move(voice_media_info));
+ voice_media_info.reset(new cricket::VoiceMediaInfo());
+ if (!pc_->session()->voice_channel()->GetStats(voice_media_info.get())) {
+ voice_media_info.reset();
}
}
+ std::unique_ptr<cricket::VideoMediaInfo> video_media_info;
if (pc_->session()->video_channel()) {
- cricket::VideoMediaInfo video_media_info;
- if (pc_->session()->video_channel()->GetStats(&video_media_info)) {
- media_info->video = rtc::Optional<cricket::VideoMediaInfo>(
- std::move(video_media_info));
+ video_media_info.reset(new cricket::VideoMediaInfo());
+ if (!pc_->session()->video_channel()->GetStats(video_media_info.get())) {
+ video_media_info.reset();
}
}
- return media_info;
+ std::unique_ptr<TrackMediaInfoMap> track_media_info_map(
+ new TrackMediaInfoMap(std::move(voice_media_info),
+ std::move(video_media_info),
+ pc_->GetSenders(),
+ pc_->GetReceivers()));
+ return track_media_info_map;
}
void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) {
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698