| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/webmediaplayer_ms.h" | 5 #include "content/renderer/media/webmediaplayer_ms.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/callback.h" | 13 #include "base/callback.h" |
| 14 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
| 15 #include "build/build_config.h" | 15 #include "build/build_config.h" |
| 16 #include "cc/blink/web_layer_impl.h" | 16 #include "cc/blink/web_layer_impl.h" |
| 17 #include "cc/layers/video_frame_provider_client_impl.h" | 17 #include "cc/layers/video_frame_provider_client_impl.h" |
| 18 #include "cc/layers/video_layer.h" | 18 #include "cc/layers/video_layer.h" |
| 19 #include "content/child/child_process.h" |
| 19 #include "content/common/gpu/client/context_provider_command_buffer.h" | 20 #include "content/common/gpu/client/context_provider_command_buffer.h" |
| 20 #include "content/public/renderer/media_stream_audio_renderer.h" | 21 #include "content/public/renderer/media_stream_audio_renderer.h" |
| 21 #include "content/public/renderer/media_stream_renderer_factory.h" | 22 #include "content/public/renderer/media_stream_renderer_factory.h" |
| 22 #include "content/public/renderer/media_stream_video_renderer.h" | 23 #include "content/public/renderer/media_stream_video_renderer.h" |
| 23 #include "content/renderer/media/web_media_element_source_utils.h" | 24 #include "content/renderer/media/web_media_element_source_utils.h" |
| 24 #include "content/renderer/media/webmediaplayer_ms_compositor.h" | 25 #include "content/renderer/media/webmediaplayer_ms_compositor.h" |
| 25 #include "content/renderer/render_frame_impl.h" | 26 #include "content/renderer/render_frame_impl.h" |
| 26 #include "content/renderer/render_thread_impl.h" | 27 #include "content/renderer/render_thread_impl.h" |
| 27 #include "media/base/bind_to_current_loop.h" | 28 #include "media/base/bind_to_current_loop.h" |
| 28 #include "media/base/media_content_type.h" | 29 #include "media/base/media_content_type.h" |
| 29 #include "media/base/media_log.h" | 30 #include "media/base/media_log.h" |
| 30 #include "media/base/video_frame.h" | 31 #include "media/base/video_frame.h" |
| 31 #include "media/base/video_rotation.h" | 32 #include "media/base/video_rotation.h" |
| 32 #include "media/base/video_types.h" | 33 #include "media/base/video_types.h" |
| 33 #include "media/blink/webmediaplayer_util.h" | 34 #include "media/blink/webmediaplayer_util.h" |
| 34 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" | 35 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" |
| 35 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" | 36 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" |
| 36 #include "third_party/WebKit/public/platform/WebRect.h" | 37 #include "third_party/WebKit/public/platform/WebRect.h" |
| 37 #include "third_party/WebKit/public/platform/WebSize.h" | 38 #include "third_party/WebKit/public/platform/WebSize.h" |
| 38 | 39 |
| 39 namespace content { | 40 namespace content { |
| 40 | 41 |
| 41 // FrameDeliverer is responsible for delivering frames received on | 42 // FrameDeliverer is responsible for delivering frames received on |
| 42 // compositor thread by calling of EnqueueFrame() method of |compositor_|. | 43 // the IO thread by calling of EnqueueFrame() method of |compositor_|. |
| 43 // | 44 // |
| 44 // It is created on the main thread, but methods should be called and class | 45 // It is created on the main thread, but methods should be called and class |
| 45 // should be destructed on the compositor thread. | 46 // should be destructed on the IO thread. |
| 46 class WebMediaPlayerMS::FrameDeliverer { | 47 class WebMediaPlayerMS::FrameDeliverer { |
| 47 public: | 48 public: |
| 48 typedef base::Callback<void(scoped_refptr<media::VideoFrame>)> | |
| 49 EnqueueFrameCallback; | |
| 50 | |
| 51 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, | 49 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, |
| 52 const EnqueueFrameCallback& enqueue_frame_cb) | 50 const MediaStreamVideoRenderer::RepaintCB& enqueue_frame_cb, |
| 51 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner) |
| 53 : last_frame_opaque_(true), | 52 : last_frame_opaque_(true), |
| 54 last_frame_rotation_(media::VIDEO_ROTATION_0), | 53 last_frame_rotation_(media::VIDEO_ROTATION_0), |
| 55 received_first_frame_(false), | 54 received_first_frame_(false), |
| 56 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 55 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 57 player_(player), | 56 player_(player), |
| 58 enqueue_frame_cb_(enqueue_frame_cb), | 57 enqueue_frame_cb_(enqueue_frame_cb), |
| 59 weak_factory_for_compositor_(this) { | 58 io_task_runner_(io_task_runner), |
| 60 compositor_thread_checker_.DetachFromThread(); | 59 weak_factory_(this) {} |
| 61 } | |
| 62 | 60 |
| 63 ~FrameDeliverer() { | 61 ~FrameDeliverer() { DCHECK(io_task_runner_->BelongsToCurrentThread()); } |
| 64 DCHECK(compositor_thread_checker_.CalledOnValidThread()); | |
| 65 } | |
| 66 | 62 |
| 67 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { | 63 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { |
| 68 DCHECK(compositor_thread_checker_.CalledOnValidThread()); | 64 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
| 69 | 65 |
| 70 #if defined(OS_ANDROID) | 66 #if defined(OS_ANDROID) |
| 71 if (render_frame_suspended_) | 67 if (render_frame_suspended_) |
| 72 return; | 68 return; |
| 73 #endif // defined(OS_ANDROID) | 69 #endif // defined(OS_ANDROID) |
| 74 | 70 |
| 75 base::TimeTicks render_time; | 71 base::TimeTicks render_time; |
| 76 if (frame->metadata()->GetTimeTicks( | 72 if (frame->metadata()->GetTimeTicks( |
| 77 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { | 73 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { |
| 78 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", | 74 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnVideoFrame", |
| 79 "Ideal Render Instant", render_time.ToInternalValue()); | 75 "Ideal Render Instant", render_time.ToInternalValue()); |
| 80 } else { | 76 } else { |
| 81 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable"); | 77 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnVideoFrame"); |
| 82 } | 78 } |
| 83 | 79 |
| 84 const bool is_opaque = media::IsOpaque(frame->format()); | 80 const bool is_opaque = media::IsOpaque(frame->format()); |
| 85 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; | 81 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; |
| 86 ignore_result(frame->metadata()->GetRotation( | 82 ignore_result(frame->metadata()->GetRotation( |
| 87 media::VideoFrameMetadata::ROTATION, &video_rotation)); | 83 media::VideoFrameMetadata::ROTATION, &video_rotation)); |
| 88 | 84 |
| 89 if (!received_first_frame_) { | 85 if (!received_first_frame_) { |
| 90 received_first_frame_ = true; | 86 received_first_frame_ = true; |
| 91 last_frame_opaque_ = is_opaque; | 87 last_frame_opaque_ = is_opaque; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 106 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_, | 102 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_, |
| 107 video_rotation, is_opaque)); | 103 video_rotation, is_opaque)); |
| 108 } | 104 } |
| 109 } | 105 } |
| 110 | 106 |
| 111 enqueue_frame_cb_.Run(frame); | 107 enqueue_frame_cb_.Run(frame); |
| 112 } | 108 } |
| 113 | 109 |
| 114 #if defined(OS_ANDROID) | 110 #if defined(OS_ANDROID) |
| 115 void SetRenderFrameSuspended(bool render_frame_suspended) { | 111 void SetRenderFrameSuspended(bool render_frame_suspended) { |
| 116 DCHECK(compositor_thread_checker_.CalledOnValidThread()); | 112 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
| 117 render_frame_suspended_ = render_frame_suspended; | 113 render_frame_suspended_ = render_frame_suspended; |
| 118 } | 114 } |
| 119 #endif // defined(OS_ANDROID) | 115 #endif // defined(OS_ANDROID) |
| 120 | 116 |
| 121 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { | 117 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { |
| 122 return base::Bind(&FrameDeliverer::OnVideoFrame, | 118 return base::Bind(&FrameDeliverer::OnVideoFrame, |
| 123 weak_factory_for_compositor_.GetWeakPtr()); | 119 weak_factory_.GetWeakPtr()); |
| 124 } | 120 } |
| 125 | 121 |
| 126 private: | 122 private: |
| 127 bool last_frame_opaque_; | 123 bool last_frame_opaque_; |
| 128 media::VideoRotation last_frame_rotation_; | 124 media::VideoRotation last_frame_rotation_; |
| 129 bool received_first_frame_; | 125 bool received_first_frame_; |
| 130 | 126 |
| 131 #if defined(OS_ANDROID) | 127 #if defined(OS_ANDROID) |
| 132 bool render_frame_suspended_ = false; | 128 bool render_frame_suspended_ = false; |
| 133 #endif // defined(OS_ANDROID) | 129 #endif // defined(OS_ANDROID) |
| 134 | 130 |
| 135 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; | 131 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
| 136 const base::WeakPtr<WebMediaPlayerMS> player_; | 132 const base::WeakPtr<WebMediaPlayerMS> player_; |
| 137 const EnqueueFrameCallback enqueue_frame_cb_; | 133 const MediaStreamVideoRenderer::RepaintCB enqueue_frame_cb_; |
| 138 | 134 |
| 139 // Used for DCHECKs to ensure method calls executed on the correct thread, | 135 // Used for DCHECKs to ensure method calls are executed on the correct thread. |
| 140 // i.e. compositor thread. | 136 const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; |
| 141 base::ThreadChecker compositor_thread_checker_; | |
| 142 | 137 |
| 143 base::WeakPtrFactory<FrameDeliverer> weak_factory_for_compositor_; | 138 base::WeakPtrFactory<FrameDeliverer> weak_factory_; |
| 144 | 139 |
| 145 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); | 140 DISALLOW_COPY_AND_ASSIGN(FrameDeliverer); |
| 146 }; | 141 }; |
| 147 | 142 |
| 148 WebMediaPlayerMS::WebMediaPlayerMS( | 143 WebMediaPlayerMS::WebMediaPlayerMS( |
| 149 blink::WebFrame* frame, | 144 blink::WebFrame* frame, |
| 150 blink::WebMediaPlayerClient* client, | 145 blink::WebMediaPlayerClient* client, |
| 151 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, | 146 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, |
| 152 media::MediaLog* media_log, | 147 media::MediaLog* media_log, |
| 153 std::unique_ptr<MediaStreamRendererFactory> factory, | 148 std::unique_ptr<MediaStreamRendererFactory> factory, |
| 154 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, | 149 scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, |
| 155 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, | 150 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, |
| 156 const scoped_refptr<base::TaskRunner>& worker_task_runner, | 151 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, |
| 152 scoped_refptr<base::TaskRunner> worker_task_runner, |
| 157 media::GpuVideoAcceleratorFactories* gpu_factories, | 153 media::GpuVideoAcceleratorFactories* gpu_factories, |
| 158 const blink::WebString& sink_id, | 154 const blink::WebString& sink_id, |
| 159 const blink::WebSecurityOrigin& security_origin) | 155 const blink::WebSecurityOrigin& security_origin) |
| 160 : frame_(frame), | 156 : frame_(frame), |
| 161 network_state_(WebMediaPlayer::NetworkStateEmpty), | 157 network_state_(WebMediaPlayer::NetworkStateEmpty), |
| 162 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), | 158 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), |
| 163 buffered_(static_cast<size_t>(0)), | 159 buffered_(static_cast<size_t>(0)), |
| 164 client_(client), | 160 client_(client), |
| 165 delegate_(delegate), | 161 delegate_(delegate), |
| 166 delegate_id_(0), | 162 delegate_id_(0), |
| 167 paused_(true), | 163 paused_(true), |
| 168 video_rotation_(media::VIDEO_ROTATION_0), | 164 video_rotation_(media::VIDEO_ROTATION_0), |
| 169 media_log_(media_log), | 165 media_log_(media_log), |
| 170 renderer_factory_(std::move(factory)), | 166 renderer_factory_(std::move(factory)), |
| 167 io_task_runner_(io_task_runner), |
| 168 compositor_task_runner_(compositor_task_runner), |
| 171 media_task_runner_(media_task_runner), | 169 media_task_runner_(media_task_runner), |
| 172 worker_task_runner_(worker_task_runner), | 170 worker_task_runner_(worker_task_runner), |
| 173 gpu_factories_(gpu_factories), | 171 gpu_factories_(gpu_factories), |
| 174 compositor_task_runner_(compositor_task_runner), | |
| 175 initial_audio_output_device_id_(sink_id.utf8()), | 172 initial_audio_output_device_id_(sink_id.utf8()), |
| 176 initial_security_origin_(security_origin.isNull() | 173 initial_security_origin_(security_origin.isNull() |
| 177 ? url::Origin() | 174 ? url::Origin() |
| 178 : url::Origin(security_origin)), | 175 : url::Origin(security_origin)), |
| 179 volume_(1.0), | 176 volume_(1.0), |
| 180 volume_multiplier_(1.0), | 177 volume_multiplier_(1.0), |
| 181 should_play_upon_shown_(false) { | 178 should_play_upon_shown_(false) { |
| 182 DVLOG(1) << __func__; | 179 DVLOG(1) << __func__; |
| 183 DCHECK(client); | 180 DCHECK(client); |
| 184 if (delegate_) | 181 if (delegate_) |
| 185 delegate_id_ = delegate_->AddObserver(this); | 182 delegate_id_ = delegate_->AddObserver(this); |
| 186 | 183 |
| 187 media_log_->AddEvent( | 184 media_log_->AddEvent( |
| 188 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); | 185 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
| 189 } | 186 } |
| 190 | 187 |
| 191 WebMediaPlayerMS::~WebMediaPlayerMS() { | 188 WebMediaPlayerMS::~WebMediaPlayerMS() { |
| 192 DVLOG(1) << __func__; | 189 DVLOG(1) << __func__; |
| 193 DCHECK(thread_checker_.CalledOnValidThread()); | 190 DCHECK(thread_checker_.CalledOnValidThread()); |
| 194 | 191 |
| 195 // Destruct compositor resources in the proper order. | 192 // Destruct compositor resources in the proper order. |
| 196 get_client()->setWebLayer(nullptr); | 193 get_client()->setWebLayer(nullptr); |
| 197 if (video_weblayer_) | 194 if (video_weblayer_) |
| 198 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); | 195 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); |
| 199 | 196 |
| 200 if (frame_deliverer_) | 197 if (frame_deliverer_) |
| 201 compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); | 198 io_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release()); |
| 202 | 199 |
| 203 if (compositor_) | 200 if (compositor_) |
| 204 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); | 201 compositor_->StopUsingProvider(); |
| 205 | 202 |
| 206 if (video_frame_provider_) | 203 if (video_frame_provider_) |
| 207 video_frame_provider_->Stop(); | 204 video_frame_provider_->Stop(); |
| 208 | 205 |
| 209 if (audio_renderer_) | 206 if (audio_renderer_) |
| 210 audio_renderer_->Stop(); | 207 audio_renderer_->Stop(); |
| 211 | 208 |
| 212 media_log_->AddEvent( | 209 media_log_->AddEvent( |
| 213 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); | 210 media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_DESTROYED)); |
| 214 | 211 |
| 215 if (delegate_) { | 212 if (delegate_) { |
| 216 delegate_->PlayerGone(delegate_id_); | 213 delegate_->PlayerGone(delegate_id_); |
| 217 delegate_->RemoveObserver(delegate_id_); | 214 delegate_->RemoveObserver(delegate_id_); |
| 218 } | 215 } |
| 219 } | 216 } |
| 220 | 217 |
| 221 void WebMediaPlayerMS::load(LoadType load_type, | 218 void WebMediaPlayerMS::load(LoadType load_type, |
| 222 const blink::WebMediaPlayerSource& source, | 219 const blink::WebMediaPlayerSource& source, |
| 223 CORSMode /*cors_mode*/) { | 220 CORSMode /*cors_mode*/) { |
| 224 DVLOG(1) << __func__; | 221 DVLOG(1) << __func__; |
| 225 DCHECK(thread_checker_.CalledOnValidThread()); | 222 DCHECK(thread_checker_.CalledOnValidThread()); |
| 226 | 223 |
| 227 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) | 224 // TODO(acolwell): Change this to DCHECK_EQ(load_type, LoadTypeMediaStream) |
| 228 // once Blink-side changes land. | 225 // once Blink-side changes land. |
| 229 DCHECK_NE(load_type, LoadTypeMediaSource); | 226 DCHECK_NE(load_type, LoadTypeMediaSource); |
| 230 blink::WebMediaStream web_stream = | 227 blink::WebMediaStream web_stream = |
| 231 GetWebMediaStreamFromWebMediaPlayerSource(source); | 228 GetWebMediaStreamFromWebMediaPlayerSource(source); |
| 232 | 229 |
| 233 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, | 230 compositor_ = new WebMediaPlayerMSCompositor(compositor_task_runner_, |
| 234 web_stream, AsWeakPtr())); | 231 web_stream, AsWeakPtr()); |
| 235 | 232 |
| 236 SetNetworkState(WebMediaPlayer::NetworkStateLoading); | 233 SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
| 237 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); | 234 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
| 238 std::string stream_id = | 235 std::string stream_id = |
| 239 web_stream.isNull() ? std::string() : web_stream.id().utf8(); | 236 web_stream.isNull() ? std::string() : web_stream.id().utf8(); |
| 240 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); | 237 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); |
| 241 | 238 |
| 242 // base::Unretained usage is safe here because |compositor_| is destroyed | |
| 243 // after |frame_deliverer_|. | |
| 244 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer( | 239 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDeliverer( |
| 245 AsWeakPtr(), base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, | 240 AsWeakPtr(), |
| 246 base::Unretained(compositor_.get())))); | 241 base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame, compositor_), |
| 242 io_task_runner_)); |
| 247 video_frame_provider_ = renderer_factory_->GetVideoRenderer( | 243 video_frame_provider_ = renderer_factory_->GetVideoRenderer( |
| 248 web_stream, media::BindToCurrentLoop(base::Bind( | 244 web_stream, media::BindToCurrentLoop(base::Bind( |
| 249 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())), | 245 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())), |
| 250 frame_deliverer_->GetRepaintCallback(), compositor_task_runner_, | 246 frame_deliverer_->GetRepaintCallback(), io_task_runner_, |
| 251 media_task_runner_, worker_task_runner_, gpu_factories_); | 247 media_task_runner_, worker_task_runner_, gpu_factories_); |
| 252 | 248 |
| 253 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); | 249 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); |
| 254 | 250 |
| 255 if (frame) { | 251 if (frame) { |
| 256 // Report UMA and RAPPOR metrics. | 252 // Report UMA and RAPPOR metrics. |
| 257 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL(); | 253 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL(); |
| 258 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin()); | 254 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin()); |
| 259 | 255 |
| 260 audio_renderer_ = renderer_factory_->GetAudioRenderer( | 256 audio_renderer_ = renderer_factory_->GetAudioRenderer( |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 #if defined(OS_ANDROID) | 508 #if defined(OS_ANDROID) |
| 513 DCHECK(thread_checker_.CalledOnValidThread()); | 509 DCHECK(thread_checker_.CalledOnValidThread()); |
| 514 | 510 |
| 515 // Method called when the RenderFrame is sent to background and suspended | 511 // Method called when the RenderFrame is sent to background and suspended |
| 516 // (android). Substitute the displayed VideoFrame with a copy to avoid | 512 // (android). Substitute the displayed VideoFrame with a copy to avoid |
| 517 // holding on to it unnecessarily. | 513 // holding on to it unnecessarily. |
| 518 // | 514 // |
| 519 // During undoable tab closures OnHidden() may be called back to back, so we | 515 // During undoable tab closures OnHidden() may be called back to back, so we |
| 520 // can't rely on |render_frame_suspended_| being false here. | 516 // can't rely on |render_frame_suspended_| being false here. |
| 521 if (frame_deliverer_) { | 517 if (frame_deliverer_) { |
| 522 compositor_task_runner_->PostTask( | 518 io_task_runner_->PostTask( |
| 523 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | 519 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
| 524 base::Unretained(frame_deliverer_.get()), true)); | 520 base::Unretained(frame_deliverer_.get()), true)); |
| 525 } | 521 } |
| 526 | 522 |
| 527 if (!paused_) | 523 if (!paused_) |
| 528 compositor_->ReplaceCurrentFrameWithACopy(); | 524 compositor_->ReplaceCurrentFrameWithACopy(); |
| 529 #endif // defined(OS_ANDROID) | 525 #endif // defined(OS_ANDROID) |
| 530 } | 526 } |
| 531 | 527 |
| 532 void WebMediaPlayerMS::OnShown() { | 528 void WebMediaPlayerMS::OnShown() { |
| 533 #if defined(OS_ANDROID) | 529 #if defined(OS_ANDROID) |
| 534 DCHECK(thread_checker_.CalledOnValidThread()); | 530 DCHECK(thread_checker_.CalledOnValidThread()); |
| 535 | 531 |
| 536 if (frame_deliverer_) { | 532 if (frame_deliverer_) { |
| 537 compositor_task_runner_->PostTask( | 533 io_task_runner_->PostTask( |
| 538 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | 534 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
| 539 base::Unretained(frame_deliverer_.get()), false)); | 535 base::Unretained(frame_deliverer_.get()), false)); |
| 540 } | 536 } |
| 541 | 537 |
| 542 // Resume playback on visibility. play() clears |should_play_upon_shown_|. | 538 // Resume playback on visibility. play() clears |should_play_upon_shown_|. |
| 543 if (should_play_upon_shown_) | 539 if (should_play_upon_shown_) |
| 544 play(); | 540 play(); |
| 545 #endif // defined(OS_ANDROID) | 541 #endif // defined(OS_ANDROID) |
| 546 } | 542 } |
| 547 | 543 |
| 548 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { | 544 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { |
| 549 #if defined(OS_ANDROID) | 545 #if defined(OS_ANDROID) |
| 550 if (!must_suspend) | 546 if (!must_suspend) |
| 551 return false; | 547 return false; |
| 552 | 548 |
| 553 if (!paused_) { | 549 if (!paused_) { |
| 554 pause(); | 550 pause(); |
| 555 should_play_upon_shown_ = true; | 551 should_play_upon_shown_ = true; |
| 556 } | 552 } |
| 557 | 553 |
| 558 if (delegate_) | 554 if (delegate_) |
| 559 delegate_->PlayerGone(delegate_id_); | 555 delegate_->PlayerGone(delegate_id_); |
| 560 | 556 |
| 561 if (frame_deliverer_) { | 557 if (frame_deliverer_) { |
| 562 compositor_task_runner_->PostTask( | 558 io_task_runner_->PostTask( |
| 563 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, | 559 FROM_HERE, base::Bind(&FrameDeliverer::SetRenderFrameSuspended, |
| 564 base::Unretained(frame_deliverer_.get()), true)); | 560 base::Unretained(frame_deliverer_.get()), true)); |
| 565 } | 561 } |
| 566 #endif // defined(OS_ANDROID) | 562 #endif // defined(OS_ANDROID) |
| 567 return true; | 563 return true; |
| 568 } | 564 } |
| 569 | 565 |
| 570 void WebMediaPlayerMS::OnPlay() { | 566 void WebMediaPlayerMS::OnPlay() { |
| 571 // TODO(perkj, magjed): It's not clear how WebRTC should work with an | 567 // TODO(perkj, magjed): It's not clear how WebRTC should work with an |
| 572 // MediaSession, until these issues are resolved, disable session controls. | 568 // MediaSession, until these issues are resolved, disable session controls. |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 void WebMediaPlayerMS::ResetCanvasCache() { | 671 void WebMediaPlayerMS::ResetCanvasCache() { |
| 676 DCHECK(thread_checker_.CalledOnValidThread()); | 672 DCHECK(thread_checker_.CalledOnValidThread()); |
| 677 video_renderer_.ResetCache(); | 673 video_renderer_.ResetCache(); |
| 678 } | 674 } |
| 679 | 675 |
| 680 void WebMediaPlayerMS::TriggerResize() { | 676 void WebMediaPlayerMS::TriggerResize() { |
| 681 get_client()->sizeChanged(); | 677 get_client()->sizeChanged(); |
| 682 } | 678 } |
| 683 | 679 |
| 684 } // namespace content | 680 } // namespace content |
| OLD | NEW |