diff options
author | imcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-07 19:47:55 +0000 |
---|---|---|
committer | imcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-07 19:47:55 +0000 |
commit | 68ccff2383a56faeb42a80cc3718b34cafa2bdb2 (patch) | |
tree | ec6f1f87001b36e939bf2bb6ce41ff01ad452239 /media | |
parent | a45683d08ea438d4619a3e2ae45671b442f5a8ea (diff) | |
download | chromium_src-68ccff2383a56faeb42a80cc3718b34cafa2bdb2.zip chromium_src-68ccff2383a56faeb42a80cc3718b34cafa2bdb2.tar.gz chromium_src-68ccff2383a56faeb42a80cc3718b34cafa2bdb2.tar.bz2 |
Cast: Add getStats() extensions API.
It works similarly as getRawEvents() with the following differences:
- it returns a dictionary that can be read more easily by the
app.
- it reads from LoggingStats. We should probably refactor it into a
subscriber implementation in a later CL.
- currently it doesn't reset stats.
Also fixes bug 347750 on the side.
Also fixes bug where we are doing std::copy to an
uninitialized range. Fix is to use a back_inserter.
Making minimal changes to the cast library to get this working. More
changes to cast library to come in future CLs.
BUG=347750,301920,338574,348491
Review URL: https://codereview.chromium.org/184853003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255689 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/cast/logging/logging_impl.cc | 9 | ||||
-rw-r--r-- | media/cast/logging/logging_impl.h | 4 | ||||
-rw-r--r-- | media/cast/logging/logging_impl_unittest.cc | 41 | ||||
-rw-r--r-- | media/cast/logging/logging_stats.cc | 93 | ||||
-rw-r--r-- | media/cast/logging/logging_stats.h | 15 |
5 files changed, 136 insertions, 26 deletions
diff --git a/media/cast/logging/logging_impl.cc b/media/cast/logging/logging_impl.cc index 75a2396..ec0099c 100644 --- a/media/cast/logging/logging_impl.cc +++ b/media/cast/logging/logging_impl.cc @@ -149,14 +149,15 @@ void LoggingImpl::RemoveRawEventSubscriber(RawEventSubscriber* subscriber) { raw_.RemoveSubscriber(subscriber); } -FrameStatsMap LoggingImpl::GetFrameStatsData() const { +FrameStatsMap LoggingImpl::GetFrameStatsData(EventMediaType media_type) const { DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); - return stats_.GetFrameStatsData(); + return stats_.GetFrameStatsData(media_type); } -PacketStatsMap LoggingImpl::GetPacketStatsData() const { +PacketStatsMap LoggingImpl::GetPacketStatsData( + EventMediaType media_type) const { DCHECK(main_thread_proxy_->RunsTasksOnCurrentThread()); - return stats_.GetPacketStatsData(); + return stats_.GetPacketStatsData(media_type); } GenericStatsMap LoggingImpl::GetGenericStatsData() const { diff --git a/media/cast/logging/logging_impl.h b/media/cast/logging/logging_impl.h index ef2cb92..e51b114 100644 --- a/media/cast/logging/logging_impl.h +++ b/media/cast/logging/logging_impl.h @@ -58,8 +58,8 @@ class LoggingImpl : public base::NonThreadSafe { void RemoveRawEventSubscriber(RawEventSubscriber* subscriber); // Get stats only. - FrameStatsMap GetFrameStatsData() const; - PacketStatsMap GetPacketStatsData() const; + FrameStatsMap GetFrameStatsData(EventMediaType media_type) const; + PacketStatsMap GetPacketStatsData(EventMediaType media_type) const; GenericStatsMap GetGenericStatsData() const; // Reset stats logging data. diff --git a/media/cast/logging/logging_impl_unittest.cc b/media/cast/logging/logging_impl_unittest.cc index 190a6b4..05d7056 100644 --- a/media/cast/logging/logging_impl_unittest.cc +++ b/media/cast/logging/logging_impl_unittest.cc @@ -77,7 +77,7 @@ TEST_F(LoggingImplTest, BasicFrameLogging) { // which equals to number of frames in this case. EXPECT_EQ(frame_id, frame_events.size()); // Verify stats. - FrameStatsMap frame_stats = logging_->GetFrameStatsData(); + FrameStatsMap frame_stats = logging_->GetFrameStatsData(AUDIO_EVENT); // Size of stats equals the number of events. EXPECT_EQ(1u, frame_stats.size()); FrameStatsMap::const_iterator it = frame_stats.find(kAudioFrameCaptured); @@ -119,7 +119,7 @@ TEST_F(LoggingImplTest, FrameLoggingWithSize) { // equals to number of frames in this case. EXPECT_EQ(frame_id, frame_events.size()); // Verify stats. - FrameStatsMap frame_stats = logging_->GetFrameStatsData(); + FrameStatsMap frame_stats = logging_->GetFrameStatsData(AUDIO_EVENT); // Size of stats equals the number of events. EXPECT_EQ(1u, frame_stats.size()); FrameStatsMap::const_iterator it = frame_stats.find(kAudioFrameCaptured); @@ -155,7 +155,7 @@ TEST_F(LoggingImplTest, FrameLoggingWithDelay) { // Size of vector should be equal to the number of frames logged. EXPECT_EQ(frame_id, frame_events.size()); // Verify stats. - FrameStatsMap frame_stats = logging_->GetFrameStatsData(); + FrameStatsMap frame_stats = logging_->GetFrameStatsData(AUDIO_EVENT); // Size of stats equals the number of events. EXPECT_EQ(1u, frame_stats.size()); FrameStatsMap::const_iterator it = frame_stats.find(kAudioFrameCaptured); @@ -208,15 +208,25 @@ TEST_F(LoggingImplTest, PacketLogging) { const int kBaseSize = 2500; const int kSizeInterval = 100; base::TimeTicks start_time = testing_clock_.NowTicks(); + base::TimeTicks latest_time; base::TimeDelta time_interval = testing_clock_.NowTicks() - start_time; - uint32 rtp_timestamp = 0; - uint32 frame_id = 0; + RtpTimestamp rtp_timestamp = 0; + int frame_id = 0; + int num_packets = 0; + int sum_size = 0u; do { for (int i = 0; i < kNumPacketsPerFrame; ++i) { int size = kBaseSize + base::RandInt(-kSizeInterval, kSizeInterval); - logging_->InsertPacketEvent(testing_clock_.NowTicks(), kPacketSentToPacer, - rtp_timestamp, frame_id, i, - kNumPacketsPerFrame, size); + sum_size += size; + latest_time = testing_clock_.NowTicks(); + ++num_packets; + logging_->InsertPacketEvent(latest_time, + kDuplicateVideoPacketReceived, + rtp_timestamp, + frame_id, + i, + kNumPacketsPerFrame, + size); } testing_clock_.Advance(base::TimeDelta::FromMilliseconds(kFrameIntervalMs)); rtp_timestamp += kFrameIntervalMs * 90; @@ -227,13 +237,18 @@ TEST_F(LoggingImplTest, PacketLogging) { std::vector<PacketEvent> packet_events; event_subscriber_.GetPacketEventsAndReset(&packet_events); // Size of vector should be equal to the number of packets logged. - EXPECT_EQ(frame_id * kNumPacketsPerFrame, packet_events.size()); + EXPECT_EQ(num_packets, static_cast<int>(packet_events.size())); // Verify stats. - PacketStatsMap stats_map = logging_->GetPacketStatsData(); - // Size of stats equals the number of events. + PacketStatsMap stats_map = logging_->GetPacketStatsData(VIDEO_EVENT); + // Size of stats equals the number of event types. EXPECT_EQ(1u, stats_map.size()); - PacketStatsMap::const_iterator it = stats_map.find(kPacketSentToPacer); - EXPECT_TRUE(it != stats_map.end()); + PacketStatsMap::const_iterator it = + stats_map.find(kDuplicateVideoPacketReceived); + ASSERT_NE(stats_map.end(), it); + EXPECT_EQ(start_time, it->second.first_event_time); + EXPECT_EQ(latest_time, it->second.last_event_time); + EXPECT_EQ(num_packets, it->second.event_counter); + EXPECT_EQ(sum_size, static_cast<int>(it->second.sum_size)); } TEST_F(LoggingImplTest, GenericLogging) { diff --git a/media/cast/logging/logging_stats.cc b/media/cast/logging/logging_stats.cc index e9e6d72..08ed47a 100644 --- a/media/cast/logging/logging_stats.cc +++ b/media/cast/logging/logging_stats.cc @@ -6,6 +6,7 @@ #include "base/logging.h" #include "base/memory/scoped_ptr.h" +#include "base/values.h" namespace media { namespace cast { @@ -75,8 +76,8 @@ void LoggingStats::InsertBaseFrameEvent(const base::TimeTicks& time_of_event, stats.event_counter = 1; frame_stats_.insert(std::make_pair(event, stats)); } else { - it->second.last_event_time = time_of_event; ++(it->second.event_counter); + it->second.last_event_time = time_of_event; } } @@ -101,6 +102,7 @@ void LoggingStats::InsertPacketEvent(const base::TimeTicks& time_of_event, // Add to an existing event. it->second.sum_size += size; ++(it->second.event_counter); + it->second.last_event_time = time_of_event; } } @@ -133,17 +135,98 @@ void LoggingStats::InsertGenericEvent(const base::TimeTicks& time_of_event, } } -FrameStatsMap LoggingStats::GetFrameStatsData() const { - return frame_stats_; +FrameStatsMap LoggingStats::GetFrameStatsData(EventMediaType media_type) const { + DCHECK(media_type == AUDIO_EVENT || media_type == VIDEO_EVENT); + + FrameStatsMap frame_map_to_return; + for (FrameStatsMap::const_iterator it = frame_stats_.begin(); + it != frame_stats_.end(); + ++it) { + if (GetEventMediaType(it->first) == media_type) { + frame_map_to_return.insert(std::make_pair(it->first, it->second)); + } + } + + return frame_map_to_return; } -PacketStatsMap LoggingStats::GetPacketStatsData() const { - return packet_stats_; +PacketStatsMap LoggingStats::GetPacketStatsData( + EventMediaType media_type) const { + DCHECK(media_type == AUDIO_EVENT || media_type == VIDEO_EVENT); + + PacketStatsMap packet_map_to_return; + for (PacketStatsMap::const_iterator it = packet_stats_.begin(); + it != packet_stats_.end(); + ++it) { + if (GetEventMediaType(it->first) == media_type) { + packet_map_to_return.insert(std::make_pair(it->first, it->second)); + } + } + + return packet_map_to_return; } GenericStatsMap LoggingStats::GetGenericStatsData() const { return generic_stats_; } +scoped_ptr<base::DictionaryValue> ConvertStats( + const FrameStatsMap& frame_stats_map, + const PacketStatsMap& packet_stats_map) { + scoped_ptr<base::DictionaryValue> overall_stats(new base::DictionaryValue); + + scoped_ptr<base::DictionaryValue> overall_frame_stats( + new base::DictionaryValue); + for (FrameStatsMap::const_iterator it = frame_stats_map.begin(); + it != frame_stats_map.end(); + ++it) { + scoped_ptr<base::DictionaryValue> frame_stats(new base::DictionaryValue); + + frame_stats->SetDouble("firstEventTime", + it->second.first_event_time.ToInternalValue()); + frame_stats->SetDouble("lastEventTime", + it->second.last_event_time.ToInternalValue()); + frame_stats->SetInteger("count", it->second.event_counter); + frame_stats->SetInteger("sizeTotal", + static_cast<int>(it->second.sum_size)); + frame_stats->SetInteger("minDelayMs", + it->second.min_delay.InMilliseconds()); + frame_stats->SetInteger("maxDelayMs", + it->second.max_delay.InMilliseconds()); + frame_stats->SetInteger("sumDelayMs", + it->second.sum_delay.InMilliseconds()); + + overall_frame_stats->Set(CastLoggingToString(it->first), + frame_stats.release()); + } + + overall_stats->Set("frameStats", overall_frame_stats.release()); + + scoped_ptr<base::DictionaryValue> overall_packet_stats( + new base::DictionaryValue); + for (PacketStatsMap::const_iterator it = packet_stats_map.begin(); + it != packet_stats_map.end(); + ++it) { + scoped_ptr<base::DictionaryValue> packet_stats(new base::DictionaryValue); + + packet_stats->SetDouble("firstEventTime", + it->second.first_event_time.ToInternalValue()); + packet_stats->SetDouble("lastEventTime", + it->second.last_event_time.ToInternalValue()); + packet_stats->SetDouble("lastEventTime", + it->second.last_event_time.ToInternalValue()); + packet_stats->SetInteger("count", it->second.event_counter); + packet_stats->SetInteger("sizeTotal", + static_cast<int>(it->second.sum_size)); + + overall_packet_stats->Set(CastLoggingToString(it->first), + packet_stats.release()); + } + + overall_stats->Set("packetStats", overall_packet_stats.release()); + + return overall_stats.Pass(); +} + } // namespace cast } // namespace media diff --git a/media/cast/logging/logging_stats.h b/media/cast/logging/logging_stats.h index eb5745e..e04db8d 100644 --- a/media/cast/logging/logging_stats.h +++ b/media/cast/logging/logging_stats.h @@ -6,9 +6,14 @@ #define MEDIA_CAST_LOGGING_LOGGING_STATS_H_ #include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" #include "base/time/time.h" #include "media/cast/logging/logging_defines.h" +namespace base { +class DictionaryValue; +} + namespace media { namespace cast { @@ -47,9 +52,9 @@ class LoggingStats { void InsertGenericEvent(const base::TimeTicks& time_of_event, CastLoggingEvent event, int value); - FrameStatsMap GetFrameStatsData() const; + FrameStatsMap GetFrameStatsData(EventMediaType media_type) const; - PacketStatsMap GetPacketStatsData() const; + PacketStatsMap GetPacketStatsData(EventMediaType media_type) const; GenericStatsMap GetGenericStatsData() const; @@ -66,6 +71,12 @@ class LoggingStats { DISALLOW_COPY_AND_ASSIGN(LoggingStats); }; +// Converts stats provided in |frame_stats_map| and |packet_stats_map| to +// base::DictionaryValue format. See .cc file for the exact structure. +scoped_ptr<base::DictionaryValue> ConvertStats( + const FrameStatsMap& frame_stats_map, + const PacketStatsMap& packet_stats_map); + } // namespace cast } // namespace media |