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

Unified Diff: webrtc/api/rtcstatscollector.cc

Issue 2467873005: RTCMediaStream[Track]Stats added. (Closed)
Patch Set: Created 4 years, 1 month 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
Index: webrtc/api/rtcstatscollector.cc
diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc
index b14b39670e61ce8d08bd71118c7b296ca3c5d7e7..c7e9a969cbcf219654909b548f11d4f6f920ae7e 100644
--- a/webrtc/api/rtcstatscollector.cc
+++ b/webrtc/api/rtcstatscollector.cc
@@ -15,6 +15,8 @@
#include <vector>
#include "webrtc/api/peerconnection.h"
+#include "webrtc/api/peerconnectioninterface.h"
+#include "webrtc/api/mediastreaminterface.h"
#include "webrtc/api/webrtcsession.h"
#include "webrtc/base/checks.h"
#include "webrtc/base/timeutils.h"
@@ -37,6 +39,11 @@ std::string RTCIceCandidatePairStatsIDFromConnectionInfo(
info.remote_candidate.id();
}
+std::string RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ const MediaStreamTrackInterface& track) {
+ return "RTCMediaStreamTrack_" + track.id();
+}
+
std::string RTCTransportStatsIDFromTransportChannel(
const std::string& transport_name, int channel_component) {
return "RTCTransport_" + transport_name + "_" +
@@ -93,6 +100,13 @@ const char* DataStateToRTCDataChannelState(
}
}
+void SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
+ const MediaStreamTrackInterface& track,
+ RTCMediaStreamTrackStats* track_stats) {
+ track_stats->track_identifier = track.id();
+ track_stats->ended = (track.state() == MediaStreamTrackInterface::kEnded);
+}
+
void SetInboundRTPStreamStatsFromMediaReceiverInfo(
const cricket::MediaReceiverInfo& media_receiver_info,
RTCInboundRTPStreamStats* inbound_stats) {
@@ -214,6 +228,91 @@ const std::string& ProduceIceCandidateStats(
return stats->id();
}
+void ProduceMediaStreamAndTrackStats(
+ int64_t timestamp_us,
+ rtc::scoped_refptr<StreamCollectionInterface> streams,
+ bool is_local,
+ RTCStatsReport* report) {
+ // TODO(hbos): This gets the current stream/track stats. The spec says that
+ // stream/track stats should appear in the stats as soon as they have been
+ // attached. This means we need to invalidate the collector's cache upon
+ // attaching or in some other way make sure that the new streams/tracks are
+ // accounted for. crbug.com/659137
+ // TODO(hbos): Also return detached tracks' stats (no longer present when
+ // iterating). The spec says the state should be a snapshot of the track at
+ // the moment of detachment. This means we have to either keep the track as-is
+ // after detachment or perform stats collection upon detachment.
+ // crbug.com/659137
hbos 2016/11/02 11:54:44 Is it not the case that a stream can be detached a
hta-webrtc 2016/11/03 14:34:21 The spec has strongly deemphasized streams. In fac
hbos 2016/11/03 18:10:30 Acknowledged.
+ if (!streams)
+ return;
+ for (size_t i = 0; i < streams->count(); ++i) {
+ MediaStreamInterface* stream = streams->at(i);
+
+ std::unique_ptr<RTCMediaStreamStats> stream_stats(
+ new RTCMediaStreamStats("RTCMediaStream_" + stream->label(),
+ timestamp_us));
+ stream_stats->stream_identifier = stream->label();
+ stream_stats->track_ids = std::vector<std::string>();
+ // Audio Tracks
+ for (rtc::scoped_refptr<AudioTrackInterface> audio_track :
+ stream->GetAudioTracks()) {
+ std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats(
+ new RTCMediaStreamTrackStats(
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *audio_track.get()),
+ timestamp_us));
+ stream_stats->track_ids->push_back(audio_track_stats->id());
hta-webrtc 2016/11/03 14:34:21 Consider what happens here if a track is a member
hbos 2016/11/03 18:10:30 Done. Skipping if already exists.
+ SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
+ *audio_track.get(),
+ audio_track_stats.get());
+ audio_track_stats->remote_source = !is_local;
+ audio_track_stats->detached = false;
+ int signal_level;
+ if (audio_track->GetSignalLevel(&signal_level)) {
+ // Convert signal level from [0,32767] int to [0,1] double.
+ RTC_DCHECK_GE(signal_level, 0);
+ RTC_DCHECK_LE(signal_level, 32767);
+ audio_track_stats->audio_level = signal_level / 32767.0;
hta-webrtc 2016/11/03 14:34:21 Check this one with Niklas. Audio levels are awful
hbos 2016/11/03 18:10:30 +niklase: Is this the correct way to get the audio
+ }
+ if (audio_track->GetAudioProcessor()) {
+ AudioProcessorInterface::AudioProcessorStats audio_processor_stats;
+ audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats);
+ audio_track_stats->echo_return_loss = static_cast<double>(
+ audio_processor_stats.echo_return_loss);
+ audio_track_stats->echo_return_loss_enhancement = static_cast<double>(
+ audio_processor_stats.echo_return_loss_enhancement);
+ }
+ report->AddStats(std::move(audio_track_stats));
+ }
+ // Video Tracks
+ for (rtc::scoped_refptr<VideoTrackInterface> video_track :
+ stream->GetVideoTracks()) {
+ std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats(
+ new RTCMediaStreamTrackStats(
+ RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
+ *video_track.get()),
+ timestamp_us));
+ stream_stats->track_ids->push_back(video_track_stats->id());
+ SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
+ *video_track.get(),
+ video_track_stats.get());
+ video_track_stats->remote_source = !is_local;
+ video_track_stats->detached = false;
+ if (video_track->GetSource()) {
+ VideoTrackSourceInterface::Stats video_track_source_stats;
+ if (video_track->GetSource()->GetStats(&video_track_source_stats)) {
+ video_track_stats->frame_width = static_cast<uint32_t>(
+ video_track_source_stats.input_width);
+ video_track_stats->frame_height = static_cast<uint32_t>(
+ video_track_source_stats.input_height);
hbos 2016/11/02 11:44:55 I wonder if this is the right value. What if the s
hbos 2016/11/02 11:48:41 And there are similar stats to the spec in Video[S
hta-webrtc 2016/11/03 14:34:21 Yes. More work needed both for getSettings and for
hta-webrtc 2016/11/03 14:34:21 It should be the downscaled value. I have a TODO t
hbos 2016/11/03 18:10:30 What are you referring to when you say "getSetting
hta-webrtc 2016/11/04 16:30:01 https://w3c.github.io/mediacapture-main/getusermed
+ }
+ }
+ report->AddStats(std::move(video_track_stats));
+ }
+ report->AddStats(std::move(stream_stats));
+ }
+}
+
} // namespace
rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
@@ -301,6 +400,7 @@ void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
timestamp_us, session_stats, transport_cert_stats, report.get());
}
ProduceDataChannelStats_s(timestamp_us, report.get());
+ ProduceMediaStreamAndTrackStats_s(timestamp_us, report.get());
ProducePeerConnectionStats_s(timestamp_us, report.get());
AddPartialResults(report);
@@ -467,6 +567,15 @@ void RTCStatsCollector::ProduceIceCandidateAndPairStats_s(
}
}
+void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s(
+ int64_t timestamp_us, RTCStatsReport* report) const {
+ RTC_DCHECK(signaling_thread_->IsCurrent());
+ ProduceMediaStreamAndTrackStats(
+ timestamp_us, pc_->local_streams(), true, report);
+ ProduceMediaStreamAndTrackStats(
+ timestamp_us, pc_->remote_streams(), false, report);
+}
+
void RTCStatsCollector::ProducePeerConnectionStats_s(
int64_t timestamp_us, RTCStatsReport* report) const {
RTC_DCHECK(signaling_thread_->IsCurrent());

Powered by Google App Engine
This is Rietveld 408576698