Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Unified Diff: media/blink/webmediaplayer_impl.cc

Issue 2160963002: Add watch time metrics for HTML5 media playback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments, couple more tests. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/blink/webmediaplayer_impl.cc
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index 84dd78fc2d15342eabb71b203dfa18494b8d7b74..a58df64105bfcd38358163c58eafb5c7e8433e2f 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -37,6 +37,7 @@
#include "media/base/timestamp_constants.h"
#include "media/base/video_frame.h"
#include "media/blink/texttrack_impl.h"
+#include "media/blink/watch_time_reporter.h"
#include "media/blink/webaudiosourceprovider_impl.h"
#include "media/blink/webcontentdecryptionmodule_impl.h"
#include "media/blink/webinbandtexttrack_impl.h"
@@ -129,6 +130,13 @@ gfx::Size GetRotatedVideoSize(VideoRotation rotation, gfx::Size natural_size) {
return natural_size;
}
+base::TimeDelta GetCurrentTimeInternal(WebMediaPlayerImpl* p_this) {
+ // We wrap currentTime() instead of using pipeline_.GetMediaTime() since there
+ // are a variety of cases in which that time is not accurate; e.g., while
+ // remoting and during a pause or seek.
+ return base::TimeDelta::FromSecondsD(p_this->currentTime());
+}
+
} // namespace
class BufferedDataSourceHostImpl;
@@ -213,7 +221,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
surface_manager_(params.surface_manager()),
overlay_surface_id_(SurfaceManager::kNoSurfaceID),
suppress_destruction_errors_(false),
- can_suspend_state_(CanSuspendState::UNKNOWN) {
+ can_suspend_state_(CanSuspendState::UNKNOWN),
+ is_encrypted_(false) {
DCHECK(!adjust_allocated_memory_cb_.is_null());
DCHECK(renderer_factory_);
DCHECK(client_);
@@ -394,6 +403,7 @@ void WebMediaPlayerImpl::play() {
if (data_source_)
data_source_->MediaIsPlaying();
+ watch_time_reporter_->OnPlaying();
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PLAY));
UpdatePlayState();
}
@@ -423,6 +433,7 @@ void WebMediaPlayerImpl::pause() {
paused_time_ =
ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime();
+ watch_time_reporter_->OnPaused();
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::PAUSE));
UpdatePlayState();
}
@@ -473,6 +484,10 @@ void WebMediaPlayerImpl::DoSeek(base::TimeDelta time, bool time_updated) {
return;
}
+ // Call this before setting |seeking_| so that the current media time can be
+ // recorded by the reporter.
+ watch_time_reporter_->OnSeeking(time);
sandersd (OOO until July 31) 2016/08/04 23:06:26 Since the actual seek time may differ from the req
DaleCurtis 2016/08/08 23:16:42 Reworked to avoid needing seek time and just call
+
// TODO(sandersd): Ideally we would not clear the idle state if
// |pipeline_controller_| can elide the seek.
is_idle_ = false;
@@ -519,6 +534,8 @@ void WebMediaPlayerImpl::setVolume(double volume) {
DCHECK(main_task_runner_->BelongsToCurrentThread());
volume_ = volume;
pipeline_.SetVolume(volume_ * volume_multiplier_);
+ if (watch_time_reporter_)
+ watch_time_reporter_->OnVolumeChange(volume);
}
void WebMediaPlayerImpl::setSinkId(
@@ -871,6 +888,7 @@ void WebMediaPlayerImpl::OnEncryptedMediaInitData(
// TODO(xhwang): Update this UMA name. https://crbug.com/589251
UMA_HISTOGRAM_COUNTS("Media.EME.NeedKey", 1);
+ is_encrypted_ = true;
encrypted_client_->encrypted(
ConvertToWebInitDataType(init_data_type), init_data.data(),
base::saturated_cast<unsigned int>(init_data.size()));
@@ -1023,9 +1041,9 @@ void WebMediaPlayerImpl::OnMetadata(PipelineMetadata metadata) {
pipeline_metadata_ = metadata;
+ SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
UMA_HISTOGRAM_ENUMERATION("Media.VideoRotation", metadata.video_rotation,
VIDEO_ROTATION_MAX + 1);
- SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
if (hasVideo()) {
pipeline_metadata_.natural_size = GetRotatedVideoSize(
@@ -1042,6 +1060,17 @@ void WebMediaPlayerImpl::OnMetadata(PipelineMetadata metadata) {
client_->setWebLayer(video_weblayer_.get());
}
+ // Create the watch time reporter and synchronize its initial state.
+ watch_time_reporter_.reset(
+ new WatchTimeReporter(hasAudio(), hasVideo(), !!chunk_demuxer_,
+ is_encrypted_, pipeline_metadata_.natural_size,
+ base::Bind(&GetCurrentTimeInternal, this)));
+ watch_time_reporter_->OnVolumeChange(volume_);
+ if (delegate_ && delegate_->IsHidden())
+ watch_time_reporter_->OnHidden();
+ else
+ watch_time_reporter_->OnShown();
+
UpdatePlayState();
}
@@ -1160,6 +1189,9 @@ void WebMediaPlayerImpl::OnVideoOpacityChange(bool opaque) {
void WebMediaPlayerImpl::OnHidden() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
+ if (watch_time_reporter_)
+ watch_time_reporter_->OnHidden();
+
UpdatePlayState();
// Schedule suspended playing media to be paused if the user doesn't come back
@@ -1169,6 +1201,9 @@ void WebMediaPlayerImpl::OnHidden() {
void WebMediaPlayerImpl::OnShown() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
+ if (watch_time_reporter_)
+ watch_time_reporter_->OnShown();
+
must_suspend_ = false;
background_pause_timer_.Stop();
UpdatePlayState();

Powered by Google App Engine
This is Rietveld 408576698