Commit 201ce4ba authored by liberato@chromium.org's avatar liberato@chromium.org Committed by Commit Bot

Plumb power experiment signal to the renderer.

This CL plumbs the power experiment state to the media players in the
renderer that they are / are not the only playing player.  This
lets the renderer decide whether to start measuring power usage.

Bug: 1017783
Change-Id: I17e9b453c63482b20bf2b9c4d802ff346f7bd44e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1992686Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarDale Curtis <dalecurtis@chromium.org>
Commit-Queue: Frank Liberato <liberato@chromium.org>
Cr-Commit-Position: refs/heads/master@{#729937}
parent 0e641094
......@@ -40,6 +40,8 @@ void MediaPowerExperimentManager::PlayerStopped(
current_experiment_player_ && *current_experiment_player_ == player_id) {
current_experiment_player_.reset();
current_experiment_cb_ = ExperimentCB();
// Note that there will be no incoming player; there's exactly one and we're
// removing it.
}
players_.erase(player_id);
CheckExperimentState();
......
......@@ -360,6 +360,8 @@ void MediaWebContentsObserver::AddMediaPlayerEntry(
ActiveMediaPlayerMap* player_map) {
(*player_map)[id.render_frame_host].insert(id.delegate_id);
if (power_experiment_manager_) {
// Bind the callback to a WeakPtr for the frame, so that we won't try to
// notify the frame after it's been destroyed.
power_experiment_manager_->PlayerStarted(
id,
base::BindRepeating(&MediaWebContentsObserver::OnExperimentStateChanged,
......@@ -426,7 +428,9 @@ void MediaWebContentsObserver::SuspendAllMediaPlayers() {
void MediaWebContentsObserver::OnExperimentStateChanged(MediaPlayerId id,
bool is_starting) {
// TODO(liberato): Notify the player.
id.render_frame_host->Send(
new MediaPlayerDelegateMsg_NotifyPowerExperimentState(
id.render_frame_host->GetRoutingID(), id.delegate_id, is_starting));
}
void MediaWebContentsObserver::RemoveAllPlayers(
......
......@@ -68,6 +68,10 @@ IPC_MESSAGE_ROUTED2(MediaPlayerDelegateMsg_BecamePersistentVideo,
int /* delegate_id, distinguishes instances */,
double /* is_persistent */)
IPC_MESSAGE_ROUTED2(MediaPlayerDelegateMsg_NotifyPowerExperimentState,
int /* delegate_id, distinguishes instances */,
bool /* is experiment starting (true) or stopping? */)
// ----------------------------------------------------------------------------
// Messages from the renderer notifying the browser of playback state changes.
// ----------------------------------------------------------------------------
......
......@@ -237,6 +237,8 @@ bool RendererWebMediaPlayerDelegate::OnMessageReceived(
OnMediaDelegateVolumeMultiplierUpdate)
IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_BecamePersistentVideo,
OnMediaDelegateBecamePersistentVideo)
IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_NotifyPowerExperimentState,
OnMediaDelegatePowerExperimentState)
IPC_MESSAGE_UNHANDLED(return false)
IPC_END_MESSAGE_MAP()
return true;
......@@ -347,6 +349,14 @@ void RendererWebMediaPlayerDelegate::OnMediaDelegateBecamePersistentVideo(
observer->OnBecamePersistentVideo(value);
}
void RendererWebMediaPlayerDelegate::OnMediaDelegatePowerExperimentState(
int player_id,
bool state) {
Observer* observer = id_map_.Lookup(player_id);
if (observer)
observer->OnPowerExperimentState(state);
}
void RendererWebMediaPlayerDelegate::ScheduleUpdateTask() {
if (!pending_update_task_) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
......
......@@ -98,6 +98,7 @@ class CONTENT_EXPORT RendererWebMediaPlayerDelegate
void OnMediaDelegateSuspendAllMediaPlayers();
void OnMediaDelegateVolumeMultiplierUpdate(int player_id, double multiplier);
void OnMediaDelegateBecamePersistentVideo(int player_id, bool value);
void OnMediaDelegatePowerExperimentState(int player_id, bool state);
// Schedules UpdateTask() to run soon.
void ScheduleUpdateTask();
......
......@@ -2428,6 +2428,11 @@ void WebMediaPlayerImpl::OnBecamePersistentVideo(bool value) {
MaybeSendOverlayInfoToDecoder();
}
void WebMediaPlayerImpl::OnPowerExperimentState(bool state) {
if (power_status_helper_)
power_status_helper_->UpdatePowerExperimentState(state);
}
void WebMediaPlayerImpl::ScheduleRestart() {
// TODO(watk): All restart logic should be moved into PipelineController.
if (pipeline_controller_->IsPipelineRunning() &&
......
......@@ -241,6 +241,7 @@ class MEDIA_BLINK_EXPORT WebMediaPlayerImpl
void OnSeekBackward(double seconds) override;
void OnVolumeMultiplierUpdate(double multiplier) override;
void OnBecamePersistentVideo(bool value) override;
void OnPowerExperimentState(bool state) override;
void RequestRemotePlaybackDisabled(bool disabled) override;
#if defined(OS_ANDROID)
......
......@@ -74,6 +74,10 @@ class BLINK_PLATFORM_EXPORT WebMediaPlayerDelegate {
// Called to set as the persistent video. A persistent video should hide its
// controls and go fullscreen.
virtual void OnBecamePersistentVideo(bool value) = 0;
// Notify the player that it is now eligible to start recording power
// measurements if |state| is true, else it is no longer eligible.
virtual void OnPowerExperimentState(bool state) {}
};
// Returns true if the host frame is hidden or closed.
......
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