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(); |