Commit 5837bd97 authored by Dale Curtis's avatar Dale Curtis Committed by Commit Bot

Move all watch time related keys into their own file.

Per MTBR review, this list is growing too big to keep living inside
MediaLog; so create a new home for all watch time related keys in
a new "watch_time_keys.{h,cc} file.

BUG=none
TEST=compiles

Change-Id: Ib927f21f04d0a321dac0eec8cc81af74302334e3
Reviewed-on: https://chromium-review.googlesource.com/521804Reviewed-by: default avatarXiaohan Wang <xhwang@chromium.org>
Commit-Queue: Dale Curtis <dalecurtis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#476489}
parent 64a1c51d
......@@ -31,6 +31,7 @@
#include "content/public/browser/web_ui.h"
#include "media/base/audio_parameters.h"
#include "media/base/media_log_event.h"
#include "media/base/watch_time_keys.h"
#include "media/filters/gpu_video_decoder.h"
#if !defined(OS_ANDROID)
......@@ -463,20 +464,20 @@ class MediaInternals::MediaInternalsUMAHandler {
MediaInternals::MediaInternalsUMAHandler::MediaInternalsUMAHandler(
content::MediaInternals* media_internals)
: watch_time_keys_(media::MediaLog::GetWatchTimeKeys()),
watch_time_power_keys_(media::MediaLog::GetWatchTimePowerKeys()),
mtbr_keys_({{media::MediaLog::kWatchTimeAudioSrc,
media::MediaLog::kMeanTimeBetweenRebuffersAudioSrc},
{media::MediaLog::kWatchTimeAudioMse,
media::MediaLog::kMeanTimeBetweenRebuffersAudioMse},
{media::MediaLog::kWatchTimeAudioEme,
media::MediaLog::kMeanTimeBetweenRebuffersAudioEme},
{media::MediaLog::kWatchTimeAudioVideoSrc,
media::MediaLog::kMeanTimeBetweenRebuffersAudioVideoSrc},
{media::MediaLog::kWatchTimeAudioVideoMse,
media::MediaLog::kMeanTimeBetweenRebuffersAudioVideoMse},
{media::MediaLog::kWatchTimeAudioVideoEme,
media::MediaLog::kMeanTimeBetweenRebuffersAudioVideoEme}},
: watch_time_keys_(media::GetWatchTimeKeys()),
watch_time_power_keys_(media::GetWatchTimePowerKeys()),
mtbr_keys_({{media::kWatchTimeAudioSrc,
media::kMeanTimeBetweenRebuffersAudioSrc},
{media::kWatchTimeAudioMse,
media::kMeanTimeBetweenRebuffersAudioMse},
{media::kWatchTimeAudioEme,
media::kMeanTimeBetweenRebuffersAudioEme},
{media::kWatchTimeAudioVideoSrc,
media::kMeanTimeBetweenRebuffersAudioVideoSrc},
{media::kWatchTimeAudioVideoMse,
media::kMeanTimeBetweenRebuffersAudioVideoMse},
{media::kWatchTimeAudioVideoEme,
media::kMeanTimeBetweenRebuffersAudioVideoEme}},
base::KEEP_FIRST_OF_DUPES),
media_internals_(media_internals) {}
......@@ -574,24 +575,23 @@ void MediaInternals::MediaInternalsUMAHandler::SavePlayerState(
base::TimeDelta::FromSecondsD(it.value().GetDouble());
}
if (event.params.HasKey(media::MediaLog::kUnderflowCount)) {
event.params.GetInteger(media::MediaLog::kUnderflowCount,
if (event.params.HasKey(media::kWatchTimeUnderflowCount)) {
event.params.GetInteger(media::kWatchTimeUnderflowCount,
&player_info.underflow_count);
}
if (event.params.HasKey(media::MediaLog::kWatchTimeFinalize)) {
if (event.params.HasKey(media::kWatchTimeFinalize)) {
bool should_finalize;
DCHECK(event.params.GetBoolean(media::MediaLog::kWatchTimeFinalize,
DCHECK(event.params.GetBoolean(media::kWatchTimeFinalize,
&should_finalize) &&
should_finalize);
FinalizeWatchTime(player_info.has_video, player_info.origin_url,
&player_info.underflow_count,
&player_info.watch_time_info,
FinalizeType::EVERYTHING);
} else if (event.params.HasKey(
media::MediaLog::kWatchTimeFinalizePower)) {
} else if (event.params.HasKey(media::kWatchTimeFinalizePower)) {
bool should_finalize;
DCHECK(event.params.GetBoolean(media::MediaLog::kWatchTimeFinalizePower,
DCHECK(event.params.GetBoolean(media::kWatchTimeFinalizePower,
&should_finalize) &&
should_finalize);
FinalizeWatchTime(player_info.has_video, player_info.origin_url,
......
......@@ -21,6 +21,7 @@
#include "media/base/audio_parameters.h"
#include "media/base/channel_layout.h"
#include "media/base/media_log.h"
#include "media/base/watch_time_keys.h"
#include "media/blink/watch_time_reporter.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -344,8 +345,8 @@ class MediaInternalsWatchTimeTest : public testing::Test,
media_log_(new DirectMediaLog(render_process_id_)),
histogram_tester_(new base::HistogramTester()),
test_recorder_(new ukm::TestUkmRecorder()),
watch_time_keys_(media::MediaLog::GetWatchTimeKeys()),
watch_time_power_keys_(media::MediaLog::GetWatchTimePowerKeys()) {
watch_time_keys_(media::GetWatchTimeKeys()),
watch_time_power_keys_(media::GetWatchTimePowerKeys()) {
media_log_->AddEvent(media_log_->CreateCreatedEvent(kTestOrigin));
}
......@@ -438,13 +439,12 @@ TEST_F(MediaInternalsWatchTimeTest, BasicAudio) {
CycleWatchTimeReporter();
wtr_.reset();
ExpectWatchTime(
{media::MediaLog::kWatchTimeAudioAll, media::MediaLog::kWatchTimeAudioMse,
media::MediaLog::kWatchTimeAudioEme, media::MediaLog::kWatchTimeAudioAc,
media::MediaLog::kWatchTimeAudioEmbeddedExperience},
kWatchTimeLate);
ExpectMtbrTime({media::MediaLog::kMeanTimeBetweenRebuffersAudioMse,
media::MediaLog::kMeanTimeBetweenRebuffersAudioEme},
ExpectWatchTime({media::kWatchTimeAudioAll, media::kWatchTimeAudioMse,
media::kWatchTimeAudioEme, media::kWatchTimeAudioAc,
media::kWatchTimeAudioEmbeddedExperience},
kWatchTimeLate);
ExpectMtbrTime({media::kMeanTimeBetweenRebuffersAudioMse,
media::kMeanTimeBetweenRebuffersAudioEme},
kWatchTimeLate / 2);
ASSERT_EQ(1U, test_recorder_->sources_count());
......@@ -472,14 +472,13 @@ TEST_F(MediaInternalsWatchTimeTest, BasicVideo) {
CycleWatchTimeReporter();
wtr_.reset();
ExpectWatchTime({media::MediaLog::kWatchTimeAudioVideoAll,
media::MediaLog::kWatchTimeAudioVideoSrc,
media::MediaLog::kWatchTimeAudioVideoEme,
media::MediaLog::kWatchTimeAudioVideoAc,
media::MediaLog::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
ExpectMtbrTime({media::MediaLog::kMeanTimeBetweenRebuffersAudioVideoSrc,
media::MediaLog::kMeanTimeBetweenRebuffersAudioVideoEme},
ExpectWatchTime(
{media::kWatchTimeAudioVideoAll, media::kWatchTimeAudioVideoSrc,
media::kWatchTimeAudioVideoEme, media::kWatchTimeAudioVideoAc,
media::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
ExpectMtbrTime({media::kMeanTimeBetweenRebuffersAudioVideoSrc,
media::kMeanTimeBetweenRebuffersAudioVideoEme},
kWatchTimeLate / 2);
ASSERT_EQ(1U, test_recorder_->sources_count());
......@@ -514,18 +513,17 @@ TEST_F(MediaInternalsWatchTimeTest, BasicPower) {
CycleWatchTimeReporter();
// This should finalize the power watch time on battery.
ExpectWatchTime({media::MediaLog::kWatchTimeAudioVideoBattery}, kWatchTime2);
ExpectWatchTime({media::kWatchTimeAudioVideoBattery}, kWatchTime2);
ResetHistogramTester();
wtr_.reset();
std::vector<base::StringPiece> normal_keys = {
media::MediaLog::kWatchTimeAudioVideoAll,
media::MediaLog::kWatchTimeAudioVideoSrc,
media::MediaLog::kWatchTimeAudioVideoEme,
media::MediaLog::kWatchTimeAudioVideoEmbeddedExperience};
media::kWatchTimeAudioVideoAll, media::kWatchTimeAudioVideoSrc,
media::kWatchTimeAudioVideoEme,
media::kWatchTimeAudioVideoEmbeddedExperience};
for (auto key : watch_time_keys_) {
if (key == media::MediaLog::kWatchTimeAudioVideoAc) {
if (key == media::kWatchTimeAudioVideoAc) {
histogram_tester_->ExpectUniqueSample(
key.as_string(), (kWatchTime3 - kWatchTime2).InMilliseconds(), 1);
continue;
......@@ -576,13 +574,12 @@ TEST_F(MediaInternalsWatchTimeTest, BasicHidden) {
CycleWatchTimeReporter();
wtr_.reset();
ExpectWatchTime(
{media::MediaLog::kWatchTimeAudioVideoBackgroundAll,
media::MediaLog::kWatchTimeAudioVideoBackgroundSrc,
media::MediaLog::kWatchTimeAudioVideoBackgroundEme,
media::MediaLog::kWatchTimeAudioVideoBackgroundAc,
media::MediaLog::kWatchTimeAudioVideoBackgroundEmbeddedExperience},
kWatchTimeLate);
ExpectWatchTime({media::kWatchTimeAudioVideoBackgroundAll,
media::kWatchTimeAudioVideoBackgroundSrc,
media::kWatchTimeAudioVideoBackgroundEme,
media::kWatchTimeAudioVideoBackgroundAc,
media::kWatchTimeAudioVideoBackgroundEmbeddedExperience},
kWatchTimeLate);
ASSERT_EQ(1U, test_recorder_->sources_count());
ExpectUkmWatchTime(0, 4, kWatchTimeLate);
......@@ -609,12 +606,11 @@ TEST_F(MediaInternalsWatchTimeTest, PlayerDestructionFinalizes) {
media_log_->AddEvent(
media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED));
ExpectWatchTime({media::MediaLog::kWatchTimeAudioVideoAll,
media::MediaLog::kWatchTimeAudioVideoSrc,
media::MediaLog::kWatchTimeAudioVideoEme,
media::MediaLog::kWatchTimeAudioVideoAc,
media::MediaLog::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
ExpectWatchTime(
{media::kWatchTimeAudioVideoAll, media::kWatchTimeAudioVideoSrc,
media::kWatchTimeAudioVideoEme, media::kWatchTimeAudioVideoAc,
media::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
ASSERT_EQ(1U, test_recorder_->sources_count());
ExpectUkmWatchTime(0, 4, kWatchTimeLate);
......@@ -641,12 +637,11 @@ TEST_F(MediaInternalsWatchTimeTest, ProcessDestructionFinalizes) {
// Also verify that if UKM has already been destructed, we don't crash.
test_recorder_.reset();
internals_->OnProcessTerminatedForTesting(render_process_id_);
ExpectWatchTime({media::MediaLog::kWatchTimeAudioVideoAll,
media::MediaLog::kWatchTimeAudioVideoSrc,
media::MediaLog::kWatchTimeAudioVideoEme,
media::MediaLog::kWatchTimeAudioVideoAc,
media::MediaLog::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
ExpectWatchTime(
{media::kWatchTimeAudioVideoAll, media::kWatchTimeAudioVideoSrc,
media::kWatchTimeAudioVideoEme, media::kWatchTimeAudioVideoAc,
media::kWatchTimeAudioVideoEmbeddedExperience},
kWatchTimeLate);
}
} // namespace content
......@@ -269,6 +269,8 @@ target(link_target_type, "base") {
"video_util.h",
"wall_clock_time_source.cc",
"wall_clock_time_source.h",
"watch_time_keys.cc",
"watch_time_keys.h",
]
allow_circular_includes_from = []
......
......@@ -17,99 +17,6 @@ namespace media {
// unique IDs.
static base::StaticAtomicSequenceNumber g_media_log_count;
// Audio+video watch time metrics.
const char MediaLog::kWatchTimeAudioVideoAll[] =
"Media.WatchTime.AudioVideo.All";
const char MediaLog::kWatchTimeAudioVideoMse[] =
"Media.WatchTime.AudioVideo.MSE";
const char MediaLog::kWatchTimeAudioVideoEme[] =
"Media.WatchTime.AudioVideo.EME";
const char MediaLog::kWatchTimeAudioVideoSrc[] =
"Media.WatchTime.AudioVideo.SRC";
const char MediaLog::kWatchTimeAudioVideoBattery[] =
"Media.WatchTime.AudioVideo.Battery";
const char MediaLog::kWatchTimeAudioVideoAc[] = "Media.WatchTime.AudioVideo.AC";
const char MediaLog::kWatchTimeAudioVideoEmbeddedExperience[] =
"Media.WatchTime.AudioVideo.EmbeddedExperience";
// Audio only "watch time" metrics.
const char MediaLog::kWatchTimeAudioAll[] = "Media.WatchTime.Audio.All";
const char MediaLog::kWatchTimeAudioMse[] = "Media.WatchTime.Audio.MSE";
const char MediaLog::kWatchTimeAudioEme[] = "Media.WatchTime.Audio.EME";
const char MediaLog::kWatchTimeAudioSrc[] = "Media.WatchTime.Audio.SRC";
const char MediaLog::kWatchTimeAudioBattery[] = "Media.WatchTime.Audio.Battery";
const char MediaLog::kWatchTimeAudioAc[] = "Media.WatchTime.Audio.AC";
const char MediaLog::kWatchTimeAudioEmbeddedExperience[] =
"Media.WatchTime.Audio.EmbeddedExperience";
// Audio+video background watch time metrics.
const char MediaLog::kWatchTimeAudioVideoBackgroundAll[] =
"Media.WatchTime.AudioVideo.Background.All";
const char MediaLog::kWatchTimeAudioVideoBackgroundMse[] =
"Media.WatchTime.AudioVideo.Background.MSE";
const char MediaLog::kWatchTimeAudioVideoBackgroundEme[] =
"Media.WatchTime.AudioVideo.Background.EME";
const char MediaLog::kWatchTimeAudioVideoBackgroundSrc[] =
"Media.WatchTime.AudioVideo.Background.SRC";
const char MediaLog::kWatchTimeAudioVideoBackgroundBattery[] =
"Media.WatchTime.AudioVideo.Background.Battery";
const char MediaLog::kWatchTimeAudioVideoBackgroundAc[] =
"Media.WatchTime.AudioVideo.Background.AC";
const char MediaLog::kWatchTimeAudioVideoBackgroundEmbeddedExperience[] =
"Media.WatchTime.AudioVideo.Background.EmbeddedExperience";
const char MediaLog::kWatchTimeFinalize[] = "FinalizeWatchTime";
const char MediaLog::kWatchTimeFinalizePower[] = "FinalizePowerWatchTime";
const char MediaLog::kUnderflowCount[] = "UnderflowCount";
const char MediaLog::kMeanTimeBetweenRebuffersAudioSrc[] =
"Media.MeanTimeBetweenRebuffers.Audio.SRC";
const char MediaLog::kMeanTimeBetweenRebuffersAudioMse[] =
"Media.MeanTimeBetweenRebuffers.Audio.MSE";
const char MediaLog::kMeanTimeBetweenRebuffersAudioEme[] =
"Media.MeanTimeBetweenRebuffers.Audio.EME";
const char MediaLog::kMeanTimeBetweenRebuffersAudioVideoSrc[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.SRC";
const char MediaLog::kMeanTimeBetweenRebuffersAudioVideoMse[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.MSE";
const char MediaLog::kMeanTimeBetweenRebuffersAudioVideoEme[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.EME";
base::flat_set<base::StringPiece> MediaLog::GetWatchTimeKeys() {
return base::flat_set<base::StringPiece>(
{kWatchTimeAudioAll,
kWatchTimeAudioMse,
kWatchTimeAudioEme,
kWatchTimeAudioSrc,
kWatchTimeAudioBattery,
kWatchTimeAudioAc,
kWatchTimeAudioEmbeddedExperience,
kWatchTimeAudioVideoAll,
kWatchTimeAudioVideoMse,
kWatchTimeAudioVideoEme,
kWatchTimeAudioVideoSrc,
kWatchTimeAudioVideoBattery,
kWatchTimeAudioVideoAc,
kWatchTimeAudioVideoEmbeddedExperience,
kWatchTimeAudioVideoBackgroundAll,
kWatchTimeAudioVideoBackgroundMse,
kWatchTimeAudioVideoBackgroundEme,
kWatchTimeAudioVideoBackgroundSrc,
kWatchTimeAudioVideoBackgroundBattery,
kWatchTimeAudioVideoBackgroundAc,
kWatchTimeAudioVideoBackgroundEmbeddedExperience},
base::KEEP_FIRST_OF_DUPES);
}
base::flat_set<base::StringPiece> MediaLog::GetWatchTimePowerKeys() {
return base::flat_set<base::StringPiece>(
{kWatchTimeAudioBattery, kWatchTimeAudioAc, kWatchTimeAudioVideoBattery,
kWatchTimeAudioVideoAc, kWatchTimeAudioVideoBackgroundBattery,
kWatchTimeAudioVideoBackgroundAc},
base::KEEP_FIRST_OF_DUPES);
}
std::string MediaLog::MediaLogLevelToString(MediaLogLevel level) {
switch (level) {
case MEDIALOG_ERROR:
......
......@@ -12,7 +12,6 @@
#include <sstream>
#include <string>
#include "base/containers/flat_set.h"
#include "base/logging.h"
#include "base/macros.h"
#include "media/base/buffering_state.h"
......@@ -107,49 +106,6 @@ class MEDIA_EXPORT MediaLog {
void SetDoubleProperty(const std::string& key, double value);
void SetBooleanProperty(const std::string& key, bool value);
// Histogram names used for reporting; also double as MediaLog key names.
// NOTE: If you add to this list you must update GetWatchTimeKeys() and if
// necessary, GetWatchTimePowerKeys().
static const char kWatchTimeAudioAll[];
static const char kWatchTimeAudioMse[];
static const char kWatchTimeAudioEme[];
static const char kWatchTimeAudioSrc[];
static const char kWatchTimeAudioBattery[];
static const char kWatchTimeAudioAc[];
static const char kWatchTimeAudioEmbeddedExperience[];
static const char kWatchTimeAudioVideoAll[];
static const char kWatchTimeAudioVideoMse[];
static const char kWatchTimeAudioVideoEme[];
static const char kWatchTimeAudioVideoSrc[];
static const char kWatchTimeAudioVideoBattery[];
static const char kWatchTimeAudioVideoAc[];
static const char kWatchTimeAudioVideoEmbeddedExperience[];
static const char kWatchTimeAudioVideoBackgroundAll[];
static const char kWatchTimeAudioVideoBackgroundMse[];
static const char kWatchTimeAudioVideoBackgroundEme[];
static const char kWatchTimeAudioVideoBackgroundSrc[];
static const char kWatchTimeAudioVideoBackgroundBattery[];
static const char kWatchTimeAudioVideoBackgroundAc[];
static const char kWatchTimeAudioVideoBackgroundEmbeddedExperience[];
// Markers which signify the watch time should be finalized immediately.
static const char kWatchTimeFinalize[];
static const char kWatchTimeFinalizePower[];
// Count of the number of underflow events during a media session.
static const char kUnderflowCount[];
// UMA keys for MTBR samples.
static const char kMeanTimeBetweenRebuffersAudioSrc[];
static const char kMeanTimeBetweenRebuffersAudioMse[];
static const char kMeanTimeBetweenRebuffersAudioEme[];
static const char kMeanTimeBetweenRebuffersAudioVideoSrc[];
static const char kMeanTimeBetweenRebuffersAudioVideoMse[];
static const char kMeanTimeBetweenRebuffersAudioVideoEme[];
static base::flat_set<base::StringPiece> GetWatchTimeKeys();
static base::flat_set<base::StringPiece> GetWatchTimePowerKeys();
private:
// A unique (to this process) id for this MediaLog.
int32_t id_;
......
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/base/watch_time_keys.h"
namespace media {
// Audio+video watch time metrics.
const char kWatchTimeAudioVideoAll[] = "Media.WatchTime.AudioVideo.All";
const char kWatchTimeAudioVideoMse[] = "Media.WatchTime.AudioVideo.MSE";
const char kWatchTimeAudioVideoEme[] = "Media.WatchTime.AudioVideo.EME";
const char kWatchTimeAudioVideoSrc[] = "Media.WatchTime.AudioVideo.SRC";
const char kWatchTimeAudioVideoBattery[] = "Media.WatchTime.AudioVideo.Battery";
const char kWatchTimeAudioVideoAc[] = "Media.WatchTime.AudioVideo.AC";
const char kWatchTimeAudioVideoEmbeddedExperience[] =
"Media.WatchTime.AudioVideo.EmbeddedExperience";
// Audio only "watch time" metrics.
const char kWatchTimeAudioAll[] = "Media.WatchTime.Audio.All";
const char kWatchTimeAudioMse[] = "Media.WatchTime.Audio.MSE";
const char kWatchTimeAudioEme[] = "Media.WatchTime.Audio.EME";
const char kWatchTimeAudioSrc[] = "Media.WatchTime.Audio.SRC";
const char kWatchTimeAudioBattery[] = "Media.WatchTime.Audio.Battery";
const char kWatchTimeAudioAc[] = "Media.WatchTime.Audio.AC";
const char kWatchTimeAudioEmbeddedExperience[] =
"Media.WatchTime.Audio.EmbeddedExperience";
// Audio+video background watch time metrics.
const char kWatchTimeAudioVideoBackgroundAll[] =
"Media.WatchTime.AudioVideo.Background.All";
const char kWatchTimeAudioVideoBackgroundMse[] =
"Media.WatchTime.AudioVideo.Background.MSE";
const char kWatchTimeAudioVideoBackgroundEme[] =
"Media.WatchTime.AudioVideo.Background.EME";
const char kWatchTimeAudioVideoBackgroundSrc[] =
"Media.WatchTime.AudioVideo.Background.SRC";
const char kWatchTimeAudioVideoBackgroundBattery[] =
"Media.WatchTime.AudioVideo.Background.Battery";
const char kWatchTimeAudioVideoBackgroundAc[] =
"Media.WatchTime.AudioVideo.Background.AC";
const char kWatchTimeAudioVideoBackgroundEmbeddedExperience[] =
"Media.WatchTime.AudioVideo.Background.EmbeddedExperience";
const char kWatchTimeFinalize[] = "FinalizeWatchTime";
const char kWatchTimeFinalizePower[] = "FinalizePowerWatchTime";
const char kWatchTimeUnderflowCount[] = "UnderflowCount";
const char kMeanTimeBetweenRebuffersAudioSrc[] =
"Media.MeanTimeBetweenRebuffers.Audio.SRC";
const char kMeanTimeBetweenRebuffersAudioMse[] =
"Media.MeanTimeBetweenRebuffers.Audio.MSE";
const char kMeanTimeBetweenRebuffersAudioEme[] =
"Media.MeanTimeBetweenRebuffers.Audio.EME";
const char kMeanTimeBetweenRebuffersAudioVideoSrc[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.SRC";
const char kMeanTimeBetweenRebuffersAudioVideoMse[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.MSE";
const char kMeanTimeBetweenRebuffersAudioVideoEme[] =
"Media.MeanTimeBetweenRebuffers.AudioVideo.EME";
base::flat_set<base::StringPiece> GetWatchTimeKeys() {
return base::flat_set<base::StringPiece>(
{kWatchTimeAudioAll,
kWatchTimeAudioMse,
kWatchTimeAudioEme,
kWatchTimeAudioSrc,
kWatchTimeAudioBattery,
kWatchTimeAudioAc,
kWatchTimeAudioEmbeddedExperience,
kWatchTimeAudioVideoAll,
kWatchTimeAudioVideoMse,
kWatchTimeAudioVideoEme,
kWatchTimeAudioVideoSrc,
kWatchTimeAudioVideoBattery,
kWatchTimeAudioVideoAc,
kWatchTimeAudioVideoEmbeddedExperience,
kWatchTimeAudioVideoBackgroundAll,
kWatchTimeAudioVideoBackgroundMse,
kWatchTimeAudioVideoBackgroundEme,
kWatchTimeAudioVideoBackgroundSrc,
kWatchTimeAudioVideoBackgroundBattery,
kWatchTimeAudioVideoBackgroundAc,
kWatchTimeAudioVideoBackgroundEmbeddedExperience},
base::KEEP_FIRST_OF_DUPES);
}
base::flat_set<base::StringPiece> GetWatchTimePowerKeys() {
return base::flat_set<base::StringPiece>(
{kWatchTimeAudioBattery, kWatchTimeAudioAc, kWatchTimeAudioVideoBattery,
kWatchTimeAudioVideoAc, kWatchTimeAudioVideoBackgroundBattery,
kWatchTimeAudioVideoBackgroundAc},
base::KEEP_FIRST_OF_DUPES);
}
} // namespace media
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_BASE_WATCH_TIME_KEYS_H_
#define MEDIA_BASE_WATCH_TIME_KEYS_H_
#include "base/containers/flat_set.h"
#include "base/strings/string_piece.h"
#include "media/base/media_export.h"
namespace media {
// Histogram names used for reporting; also double as MediaLog key names.
// NOTE: If you add to this list you must update GetWatchTimeKeys() and if
// necessary, GetWatchTimePowerKeys().
MEDIA_EXPORT extern const char kWatchTimeAudioAll[];
MEDIA_EXPORT extern const char kWatchTimeAudioMse[];
MEDIA_EXPORT extern const char kWatchTimeAudioEme[];
MEDIA_EXPORT extern const char kWatchTimeAudioSrc[];
MEDIA_EXPORT extern const char kWatchTimeAudioBattery[];
MEDIA_EXPORT extern const char kWatchTimeAudioAc[];
MEDIA_EXPORT extern const char kWatchTimeAudioEmbeddedExperience[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoAll[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoMse[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoEme[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoSrc[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBattery[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoAc[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoEmbeddedExperience[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundAll[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundMse[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundEme[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundSrc[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundBattery[];
MEDIA_EXPORT extern const char kWatchTimeAudioVideoBackgroundAc[];
MEDIA_EXPORT extern const char
kWatchTimeAudioVideoBackgroundEmbeddedExperience[];
// **** If adding any line above this see the toplevel comment! ****
// Markers which signify the watch time should be finalized immediately.
MEDIA_EXPORT extern const char kWatchTimeFinalize[];
MEDIA_EXPORT extern const char kWatchTimeFinalizePower[];
// Count of the number of underflow events during a media session.
MEDIA_EXPORT extern const char kWatchTimeUnderflowCount[];
// UMA keys for MTBR samples.
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioSrc[];
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioMse[];
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioEme[];
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioVideoSrc[];
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioVideoMse[];
MEDIA_EXPORT extern const char kMeanTimeBetweenRebuffersAudioVideoEme[];
MEDIA_EXPORT base::flat_set<base::StringPiece> GetWatchTimeKeys();
MEDIA_EXPORT base::flat_set<base::StringPiece> GetWatchTimePowerKeys();
} // namespace media
#endif // MEDIA_BASE_WATCH_TIME_KEYS_H_
......@@ -5,6 +5,7 @@
#include "media/blink/watch_time_reporter.h"
#include "base/power_monitor/power_monitor.h"
#include "media/base/watch_time_keys.h"
namespace media {
......@@ -271,14 +272,13 @@ void WatchTimeReporter::UpdateWatchTime() {
std::unique_ptr<MediaLogEvent> log_event =
media_log_->CreateEvent(MediaLogEvent::Type::WATCH_TIME_UPDATE);
#define RECORD_WATCH_TIME(key, value) \
do { \
log_event->params.SetDoubleWithoutPathExpansion( \
has_video_ \
? MediaLog::kWatchTimeAudioVideo##key \
: (is_background_ ? MediaLog::kWatchTimeAudioVideoBackground##key \
: MediaLog::kWatchTimeAudio##key), \
value.InSecondsF()); \
#define RECORD_WATCH_TIME(key, value) \
do { \
log_event->params.SetDoubleWithoutPathExpansion( \
has_video_ ? kWatchTimeAudioVideo##key \
: (is_background_ ? kWatchTimeAudioVideoBackground##key \
: kWatchTimeAudio##key), \
value.InSecondsF()); \
} while (0)
// Only report watch time after some minimum amount has elapsed. Don't update
......@@ -339,16 +339,16 @@ void WatchTimeReporter::UpdateWatchTime() {
}
}
log_event->params.SetInteger(MediaLog::kUnderflowCount, underflow_count_);
log_event->params.SetInteger(kWatchTimeUnderflowCount, underflow_count_);
pending_underflow_events_.clear();
}
// Always send finalize, even if we don't currently have any data, it's
// harmless to send since nothing will be logged if we've already finalized.
if (is_finalizing)
log_event->params.SetBoolean(MediaLog::kWatchTimeFinalize, true);
log_event->params.SetBoolean(kWatchTimeFinalize, true);
else if (is_power_change_pending)
log_event->params.SetBoolean(MediaLog::kWatchTimeFinalizePower, true);
log_event->params.SetBoolean(kWatchTimeFinalizePower, true);
if (!log_event->params.empty())
media_log_->AddEvent(std::move(log_event));
......
......@@ -9,6 +9,7 @@
#include "base/run_loop.h"
#include "base/test/test_message_loop.h"
#include "media/base/mock_media_log.h"
#include "media/base/watch_time_keys.h"
#include "media/blink/watch_time_reporter.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -17,23 +18,21 @@ namespace media {
constexpr gfx::Size kSizeJustRight = gfx::Size(201, 201);
#define EXPECT_WATCH_TIME(key, value) \
do { \
EXPECT_CALL( \
media_log_, \
OnWatchTimeUpdate(has_video_ ? MediaLog::kWatchTimeAudioVideo##key \
: MediaLog::kWatchTimeAudio##key, \
value)) \
.RetiresOnSaturation(); \
#define EXPECT_WATCH_TIME(key, value) \
do { \
EXPECT_CALL(media_log_, \
OnWatchTimeUpdate(has_video_ ? kWatchTimeAudioVideo##key \
: kWatchTimeAudio##key, \
value)) \
.RetiresOnSaturation(); \
} while (0)
#define EXPECT_BACKGROUND_WATCH_TIME(key, value) \
do { \
DCHECK(has_video_); \
EXPECT_CALL(media_log_, \
OnWatchTimeUpdate( \
MediaLog::kWatchTimeAudioVideoBackground##key, value)) \
.RetiresOnSaturation(); \
#define EXPECT_BACKGROUND_WATCH_TIME(key, value) \
do { \
DCHECK(has_video_); \
EXPECT_CALL(media_log_, \
OnWatchTimeUpdate(kWatchTimeAudioVideoBackground##key, value)) \
.RetiresOnSaturation(); \
} while (0)
#define EXPECT_WATCH_TIME_FINALIZED() \
......@@ -59,7 +58,7 @@ class WatchTimeReporterTest : public testing::TestWithParam<bool> {
it.Advance()) {
bool finalize;
if (it.value().GetAsBoolean(&finalize)) {
if (it.key() == MediaLog::kWatchTimeFinalize)
if (it.key() == kWatchTimeFinalize)
OnWatchTimeFinalized();
else
OnPowerWatchTimeFinalized();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment