summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorimcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-07 19:47:55 +0000
committerimcheng@chromium.org <imcheng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-07 19:47:55 +0000
commit68ccff2383a56faeb42a80cc3718b34cafa2bdb2 (patch)
treeec6f1f87001b36e939bf2bb6ce41ff01ad452239 /media
parenta45683d08ea438d4619a3e2ae45671b442f5a8ea (diff)
downloadchromium_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.cc9
-rw-r--r--media/cast/logging/logging_impl.h4
-rw-r--r--media/cast/logging/logging_impl_unittest.cc41
-rw-r--r--media/cast/logging/logging_stats.cc93
-rw-r--r--media/cast/logging/logging_stats.h15
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