blob: 14f6b829af417622259957395d4c9a8a3f9f95f7 [file] [log] [blame]
/*
* Copyright 2012 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "media/base/shell_media_statistics.h"
#include <limits>
#include "base/basictypes.h"
namespace media {
ShellMediaStatistics::ShellMediaStatistics() {
Reset(true); // reset all stats, include global stats.
}
void ShellMediaStatistics::OnPlaybackBegin() {
Reset(false); // reset non-global stats.
}
void ShellMediaStatistics::record(StatType type, int64 value) {
if (type == STAT_TYPE_VIDEO_WIDTH)
type = STAT_TYPE_VIDEO_WIDTH;
++stats_[type].times_;
stats_[type].total_ += value;
if (value > stats_[type].max_)
stats_[type].max_ = value;
if (value < stats_[type].min_)
stats_[type].min_ = value;
stats_[type].current_ = value;
}
void ShellMediaStatistics::record(StatType type,
const base::TimeDelta& duration) {
record(type, duration.ToInternalValue());
}
double ShellMediaStatistics::GetElapsedTime() const {
return (base::Time::Now() - start_).InSecondsF();
}
int64 ShellMediaStatistics::GetTimes(StatType type) const {
return stats_[type].times_;
}
int64 ShellMediaStatistics::GetTotal(StatType type) const {
return stats_[type].total_;
}
int64 ShellMediaStatistics::GetCurrent(StatType type) const {
return stats_[type].current_;
}
int64 ShellMediaStatistics::GetAverage(StatType type) const {
if (stats_[type].times_ == 0)
return 0;
return stats_[type].total_ / stats_[type].times_;
}
int64 ShellMediaStatistics::GetMin(StatType type) const {
return stats_[type].min_;
}
int64 ShellMediaStatistics::GetMax(StatType type) const {
return stats_[type].max_;
}
double ShellMediaStatistics::GetTotalDuration(StatType type) const {
return base::TimeDelta::FromInternalValue(GetTotal(type)).InSecondsF();
}
double ShellMediaStatistics::GetCurrentDuration(StatType type) const {
return base::TimeDelta::FromInternalValue(GetCurrent(type)).InSecondsF();
}
double ShellMediaStatistics::GetAverageDuration(StatType type) const {
return base::TimeDelta::FromInternalValue(GetAverage(type)).InSecondsF();
}
double ShellMediaStatistics::GetMinDuration(StatType type) const {
return base::TimeDelta::FromInternalValue(GetMin(type)).InSecondsF();
}
double ShellMediaStatistics::GetMaxDuration(StatType type) const {
return base::TimeDelta::FromInternalValue(GetMax(type)).InSecondsF();
}
// static
ShellMediaStatistics& ShellMediaStatistics::Instance() {
static ShellMediaStatistics media_statistics;
return media_statistics;
}
void ShellMediaStatistics::Reset(bool include_global_stats) {
start_ = base::Time::Now();
int items_to_reset =
include_global_stats ? arraysize(stats_) : STAT_TYPE_START_OF_GLOBAL_STAT;
for (int i = 0; i < items_to_reset; ++i) {
// We deliberately not reset current_ so its value can be kept after reset.
stats_[i].times_ = 0;
stats_[i].total_ = 0;
stats_[i].min_ = std::numeric_limits<int64>::max();
stats_[i].max_ = std::numeric_limits<int64>::min();
}
}
ShellScopedMediaStat::ShellScopedMediaStat(ShellMediaStatistics::StatType type)
: type_(type), start_(base::Time::Now()) {}
ShellScopedMediaStat::~ShellScopedMediaStat() {
ShellMediaStatistics::Instance().record(type_, base::Time::Now() - start_);
}
} // namespace media