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

Unified Diff: media/blink/webmediaplayer_impl.cc

Issue 1567123002: Support CAST+WMPI on android (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: comments addressed Created 4 years, 11 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
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/blink/webmediaplayer_impl.cc
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index dc43b08573fd5734eaeacf3107d0b0e20f756cd6..502a9e86aacfc5fd595006bcc029ca1d9138410c 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -64,6 +64,9 @@ using blink::WebMediaPlayer;
using blink::WebRect;
using blink::WebSize;
using blink::WebString;
+using gpu::gles2::GLES2Interface;
+
+namespace media {
namespace {
@@ -86,23 +89,20 @@ namespace {
const double kMinRate = 0.0625;
const double kMaxRate = 16.0;
-void SetSinkIdOnMediaThread(
- scoped_refptr<media::WebAudioSourceProviderImpl> sink,
- const std::string& device_id,
- const url::Origin& security_origin,
- const media::SwitchOutputDeviceCB& callback) {
+void SetSinkIdOnMediaThread(scoped_refptr<WebAudioSourceProviderImpl> sink,
+ const std::string& device_id,
+ const url::Origin& security_origin,
+ const SwitchOutputDeviceCB& callback) {
if (sink->GetOutputDevice()) {
sink->GetOutputDevice()->SwitchOutputDevice(device_id, security_origin,
callback);
} else {
- callback.Run(media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL);
+ callback.Run(OUTPUT_DEVICE_STATUS_ERROR_INTERNAL);
}
}
} // namespace
-namespace media {
-
class BufferedDataSourceHostImpl;
#define STATIC_ASSERT_MATCHING_ENUM(name, name2) \
@@ -182,6 +182,9 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
AsWeakPtr(),
base::Bind(&IgnoreCdmAttached))),
is_cdm_attached_(false),
+#if defined(OS_ANDROID) // WMPI_CAST
+ cast_impl_(this, client_, params.context_3d_cb()),
+#endif
renderer_factory_(std::move(renderer_factory)) {
DCHECK(!adjust_allocated_memory_cb_.is_null());
@@ -301,13 +304,25 @@ void WebMediaPlayerImpl::DoLoad(LoadType load_type,
data_source_->SetBufferingStrategy(buffering_strategy_);
data_source_->Initialize(
base::Bind(&WebMediaPlayerImpl::DataSourceInitialized, AsWeakPtr()));
+
+#if defined(OS_ANDROID) // WMPI_CAST
+ cast_impl_.Initialize(url, frame_);
+#endif
}
void WebMediaPlayerImpl::play() {
DVLOG(1) << __FUNCTION__;
DCHECK(main_task_runner_->BelongsToCurrentThread());
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote()) {
+ cast_impl_.play();
+ return;
+ }
+#endif
+
paused_ = false;
+
pipeline_.SetPlaybackRate(playback_rate_);
if (data_source_)
data_source_->MediaIsPlaying();
@@ -324,6 +339,14 @@ void WebMediaPlayerImpl::pause() {
const bool was_already_paused = paused_ || playback_rate_ == 0;
paused_ = true;
+
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote()) {
+ cast_impl_.pause();
+ return;
+ }
+#endif
+
pipeline_.SetPlaybackRate(0.0);
UpdatePausedTime();
@@ -344,12 +367,19 @@ void WebMediaPlayerImpl::seek(double seconds) {
ended_ = false;
+ base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds);
+
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote()) {
+ cast_impl_.seek(new_seek_time);
+ return;
+ }
+#endif
+
ReadyState old_state = ready_state_;
if (ready_state_ > WebMediaPlayer::ReadyStateHaveMetadata)
SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
- base::TimeDelta new_seek_time = base::TimeDelta::FromSecondsD(seconds);
-
if (seeking_ || suspended_) {
// Once resuming, it's too late to change the resume time and so the
// implementation is a little different.
@@ -423,7 +453,6 @@ void WebMediaPlayerImpl::seek(double seconds) {
if (chunk_demuxer_)
chunk_demuxer_->StartWaitingForSeek(seek_time_);
- // Kick off the asynchronous seek!
pipeline_.Seek(seek_time_, BIND_TO_RENDER_LOOP1(
&WebMediaPlayerImpl::OnPipelineSeeked, true));
}
@@ -540,6 +569,10 @@ blink::WebSize WebMediaPlayerImpl::naturalSize() const {
bool WebMediaPlayerImpl::paused() const {
DCHECK(main_task_runner_->BelongsToCurrentThread());
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote())
+ return cast_impl_.paused();
+#endif
return pipeline_.GetPlaybackRate() == 0.0f;
}
@@ -587,7 +620,17 @@ double WebMediaPlayerImpl::currentTime() const {
: seek_time_.InSecondsF();
}
- return (paused_ ? paused_time_ : pipeline_.GetMediaTime()).InSecondsF();
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote()) {
+ return cast_impl_.currentTime();
+ }
+#endif
+
+ if (paused_) {
+ return paused_time_.InSecondsF();
+ }
+
+ return pipeline_.GetMediaTime().InSecondsF();
}
WebMediaPlayer::NetworkState WebMediaPlayerImpl::networkState() const {
@@ -914,6 +957,15 @@ void WebMediaPlayerImpl::OnPipelineSuspended(PipelineStatus status) {
suspending_ = false;
+#if defined(OS_ANDROID)
+ if (cast_impl_.isRemote()) {
+ scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner();
+ if (frame) {
+ compositor_->PaintFrameUsingOldRenderingPath(frame);
+ }
+ }
+#endif
+
if (pending_resume_) {
pending_resume_ = false;
Resume();
@@ -1054,6 +1106,16 @@ void WebMediaPlayerImpl::OnHidden() {
return;
}
+#if defined(OS_ANDROID)
+ // If we're remote, the pipeline should already be suspended.
+ if (cast_impl_.isRemote())
+ return;
+#endif
+
+ ScheduleSuspend();
+}
+
+void WebMediaPlayerImpl::ScheduleSuspend() {
if (!pipeline_.IsRunning() || !hasVideo())
return;
@@ -1095,6 +1157,16 @@ void WebMediaPlayerImpl::OnShown() {
return;
}
+#if defined(OS_ANDROID)
+ // If we're remote, the pipeline should stay suspended.
+ if (cast_impl_.isRemote())
+ return;
+#endif
+
+ ScheduleResume();
+}
+
+void WebMediaPlayerImpl::ScheduleResume() {
if (!pipeline_.IsRunning())
return;
@@ -1108,12 +1180,9 @@ void WebMediaPlayerImpl::OnShown() {
return;
}
- // We may not be suspended if we were not yet subscribed or the pipeline was
- // not yet started when OnHidden() fired.
- if (!suspended_)
- return;
-
- Resume();
+ // Might already be resuming iff we came back from remote playback recently.
+ if (suspended_ && !resuming_)
+ Resume();
}
void WebMediaPlayerImpl::Resume() {
@@ -1149,6 +1218,69 @@ void WebMediaPlayerImpl::Resume() {
time_changed));
}
+#if defined(OS_ANDROID) // WMPI_CAST
+void WebMediaPlayerImpl::set_media_player_manager(
+ RendererMediaPlayerManagerInterface* media_player_manager) {
+ cast_impl_.set_media_player_manager(media_player_manager);
+}
+
+void WebMediaPlayerImpl::requestRemotePlayback() {
+ cast_impl_.requestRemotePlayback();
+}
+
+void WebMediaPlayerImpl::requestRemotePlaybackControl() {
+ cast_impl_.requestRemotePlaybackControl();
+}
+
+void WebMediaPlayerImpl::OnRemotePlaybackEnded() {
+ DVLOG(1) << __FUNCTION__;
+ DCHECK(main_task_runner_->BelongsToCurrentThread());
+
+ ended_ = true;
+ client_->timeChanged();
+}
+
+void WebMediaPlayerImpl::OnDisconnectedFromRemoteDevice(double t) {
+ paused_time_ = base::TimeDelta::FromSecondsD(t);
+
+ DCHECK(!pending_seek_);
sandersd (OOO until July 31) 2016/01/13 23:05:43 Looks like you're correct that the currentTime() r
hubbe 2016/01/14 00:25:53 Done.
+ pending_seek_ = true;
+ pending_seek_time_ = paused_time_;
+
+ ScheduleResume();
+
+ if (paused_time_ == pipeline_.GetMediaDuration()) {
+ ended_ = true;
+ }
+ // We already told the delegate we're paused when remoting started.
+ client_->playbackStateChanged();
+ client_->disconnectedFromRemoteDevice();
+}
+
+void WebMediaPlayerImpl::SuspendForRemote() {
+ if (suspended_ && !suspending_) {
+ scoped_refptr<VideoFrame> frame = cast_impl_.GetCastingBanner();
+ if (frame) {
+ compositor_->PaintFrameUsingOldRenderingPath(frame);
+ }
+ }
+ ScheduleSuspend();
+}
+
+gfx::Size WebMediaPlayerImpl::GetCanvasSize() const {
+ if (!video_weblayer_)
+ return gfx::Size(0, 0);
+
+ gfx::Size video_size_css_px = video_weblayer_->bounds();
+ float device_scale_factor = frame_->view()->deviceScaleFactor();
+ // canvas_size will be the size in device pixels when pageScaleFactor == 1
+ gfx::Size canvas_size(
+ static_cast<int>(video_size_css_px.width() * device_scale_factor),
+ static_cast<int>(video_size_css_px.height() * device_scale_factor));
+ return canvas_size;
+}
+#endif // defined(OS_ANDROID) // WMPI_CAST
+
void WebMediaPlayerImpl::DataSourceInitialized(bool success) {
DVLOG(1) << __FUNCTION__;
DCHECK(main_task_runner_->BelongsToCurrentThread());
@@ -1330,6 +1462,12 @@ void WebMediaPlayerImpl::UpdatePausedTime() {
}
void WebMediaPlayerImpl::NotifyPlaybackStarted() {
+#if defined(OS_ANDROID) // WMPI_CAST
+ // We do not tell our delegates about remote playback, becuase that would
+ // keep the device awake, which is not what we want.
+ if (cast_impl_.isRemote())
+ return;
+#endif
if (delegate_)
delegate_->DidPlay(this);
if (!memory_usage_reporting_timer_.IsRunning()) {
@@ -1340,6 +1478,10 @@ void WebMediaPlayerImpl::NotifyPlaybackStarted() {
}
void WebMediaPlayerImpl::NotifyPlaybackPaused() {
+#if defined(OS_ANDROID) // WMPI_CAST
+ if (cast_impl_.isRemote())
+ return;
+#endif
if (delegate_)
delegate_->DidPause(this);
memory_usage_reporting_timer_.Stop();
« no previous file with comments | « media/blink/webmediaplayer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698