Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index 5dd65d08719b7a279d88dca947fdb3f0d3ec82f9..9b1cedf56725a3308e8d92ad0978ead7da0f2257 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) \ |
@@ -181,7 +181,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
base::Bind(&WebMediaPlayerImpl::SetCdm, |
AsWeakPtr(), |
base::Bind(&IgnoreCdmAttached))), |
- renderer_factory_(std::move(renderer_factory)) { |
+ renderer_factory_(std::move(renderer_factory)), |
+ cast_impl_(this, client_, params.context_3d_cb()) { |
DCHECK(!adjust_allocated_memory_cb_.is_null()); |
if (delegate) |
@@ -300,13 +301,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 |
liberato (no reviews please)
2016/01/12 22:14:58
are these ifdefs needed? cast_impl_.isRemote() wi
hubbe
2016/01/12 22:39:26
cast_impl_ doesn't exist on non-android.
I could m
|
+ if (cast_impl_.isRemote() && paused_) { |
+ cast_impl_.play(); |
liberato (no reviews please)
2016/01/12 22:14:58
if it's remote and already playing, why do we fall
hubbe
2016/01/12 22:39:26
Fixed.
|
+ return; |
+ } |
+#endif |
+ |
paused_ = false; |
+ |
pipeline_.SetPlaybackRate(playback_rate_); |
if (data_source_) |
data_source_->MediaIsPlaying(); |
@@ -323,6 +336,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(); |
@@ -343,12 +364,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. |
@@ -422,7 +450,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)); |
} |
@@ -539,6 +566,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; |
} |
@@ -586,7 +617,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 { |
@@ -1048,6 +1089,9 @@ void WebMediaPlayerImpl::OnHidden() { |
if (!pipeline_.IsRunning()) |
return; |
+ if (suspended_) |
+ return; |
+ |
if (resuming_ || seeking_) { |
pending_suspend_ = true; |
return; |
@@ -1101,7 +1145,7 @@ void WebMediaPlayerImpl::OnShown() { |
// We may not be suspended if we were not yet subscribed or the pipeline was |
// not yet started when OnHidden() fired. |
- if (!suspended_) |
+ if (!suspended_ || resuming_) |
return; |
Resume(); |
@@ -1140,6 +1184,82 @@ 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) { |
+ pipeline_.SetPlaybackRate(0.0); |
+ paused_time_ = base::TimeDelta::FromSecondsD(t); |
+ pending_seek_ = true; |
+ pending_seek_time_ = paused_time_; |
+ |
+ if (suspended_ && !resuming_) |
+ Resume(); |
+ |
+ // We already told the delegate we're paused when remoting started. |
+ client_->disconnectedFromRemoteDevice(); |
+ if (!paused_) { |
+ paused_ = true; |
+ client_->playbackStateChanged(); |
+ } |
+ if (paused_time_ == pipeline_.GetMediaDuration()) { |
+ ended_ = true; |
+ } |
+} |
+ |
+void WebMediaPlayerImpl::SuspendForRemote( |
+ const scoped_refptr<VideoFrame>& new_frame) { |
+ if (!suspended_ && !suspending_) { |
+ suspended_ = true; |
+ suspending_ = true; |
+ pipeline_.Suspend( |
+ BIND_TO_RENDER_LOOP1(&WebMediaPlayerImpl::DisplayCastFrame, |
+ new_frame)); |
+ } else { |
+ compositor_->PaintFrameUsingOldRenderingPath(new_frame); |
+ } |
+} |
+ |
+void WebMediaPlayerImpl::DisplayCastFrame( |
liberato (no reviews please)
2016/01/12 22:14:58
since this only works as a suspend callback, maybe
hubbe
2016/01/12 22:39:25
Done.
|
+ const scoped_refptr<VideoFrame>& new_frame, |
+ PipelineStatus status) { |
+ compositor_->PaintFrameUsingOldRenderingPath(new_frame); |
+ OnPipelineSuspended(status); |
+} |
+ |
+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()); |
@@ -1321,6 +1441,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()) { |
@@ -1331,6 +1457,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(); |