From 160e4a78e30041258a86e115bddaf5074f36d2b6 Mon Sep 17 00:00:00 2001 From: hbos Date: Tue, 17 Jan 2017 02:53:23 -0800 Subject: [PATCH] RTCMediaStreamTrackStats.kind added and collected. Implements recent spec change: https://github.com/w3c/webrtc-stats/pull/127 BUG=chromium:659137, chromium:627816 Review-Url: https://codereview.webrtc.org/2623513006 Cr-Commit-Position: refs/heads/master@{#16111} --- webrtc/api/rtcstats_integrationtest.cc | 18 +++++++++++++----- webrtc/api/rtcstatscollector.cc | 6 ++++-- webrtc/api/rtcstatscollector_unittest.cc | 15 ++++++++++----- webrtc/api/stats/rtcstats_objects.h | 16 ++++++++++++++-- webrtc/stats/rtcstats_objects.cc | 14 +++++++++++--- 5 files changed, 52 insertions(+), 17 deletions(-) diff --git a/webrtc/api/rtcstats_integrationtest.cc b/webrtc/api/rtcstats_integrationtest.cc index 7a67038ef9..98eafb0ac3 100644 --- a/webrtc/api/rtcstats_integrationtest.cc +++ b/webrtc/api/rtcstats_integrationtest.cc @@ -429,13 +429,21 @@ class RTCStatsReportVerifier { verifier.TestMemberIsDefined(media_stream_track.remote_source); verifier.TestMemberIsDefined(media_stream_track.ended); verifier.TestMemberIsDefined(media_stream_track.detached); + verifier.TestMemberIsDefined(media_stream_track.kind); // Video or audio media stream track? - if (media_stream_track.frame_width.is_defined()) { + if (*media_stream_track.kind == RTCMediaStreamTrackKind::kVideo) { // Video-only members - verifier.TestMemberIsNonNegative( - media_stream_track.frame_width); - verifier.TestMemberIsNonNegative( - media_stream_track.frame_height); + if (!*media_stream_track.remote_source) { + verifier.TestMemberIsNonNegative( + media_stream_track.frame_width); + verifier.TestMemberIsNonNegative( + media_stream_track.frame_height); + } else { + // TODO(hbos): Frame width/height should be defined for the remote case. + // Is this a real problem or an artifact of testing? crbug.com/659137 + verifier.TestMemberIsUndefined(media_stream_track.frame_width); + verifier.TestMemberIsUndefined(media_stream_track.frame_height); + } verifier.TestMemberIsUndefined(media_stream_track.frames_per_second); verifier.TestMemberIsUndefined(media_stream_track.frames_sent); verifier.TestMemberIsUndefined(media_stream_track.frames_received); diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc index 5afbb7b32d..7f2f45e84a 100644 --- a/webrtc/api/rtcstatscollector.cc +++ b/webrtc/api/rtcstatscollector.cc @@ -354,7 +354,8 @@ void ProduceMediaStreamAndTrackStats( continue; } std::unique_ptr audio_track_stats( - new RTCMediaStreamTrackStats(id, timestamp_us)); + new RTCMediaStreamTrackStats(id, timestamp_us, + RTCMediaStreamTrackKind::kAudio)); stream_stats->track_ids->push_back(audio_track_stats->id()); SetMediaStreamTrackStatsFromMediaStreamTrackInterface( *audio_track.get(), @@ -392,7 +393,8 @@ void ProduceMediaStreamAndTrackStats( continue; } std::unique_ptr video_track_stats( - new RTCMediaStreamTrackStats(id, timestamp_us)); + new RTCMediaStreamTrackStats(id, timestamp_us, + RTCMediaStreamTrackKind::kVideo)); stream_stats->track_ids->push_back(video_track_stats->id()); SetMediaStreamTrackStatsFromMediaStreamTrackInterface( *video_track.get(), diff --git a/webrtc/api/rtcstatscollector_unittest.cc b/webrtc/api/rtcstatscollector_unittest.cc index 22b7ee4180..5860a3ece7 100644 --- a/webrtc/api/rtcstatscollector_unittest.cc +++ b/webrtc/api/rtcstatscollector_unittest.cc @@ -1379,7 +1379,8 @@ TEST_F(RTCStatsCollectorTest, RTCMediaStreamStats>()); RTCMediaStreamTrackStats expected_local_audio_track( - "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us()); + "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(), + RTCMediaStreamTrackKind::kAudio); expected_local_audio_track.track_identifier = local_audio_track->id(); expected_local_audio_track.remote_source = false; expected_local_audio_track.ended = true; @@ -1393,7 +1394,8 @@ TEST_F(RTCStatsCollectorTest, RTCMediaStreamTrackStats>()); RTCMediaStreamTrackStats expected_remote_audio_track( - "RTCMediaStreamTrack_remote_RemoteAudioTrackID", report->timestamp_us()); + "RTCMediaStreamTrack_remote_RemoteAudioTrackID", report->timestamp_us(), + RTCMediaStreamTrackKind::kAudio); expected_remote_audio_track.track_identifier = remote_audio_track->id(); expected_remote_audio_track.remote_source = true; expected_remote_audio_track.ended = false; @@ -1433,7 +1435,8 @@ TEST_F(RTCStatsCollectorTest, rtc::scoped_refptr report = GetStatsReport(); RTCMediaStreamTrackStats expected_local_audio_track( - "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us()); + "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(), + RTCMediaStreamTrackKind::kAudio); expected_local_audio_track.track_identifier = local_audio_track->id(); expected_local_audio_track.remote_source = false; expected_local_audio_track.ended = true; @@ -1516,7 +1519,8 @@ TEST_F(RTCStatsCollectorTest, RTCMediaStreamStats>()); RTCMediaStreamTrackStats expected_local_video_track( - "RTCMediaStreamTrack_local_LocalVideoTrackID", report->timestamp_us()); + "RTCMediaStreamTrack_local_LocalVideoTrackID", report->timestamp_us(), + RTCMediaStreamTrackKind::kVideo); expected_local_video_track.track_identifier = local_video_track->id(); expected_local_video_track.remote_source = false; expected_local_video_track.ended = false; @@ -1529,7 +1533,8 @@ TEST_F(RTCStatsCollectorTest, RTCMediaStreamTrackStats>()); RTCMediaStreamTrackStats expected_remote_video_track( - "RTCMediaStreamTrack_remote_RemoteVideoTrackID", report->timestamp_us()); + "RTCMediaStreamTrack_remote_RemoteVideoTrackID", report->timestamp_us(), + RTCMediaStreamTrackKind::kVideo); expected_remote_video_track.track_identifier = remote_video_track->id(); expected_remote_video_track.remote_source = true; expected_remote_video_track.ended = true; diff --git a/webrtc/api/stats/rtcstats_objects.h b/webrtc/api/stats/rtcstats_objects.h index 1f96bcd9dc..e8a1842dbe 100644 --- a/webrtc/api/stats/rtcstats_objects.h +++ b/webrtc/api/stats/rtcstats_objects.h @@ -51,6 +51,14 @@ struct RTCDtlsTransportState { static const char* kFailed; }; +// |RTCMediaStreamTrackStats::kind| is not an enum in the spec but the only +// valid values are "audio" and "video". +// https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-kind +struct RTCMediaStreamTrackKind { + static const char* kAudio; + static const char* kVideo; +}; + // https://w3c.github.io/webrtc-stats/#certificatestats-dict* class RTCCertificateStats final : public RTCStats { public: @@ -237,8 +245,10 @@ class RTCMediaStreamTrackStats final : public RTCStats { public: WEBRTC_RTCSTATS_DECL(); - RTCMediaStreamTrackStats(const std::string& id, int64_t timestamp_us); - RTCMediaStreamTrackStats(std::string&& id, int64_t timestamp_us); + RTCMediaStreamTrackStats(const std::string& id, int64_t timestamp_us, + const char* kind); + RTCMediaStreamTrackStats(std::string&& id, int64_t timestamp_us, + const char* kind); RTCMediaStreamTrackStats(const RTCMediaStreamTrackStats& other); ~RTCMediaStreamTrackStats() override; @@ -248,6 +258,8 @@ class RTCMediaStreamTrackStats final : public RTCStats { // TODO(hbos): |RTCStatsCollector| does not return stats for detached tracks. // crbug.com/659137 RTCStatsMember detached; + // See |RTCMediaStreamTrackKind| for valid values. + RTCStatsMember kind; // Video-only members RTCStatsMember frame_width; RTCStatsMember frame_height; diff --git a/webrtc/stats/rtcstats_objects.cc b/webrtc/stats/rtcstats_objects.cc index 1b9d12a75b..af87e71740 100644 --- a/webrtc/stats/rtcstats_objects.cc +++ b/webrtc/stats/rtcstats_objects.cc @@ -35,6 +35,9 @@ const char* RTCDtlsTransportState::kConnected = "connected"; const char* RTCDtlsTransportState::kClosed = "closed"; const char* RTCDtlsTransportState::kFailed = "failed"; +const char* RTCMediaStreamTrackKind::kAudio = "audio"; +const char* RTCMediaStreamTrackKind::kVideo = "video"; + WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate", &fingerprint, &fingerprint_algorithm, @@ -350,6 +353,7 @@ WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track", &remote_source, &ended, &detached, + &kind, &frame_width, &frame_height, &frames_per_second, @@ -365,17 +369,18 @@ WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track", &echo_return_loss_enhancement); RTCMediaStreamTrackStats::RTCMediaStreamTrackStats( - const std::string& id, int64_t timestamp_us) - : RTCMediaStreamTrackStats(std::string(id), timestamp_us) { + const std::string& id, int64_t timestamp_us, const char* kind) + : RTCMediaStreamTrackStats(std::string(id), timestamp_us, kind) { } RTCMediaStreamTrackStats::RTCMediaStreamTrackStats( - std::string&& id, int64_t timestamp_us) + std::string&& id, int64_t timestamp_us, const char* kind) : RTCStats(std::move(id), timestamp_us), track_identifier("trackIdentifier"), remote_source("remoteSource"), ended("ended"), detached("detached"), + kind("kind", kind), frame_width("frameWidth"), frame_height("frameHeight"), frames_per_second("framesPerSecond"), @@ -389,6 +394,8 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats( audio_level("audioLevel"), echo_return_loss("echoReturnLoss"), echo_return_loss_enhancement("echoReturnLossEnhancement") { + RTC_DCHECK(kind == RTCMediaStreamTrackKind::kAudio || + kind == RTCMediaStreamTrackKind::kVideo); } RTCMediaStreamTrackStats::RTCMediaStreamTrackStats( @@ -398,6 +405,7 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats( remote_source(other.remote_source), ended(other.ended), detached(other.detached), + kind(other.kind), frame_width(other.frame_width), frame_height(other.frame_height), frames_per_second(other.frames_per_second),