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

Side by Side Diff: content/renderer/media/webmediaplayer_ms.cc

Issue 2472273002: Move passing of WebRTC rendering frames from main thread to compositor thread (Closed)
Patch Set: perkj@ and qiangchen@ comments. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
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 "build/build_config.h" 15 #include "build/build_config.h"
15 #include "cc/blink/web_layer_impl.h" 16 #include "cc/blink/web_layer_impl.h"
16 #include "cc/layers/video_frame_provider_client_impl.h" 17 #include "cc/layers/video_frame_provider_client_impl.h"
17 #include "cc/layers/video_layer.h" 18 #include "cc/layers/video_layer.h"
18 #include "content/common/gpu/client/context_provider_command_buffer.h" 19 #include "content/common/gpu/client/context_provider_command_buffer.h"
19 #include "content/public/renderer/media_stream_audio_renderer.h" 20 #include "content/public/renderer/media_stream_audio_renderer.h"
20 #include "content/public/renderer/media_stream_renderer_factory.h" 21 #include "content/public/renderer/media_stream_renderer_factory.h"
21 #include "content/public/renderer/media_stream_video_renderer.h" 22 #include "content/public/renderer/media_stream_video_renderer.h"
22 #include "content/renderer/media/web_media_element_source_utils.h" 23 #include "content/renderer/media/web_media_element_source_utils.h"
23 #include "content/renderer/media/webmediaplayer_ms_compositor.h" 24 #include "content/renderer/media/webmediaplayer_ms_compositor.h"
24 #include "content/renderer/render_frame_impl.h" 25 #include "content/renderer/render_frame_impl.h"
25 #include "content/renderer/render_thread_impl.h" 26 #include "content/renderer/render_thread_impl.h"
27 #include "media/base/bind_to_current_loop.h"
26 #include "media/base/media_content_type.h" 28 #include "media/base/media_content_type.h"
27 #include "media/base/media_log.h" 29 #include "media/base/media_log.h"
28 #include "media/base/video_frame.h" 30 #include "media/base/video_frame.h"
29 #include "media/base/video_rotation.h" 31 #include "media/base/video_rotation.h"
30 #include "media/base/video_types.h" 32 #include "media/base/video_types.h"
31 #include "media/blink/webmediaplayer_util.h" 33 #include "media/blink/webmediaplayer_util.h"
32 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 34 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
33 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" 35 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h"
34 #include "third_party/WebKit/public/platform/WebRect.h" 36 #include "third_party/WebKit/public/platform/WebRect.h"
35 #include "third_party/WebKit/public/platform/WebSize.h" 37 #include "third_party/WebKit/public/platform/WebSize.h"
36 38
37 namespace content { 39 namespace content {
38 40
41 // FrameDelivererOnCompositor is responsible for delivering frames received on
42 // compositor thread by calling of EnqueueFrame() method of |compositor_|.
43 //
44 // It is created on main thread, but methods should be called and class should
45 // be destructed on compositor thread.
46 class WebMediaPlayerMS::FrameDelivererOnCompositor {
47 public:
48 typedef base::Callback<void(const scoped_refptr<media::VideoFrame>&)>
49 EnqueueFrameCallback;
50
51 FrameDelivererOnCompositor(const base::WeakPtr<WebMediaPlayerMS>& player,
52 const EnqueueFrameCallback& enqueue_frame_cb)
53 : last_frame_opaque_(true),
54 received_first_frame_(false),
55 main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
56 player_(player),
57 enqueue_frame_cb_(enqueue_frame_cb),
58 weak_factory_for_compositor_(this) {
59 compositor_thread_checker_.DetachFromThread();
60 }
61 ~FrameDelivererOnCompositor() {
62 weak_factory_for_compositor_.InvalidateWeakPtrs();
63 DCHECK(compositor_thread_checker_.CalledOnValidThread());
64 }
65
66 void OnVideoFrame(const scoped_refptr<media::VideoFrame>& frame) {
67 DCHECK(compositor_thread_checker_.CalledOnValidThread());
68
69 #if defined(OS_ANDROID)
70 {
71 base::AutoLock auto_lock(render_frame_suspended_lock_);
72 if (render_frame_suspended_)
73 return;
74 }
75 #endif // defined(OS_ANDROID)
76
77 base::TimeTicks render_time;
78 if (frame->metadata()->GetTimeTicks(
79 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) {
80 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable",
81 "Ideal Render Instant", render_time.ToInternalValue());
82 } else {
83 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable");
84 }
85 const bool is_opaque = media::IsOpaque(frame->format());
86
87 if (!received_first_frame_) {
88 received_first_frame_ = true;
89 last_frame_opaque_ = is_opaque;
90 media::VideoRotation video_rotation;
91 ignore_result(frame->metadata()->GetRotation(
92 media::VideoFrameMetadata::ROTATION, &video_rotation));
93 main_task_runner_->PostTask(
94 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnFirstFrameReceived,
95 player_, video_rotation, is_opaque));
96 }
97
98 if (last_frame_opaque_ != is_opaque) {
99 last_frame_opaque_ = is_opaque;
100 main_task_runner_->PostTask(
101 FROM_HERE,
102 base::Bind(&WebMediaPlayerMS::OnOpacityChanged, player_, is_opaque));
103 }
104
105 enqueue_frame_cb_.Run(frame);
106 }
107
108 #if defined(OS_ANDROID)
109 void SetRenderFrameSuspended(bool render_frame_suspended) {
110 base::AutoLock auto_lock(render_frame_suspended_lock_);
perkj_chrome 2016/11/14 15:19:55 can't this be posted to the compositor thread inst
emircan 2016/11/14 22:43:32 It can and I switched to posting task. Initially,
111 render_frame_suspended_ = render_frame_suspended;
112 }
113 #endif // defined(OS_ANDROID)
114
115 base::WeakPtr<FrameDelivererOnCompositor> GetWeakPtr() {
116 return weak_factory_for_compositor_.GetWeakPtr();
117 }
118
119 private:
120 bool last_frame_opaque_;
121 bool received_first_frame_;
122
123 #if defined(OS_ANDROID)
124 bool render_frame_suspended_ = false;
125 base::Lock render_frame_suspended_lock_;
126 #endif // defined(OS_ANDROID)
127
128 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
129 const base::WeakPtr<WebMediaPlayerMS> player_;
130 const EnqueueFrameCallback enqueue_frame_cb_;
131
132 // Used for DCHECKs to ensure method calls executed on the correct thread,
133 // i.e. compositor thread.
134 base::ThreadChecker compositor_thread_checker_;
135
136 base::WeakPtrFactory<FrameDelivererOnCompositor> weak_factory_for_compositor_;
137
138 DISALLOW_COPY_AND_ASSIGN(FrameDelivererOnCompositor);
139 };
140
39 WebMediaPlayerMS::WebMediaPlayerMS( 141 WebMediaPlayerMS::WebMediaPlayerMS(
40 blink::WebFrame* frame, 142 blink::WebFrame* frame,
41 blink::WebMediaPlayerClient* client, 143 blink::WebMediaPlayerClient* client,
42 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, 144 base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
43 media::MediaLog* media_log, 145 media::MediaLog* media_log,
44 std::unique_ptr<MediaStreamRendererFactory> factory, 146 std::unique_ptr<MediaStreamRendererFactory> factory,
45 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 147 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
46 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 148 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
47 const scoped_refptr<base::TaskRunner>& worker_task_runner, 149 const scoped_refptr<base::TaskRunner>& worker_task_runner,
48 media::GpuVideoAcceleratorFactories* gpu_factories, 150 media::GpuVideoAcceleratorFactories* gpu_factories,
49 const blink::WebString& sink_id, 151 const blink::WebString& sink_id,
50 const blink::WebSecurityOrigin& security_origin) 152 const blink::WebSecurityOrigin& security_origin)
51 : frame_(frame), 153 : frame_(frame),
52 network_state_(WebMediaPlayer::NetworkStateEmpty), 154 network_state_(WebMediaPlayer::NetworkStateEmpty),
53 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 155 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
54 buffered_(static_cast<size_t>(0)), 156 buffered_(static_cast<size_t>(0)),
55 client_(client), 157 client_(client),
56 delegate_(delegate), 158 delegate_(delegate),
57 delegate_id_(0), 159 delegate_id_(0),
58 last_frame_opaque_(true),
59 paused_(true), 160 paused_(true),
60 render_frame_suspended_(false),
61 received_first_frame_(false),
62 video_rotation_(media::VIDEO_ROTATION_0), 161 video_rotation_(media::VIDEO_ROTATION_0),
63 media_log_(media_log), 162 media_log_(media_log),
64 renderer_factory_(std::move(factory)), 163 renderer_factory_(std::move(factory)),
65 media_task_runner_(media_task_runner), 164 media_task_runner_(media_task_runner),
66 worker_task_runner_(worker_task_runner), 165 worker_task_runner_(worker_task_runner),
67 gpu_factories_(gpu_factories), 166 gpu_factories_(gpu_factories),
68 compositor_task_runner_(compositor_task_runner), 167 compositor_task_runner_(compositor_task_runner),
69 initial_audio_output_device_id_(sink_id.utf8()), 168 initial_audio_output_device_id_(sink_id.utf8()),
70 initial_security_origin_(security_origin.isNull() 169 initial_security_origin_(security_origin.isNull()
71 ? url::Origin() 170 ? url::Origin()
(...skipping 11 matching lines...) Expand all
83 } 182 }
84 183
85 WebMediaPlayerMS::~WebMediaPlayerMS() { 184 WebMediaPlayerMS::~WebMediaPlayerMS() {
86 DVLOG(1) << __func__; 185 DVLOG(1) << __func__;
87 DCHECK(thread_checker_.CalledOnValidThread()); 186 DCHECK(thread_checker_.CalledOnValidThread());
88 187
89 // Destruct compositor resources in the proper order. 188 // Destruct compositor resources in the proper order.
90 get_client()->setWebLayer(nullptr); 189 get_client()->setWebLayer(nullptr);
91 if (video_weblayer_) 190 if (video_weblayer_)
92 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); 191 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider();
192
193 if (frame_deliverer_)
194 compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
195
93 if (compositor_) 196 if (compositor_)
94 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); 197 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release());
95 198
96 if (video_frame_provider_) 199 if (video_frame_provider_)
97 video_frame_provider_->Stop(); 200 video_frame_provider_->Stop();
98 201
99 if (audio_renderer_) 202 if (audio_renderer_)
100 audio_renderer_->Stop(); 203 audio_renderer_->Stop();
101 204
102 media_log_->AddEvent( 205 media_log_->AddEvent(
(...skipping 19 matching lines...) Expand all
122 225
123 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, 226 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_,
124 web_stream, AsWeakPtr())); 227 web_stream, AsWeakPtr()));
125 228
126 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 229 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
127 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 230 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
128 std::string stream_id = 231 std::string stream_id =
129 web_stream.isNull() ? std::string() : web_stream.id().utf8(); 232 web_stream.isNull() ? std::string() : web_stream.id().utf8();
130 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); 233 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id));
131 234
235 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDelivererOnCompositor(
236 AsWeakPtr(), base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame,
237 compositor_->GetWeakPtr())));
132 video_frame_provider_ = renderer_factory_->GetVideoRenderer( 238 video_frame_provider_ = renderer_factory_->GetVideoRenderer(
133 web_stream, base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()), 239 web_stream, media::BindToCurrentLoop(base::Bind(
134 base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr()), 240 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
135 media_task_runner_, worker_task_runner_, gpu_factories_); 241 base::Bind(&FrameDelivererOnCompositor::OnVideoFrame,
242 frame_deliverer_->GetWeakPtr()),
243 compositor_task_runner_, media_task_runner_, worker_task_runner_,
244 gpu_factories_);
136 245
137 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); 246 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_);
138 247
139 if (frame) { 248 if (frame) {
140 // Report UMA and RAPPOR metrics. 249 // Report UMA and RAPPOR metrics.
141 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL(); 250 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL();
142 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin()); 251 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin());
143 252
144 audio_renderer_ = renderer_factory_->GetAudioRenderer( 253 audio_renderer_ = renderer_factory_->GetAudioRenderer(
145 web_stream, frame->GetRoutingID(), initial_audio_output_device_id_, 254 web_stream, frame->GetRoutingID(), initial_audio_output_device_id_,
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 void WebMediaPlayerMS::OnHidden() { 504 void WebMediaPlayerMS::OnHidden() {
396 #if defined(OS_ANDROID) 505 #if defined(OS_ANDROID)
397 DCHECK(thread_checker_.CalledOnValidThread()); 506 DCHECK(thread_checker_.CalledOnValidThread());
398 507
399 // Method called when the RenderFrame is sent to background and suspended 508 // Method called when the RenderFrame is sent to background and suspended
400 // (android). Substitute the displayed VideoFrame with a copy to avoid 509 // (android). Substitute the displayed VideoFrame with a copy to avoid
401 // holding on to it unnecessarily. 510 // holding on to it unnecessarily.
402 // 511 //
403 // During undoable tab closures OnHidden() may be called back to back, so we 512 // During undoable tab closures OnHidden() may be called back to back, so we
404 // can't rely on |render_frame_suspended_| being false here. 513 // can't rely on |render_frame_suspended_| being false here.
514 if (frame_deliverer_)
515 frame_deliverer_->SetRenderFrameSuspended(true);
405 516
406 render_frame_suspended_ = true;
407 if (!paused_) 517 if (!paused_)
408 compositor_->ReplaceCurrentFrameWithACopy(); 518 compositor_->ReplaceCurrentFrameWithACopy();
409 #endif // defined(OS_ANDROID) 519 #endif // defined(OS_ANDROID)
410 } 520 }
411 521
412 void WebMediaPlayerMS::OnShown() { 522 void WebMediaPlayerMS::OnShown() {
413 #if defined(OS_ANDROID) 523 #if defined(OS_ANDROID)
414 DCHECK(thread_checker_.CalledOnValidThread()); 524 DCHECK(thread_checker_.CalledOnValidThread());
415 525
416 render_frame_suspended_ = false; 526 frame_deliverer_->SetRenderFrameSuspended(false);
417 527
418 // Resume playback on visibility. play() clears |should_play_upon_shown_|. 528 // Resume playback on visibility. play() clears |should_play_upon_shown_|.
419 if (should_play_upon_shown_) 529 if (should_play_upon_shown_)
420 play(); 530 play();
421 #endif // defined(OS_ANDROID) 531 #endif // defined(OS_ANDROID)
422 } 532 }
423 533
424 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { 534 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) {
425 #if defined(OS_ANDROID) 535 #if defined(OS_ANDROID)
426 if (!must_suspend) 536 if (!must_suspend)
427 return false; 537 return false;
428 538
429 if (!paused_) { 539 if (!paused_) {
430 pause(); 540 pause();
431 should_play_upon_shown_ = true; 541 should_play_upon_shown_ = true;
432 } 542 }
433 543
434 if (delegate_) 544 if (delegate_)
435 delegate_->PlayerGone(delegate_id_); 545 delegate_->PlayerGone(delegate_id_);
436 546
437 render_frame_suspended_ = true; 547 frame_deliverer_->SetRenderFrameSuspended(true);
438 #endif 548 #endif // defined(OS_ANDROID)
439 return true; 549 return true;
440 } 550 }
441 551
442 void WebMediaPlayerMS::OnPlay() { 552 void WebMediaPlayerMS::OnPlay() {
443 // TODO(perkj, magjed): It's not clear how WebRTC should work with an 553 // TODO(perkj, magjed): It's not clear how WebRTC should work with an
444 // MediaSession, until these issues are resolved, disable session controls. 554 // MediaSession, until these issues are resolved, disable session controls.
445 // http://crbug.com/595297. 555 // http://crbug.com/595297.
446 } 556 }
447 557
448 void WebMediaPlayerMS::OnPause() { 558 void WebMediaPlayerMS::OnPause() {
(...skipping 26 matching lines...) Expand all
475 // GPU Process crashed. 585 // GPU Process crashed.
476 if (!provider) 586 if (!provider)
477 return false; 587 return false;
478 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); 588 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext());
479 DCHECK(context_3d.gl); 589 DCHECK(context_3d.gl);
480 return video_renderer_.CopyVideoFrameTexturesToGLTexture( 590 return video_renderer_.CopyVideoFrameTexturesToGLTexture(
481 context_3d, gl, video_frame.get(), texture, internal_format, type, 591 context_3d, gl, video_frame.get(), texture, internal_format, type,
482 premultiply_alpha, flip_y); 592 premultiply_alpha, flip_y);
483 } 593 }
484 594
485 void WebMediaPlayerMS::OnFrameAvailable( 595 void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation,
486 const scoped_refptr<media::VideoFrame>& frame) { 596 bool is_opaque) {
487 DVLOG(3) << __func__; 597 DVLOG(1) << __func__;
598 DCHECK(thread_checker_.CalledOnValidThread());
599 video_rotation_ = video_rotation;
600 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
601 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
602
603 video_weblayer_.reset(new cc_blink::WebLayerImpl(
604 cc::VideoLayer::Create(compositor_.get(), video_rotation_)));
605 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
606 video_weblayer_->SetContentsOpaqueIsFixed(true);
607 get_client()->setWebLayer(video_weblayer_.get());
608 }
609
610 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) {
611 DVLOG(1) << __func__;
488 DCHECK(thread_checker_.CalledOnValidThread()); 612 DCHECK(thread_checker_.CalledOnValidThread());
489 613
490 if (render_frame_suspended_) 614 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
491 return;
492
493 base::TimeTicks render_time;
494 if (frame->metadata()->GetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME,
495 &render_time)) {
496 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable",
497 "Ideal Render Instant", render_time.ToInternalValue());
498 } else {
499 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable");
500 }
501 const bool is_opaque = media::IsOpaque(frame->format());
502
503 if (!received_first_frame_) {
504 received_first_frame_ = true;
505 last_frame_opaque_ = is_opaque;
506 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
507 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
508
509 if (video_frame_provider_.get()) {
510 ignore_result(frame->metadata()->GetRotation(
511 media::VideoFrameMetadata::ROTATION, &video_rotation_));
512
513 video_weblayer_.reset(new cc_blink::WebLayerImpl(
514 cc::VideoLayer::Create(compositor_.get(), video_rotation_)));
515 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
516 video_weblayer_->SetContentsOpaqueIsFixed(true);
517 get_client()->setWebLayer(video_weblayer_.get());
518 }
519 }
520
521 // Only configure opacity on changes, since marking it as transparent is
522 // expensive, see https://crbug.com/647886.
523 if (video_weblayer_ && last_frame_opaque_ != is_opaque) {
524 last_frame_opaque_ = is_opaque;
525 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
526 }
527
528 compositor_->EnqueueFrame(frame);
529 } 615 }
530 616
531 void WebMediaPlayerMS::RepaintInternal() { 617 void WebMediaPlayerMS::RepaintInternal() {
532 DVLOG(1) << __func__; 618 DVLOG(1) << __func__;
533 DCHECK(thread_checker_.CalledOnValidThread()); 619 DCHECK(thread_checker_.CalledOnValidThread());
534 get_client()->repaint(); 620 get_client()->repaint();
535 } 621 }
536 622
537 void WebMediaPlayerMS::OnSourceError() { 623 void WebMediaPlayerMS::OnSourceError() {
538 DCHECK(thread_checker_.CalledOnValidThread()); 624 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 22 matching lines...) Expand all
561 void WebMediaPlayerMS::ResetCanvasCache() { 647 void WebMediaPlayerMS::ResetCanvasCache() {
562 DCHECK(thread_checker_.CalledOnValidThread()); 648 DCHECK(thread_checker_.CalledOnValidThread());
563 video_renderer_.ResetCache(); 649 video_renderer_.ResetCache();
564 } 650 }
565 651
566 void WebMediaPlayerMS::TriggerResize() { 652 void WebMediaPlayerMS::TriggerResize() {
567 get_client()->sizeChanged(); 653 get_client()->sizeChanged();
568 } 654 }
569 655
570 } // namespace content 656 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698