diff --git a/api/stats/rtc_stats.h b/api/stats/rtc_stats.h index 2407ce004c..ff793361eb 100644 --- a/api/stats/rtc_stats.h +++ b/api/stats/rtc_stats.h @@ -319,8 +319,19 @@ class RTC_EXPORT RTCStatsMember : public RTCStatsMemberInterface { T value_; }; -// Same as above, but "is_standardized" returns false. -// +// Non-standard stats members can be exposed to the JavaScript API in Chrome +// e.g. through origin trials. The group ID can be used by the blink layer to +// determine if a stats member should be exposed or not. Multiple non-standard +// stats members can share the same group ID so that they are exposed together. +enum class NonStandardGroupId { + // I2E: + // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/hE2B1iItPDk + kRtcAudioJitterBufferMaxPackets, + // I2E: + // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/YbhMyqLXXXo + kRtcStatsRelativePacketArrivalDelay, +}; + // Using inheritance just so that it's obvious from the member's declaration // whether it's standardized or not. template @@ -328,21 +339,30 @@ class RTCNonStandardStatsMember : public RTCStatsMember { public: explicit RTCNonStandardStatsMember(const char* name) : RTCStatsMember(name) {} + RTCNonStandardStatsMember(const char* name, + std::initializer_list group_ids) + : RTCStatsMember(name), group_ids_(group_ids) {} RTCNonStandardStatsMember(const char* name, const T& value) : RTCStatsMember(name, value) {} RTCNonStandardStatsMember(const char* name, T&& value) : RTCStatsMember(name, std::move(value)) {} explicit RTCNonStandardStatsMember(const RTCNonStandardStatsMember& other) - : RTCStatsMember(other) {} + : RTCStatsMember(other), group_ids_(other.group_ids_) {} explicit RTCNonStandardStatsMember(RTCNonStandardStatsMember&& other) - : RTCStatsMember(std::move(other)) {} + : group_ids_(std::move(other.group_ids_)), + RTCStatsMember(std::move(other)) {} bool is_standardized() const override { return false; } + std::vector group_ids() const { return group_ids_; } + T& operator=(const T& value) { return RTCStatsMember::operator=(value); } T& operator=(const T&& value) { return RTCStatsMember::operator=(std::move(value)); } + + private: + std::vector group_ids_; }; } // namespace webrtc diff --git a/stats/rtc_stats_unittest.cc b/stats/rtc_stats_unittest.cc index 0755660a0f..1a948ba32b 100644 --- a/stats/rtc_stats_unittest.cc +++ b/stats/rtc_stats_unittest.cc @@ -339,6 +339,16 @@ TEST(RTCStatsTest, IsStandardized) { EXPECT_FALSE(unstandardized.is_standardized()); } +TEST(RTCStatsTest, NonStandardGroupId) { + auto group_id = NonStandardGroupId::kRtcAudioJitterBufferMaxPackets; + RTCNonStandardStatsMember with_group_id("stat", {group_id}); + std::vector expected_ids({group_id}); + EXPECT_EQ(expected_ids, with_group_id.group_ids()); + + RTCNonStandardStatsMember without_group_id("stat"); + EXPECT_TRUE(without_group_id.group_ids().empty()); +} + // Death tests. // Disabled on Android because death tests misbehave on Android, see // base/test/gtest_util.h. diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc index ccf2574a8e..69b5e0af8b 100644 --- a/stats/rtcstats_objects.cc +++ b/stats/rtcstats_objects.cc @@ -14,6 +14,8 @@ #include "rtc_base/checks.h" +#include "api/stats/rtc_stats.h" + namespace webrtc { const char* const RTCDataChannelState::kConnecting = "connecting"; @@ -426,9 +428,16 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(std::string&& id, total_samples_duration("totalSamplesDuration"), concealed_samples("concealedSamples"), concealment_events("concealmentEvents"), - jitter_buffer_flushes("jitterBufferFlushes"), - delayed_packet_outage_samples("delayedPacketOutageSamples"), - relative_packet_arrival_delay("relativePacketArrivalDelay"), + jitter_buffer_flushes( + "jitterBufferFlushes", + {NonStandardGroupId::kRtcAudioJitterBufferMaxPackets}), + delayed_packet_outage_samples( + "delayedPacketOutageSamples", + {NonStandardGroupId::kRtcAudioJitterBufferMaxPackets, + NonStandardGroupId::kRtcStatsRelativePacketArrivalDelay}), + relative_packet_arrival_delay( + "relativePacketArrivalDelay", + {NonStandardGroupId::kRtcStatsRelativePacketArrivalDelay}), freeze_count("freezeCount"), pause_count("pauseCount"), total_freezes_duration("totalFreezesDuration"),