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

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@ 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>&)>
DaleCurtis 2016/11/15 00:30:16 New usage should be by value.
emircan 2016/11/15 19:54:02 Done.
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 if (render_frame_suspended_)
71 return;
72 #endif // defined(OS_ANDROID)
73
74 base::TimeTicks render_time;
75 if (frame->metadata()->GetTimeTicks(
76 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) {
77 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable",
78 "Ideal Render Instant", render_time.ToInternalValue());
79 } else {
80 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable");
81 }
82 const bool is_opaque = media::IsOpaque(frame->format());
83
84 if (!received_first_frame_) {
85 received_first_frame_ = true;
86 last_frame_opaque_ = is_opaque;
87 media::VideoRotation video_rotation;
88 ignore_result(frame->metadata()->GetRotation(
89 media::VideoFrameMetadata::ROTATION, &video_rotation));
90 main_task_runner_->PostTask(
91 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnFirstFrameReceived,
92 player_, video_rotation, is_opaque));
93 }
94
95 if (last_frame_opaque_ != is_opaque) {
96 last_frame_opaque_ = is_opaque;
97 main_task_runner_->PostTask(
98 FROM_HERE,
99 base::Bind(&WebMediaPlayerMS::OnOpacityChanged, player_, is_opaque));
100 }
101
102 enqueue_frame_cb_.Run(frame);
103 }
104
105 #if defined(OS_ANDROID)
106 void SetRenderFrameSuspended(bool render_frame_suspended) {
107 DCHECK(compositor_thread_checker_.CalledOnValidThread());
108 render_frame_suspended_ = render_frame_suspended;
109 }
110 #endif // defined(OS_ANDROID)
111
112 base::WeakPtr<FrameDelivererOnCompositor> GetWeakPtr() {
DaleCurtis 2016/11/15 00:30:16 Ditto on WeakPtr.
emircan 2016/11/15 19:54:02 Done.
113 return weak_factory_for_compositor_.GetWeakPtr();
114 }
115
116 private:
117 bool last_frame_opaque_;
118 bool received_first_frame_;
119
120 #if defined(OS_ANDROID)
121 bool render_frame_suspended_ = false;
122 #endif // defined(OS_ANDROID)
123
124 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
125 const base::WeakPtr<WebMediaPlayerMS> player_;
126 const EnqueueFrameCallback enqueue_frame_cb_;
127
128 // Used for DCHECKs to ensure method calls executed on the correct thread,
129 // i.e. compositor thread.
130 base::ThreadChecker compositor_thread_checker_;
131
132 base::WeakPtrFactory<FrameDelivererOnCompositor> weak_factory_for_compositor_;
133
134 DISALLOW_COPY_AND_ASSIGN(FrameDelivererOnCompositor);
135 };
136
39 WebMediaPlayerMS::WebMediaPlayerMS( 137 WebMediaPlayerMS::WebMediaPlayerMS(
40 blink::WebFrame* frame, 138 blink::WebFrame* frame,
41 blink::WebMediaPlayerClient* client, 139 blink::WebMediaPlayerClient* client,
42 base::WeakPtr<media::WebMediaPlayerDelegate> delegate, 140 base::WeakPtr<media::WebMediaPlayerDelegate> delegate,
43 media::MediaLog* media_log, 141 media::MediaLog* media_log,
44 std::unique_ptr<MediaStreamRendererFactory> factory, 142 std::unique_ptr<MediaStreamRendererFactory> factory,
45 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, 143 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
46 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner, 144 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
47 const scoped_refptr<base::TaskRunner>& worker_task_runner, 145 const scoped_refptr<base::TaskRunner>& worker_task_runner,
48 media::GpuVideoAcceleratorFactories* gpu_factories, 146 media::GpuVideoAcceleratorFactories* gpu_factories,
49 const blink::WebString& sink_id, 147 const blink::WebString& sink_id,
50 const blink::WebSecurityOrigin& security_origin) 148 const blink::WebSecurityOrigin& security_origin)
51 : frame_(frame), 149 : frame_(frame),
52 network_state_(WebMediaPlayer::NetworkStateEmpty), 150 network_state_(WebMediaPlayer::NetworkStateEmpty),
53 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 151 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
54 buffered_(static_cast<size_t>(0)), 152 buffered_(static_cast<size_t>(0)),
55 client_(client), 153 client_(client),
56 delegate_(delegate), 154 delegate_(delegate),
57 delegate_id_(0), 155 delegate_id_(0),
58 last_frame_opaque_(true),
59 paused_(true), 156 paused_(true),
60 render_frame_suspended_(false),
61 received_first_frame_(false),
62 video_rotation_(media::VIDEO_ROTATION_0), 157 video_rotation_(media::VIDEO_ROTATION_0),
63 media_log_(media_log), 158 media_log_(media_log),
64 renderer_factory_(std::move(factory)), 159 renderer_factory_(std::move(factory)),
65 media_task_runner_(media_task_runner), 160 media_task_runner_(media_task_runner),
66 worker_task_runner_(worker_task_runner), 161 worker_task_runner_(worker_task_runner),
67 gpu_factories_(gpu_factories), 162 gpu_factories_(gpu_factories),
68 compositor_task_runner_(compositor_task_runner), 163 compositor_task_runner_(compositor_task_runner),
69 initial_audio_output_device_id_(sink_id.utf8()), 164 initial_audio_output_device_id_(sink_id.utf8()),
70 initial_security_origin_(security_origin.isNull() 165 initial_security_origin_(security_origin.isNull()
71 ? url::Origin() 166 ? url::Origin()
(...skipping 11 matching lines...) Expand all
83 } 178 }
84 179
85 WebMediaPlayerMS::~WebMediaPlayerMS() { 180 WebMediaPlayerMS::~WebMediaPlayerMS() {
86 DVLOG(1) << __func__; 181 DVLOG(1) << __func__;
87 DCHECK(thread_checker_.CalledOnValidThread()); 182 DCHECK(thread_checker_.CalledOnValidThread());
88 183
89 // Destruct compositor resources in the proper order. 184 // Destruct compositor resources in the proper order.
90 get_client()->setWebLayer(nullptr); 185 get_client()->setWebLayer(nullptr);
91 if (video_weblayer_) 186 if (video_weblayer_)
92 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider(); 187 static_cast<cc::VideoLayer*>(video_weblayer_->layer())->StopUsingProvider();
188
189 if (frame_deliverer_)
190 compositor_task_runner_->DeleteSoon(FROM_HERE, frame_deliverer_.release());
191
93 if (compositor_) 192 if (compositor_)
94 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release()); 193 compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_.release());
95 194
96 if (video_frame_provider_) 195 if (video_frame_provider_)
97 video_frame_provider_->Stop(); 196 video_frame_provider_->Stop();
98 197
99 if (audio_renderer_) 198 if (audio_renderer_)
100 audio_renderer_->Stop(); 199 audio_renderer_->Stop();
101 200
102 media_log_->AddEvent( 201 media_log_->AddEvent(
(...skipping 19 matching lines...) Expand all
122 221
123 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_, 222 compositor_.reset(new WebMediaPlayerMSCompositor(compositor_task_runner_,
124 web_stream, AsWeakPtr())); 223 web_stream, AsWeakPtr()));
125 224
126 SetNetworkState(WebMediaPlayer::NetworkStateLoading); 225 SetNetworkState(WebMediaPlayer::NetworkStateLoading);
127 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); 226 SetReadyState(WebMediaPlayer::ReadyStateHaveNothing);
128 std::string stream_id = 227 std::string stream_id =
129 web_stream.isNull() ? std::string() : web_stream.id().utf8(); 228 web_stream.isNull() ? std::string() : web_stream.id().utf8();
130 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id)); 229 media_log_->AddEvent(media_log_->CreateLoadEvent(stream_id));
131 230
231 frame_deliverer_.reset(new WebMediaPlayerMS::FrameDelivererOnCompositor(
232 AsWeakPtr(), base::Bind(&WebMediaPlayerMSCompositor::EnqueueFrame,
233 compositor_->GetWeakPtr())));
132 video_frame_provider_ = renderer_factory_->GetVideoRenderer( 234 video_frame_provider_ = renderer_factory_->GetVideoRenderer(
133 web_stream, base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr()), 235 web_stream, media::BindToCurrentLoop(base::Bind(
134 base::Bind(&WebMediaPlayerMS::OnFrameAvailable, AsWeakPtr()), 236 &WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
135 media_task_runner_, worker_task_runner_, gpu_factories_); 237 base::Bind(&FrameDelivererOnCompositor::OnVideoFrame,
238 frame_deliverer_->GetWeakPtr()),
239 compositor_task_runner_, media_task_runner_, worker_task_runner_,
240 gpu_factories_);
136 241
137 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_); 242 RenderFrame* const frame = RenderFrame::FromWebFrame(frame_);
138 243
139 if (frame) { 244 if (frame) {
140 // Report UMA and RAPPOR metrics. 245 // Report UMA and RAPPOR metrics.
141 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL(); 246 GURL url = source.isURL() ? GURL(source.getAsURL()) : GURL();
142 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin()); 247 media::ReportMetrics(load_type, url, frame_->getSecurityOrigin());
143 248
144 audio_renderer_ = renderer_factory_->GetAudioRenderer( 249 audio_renderer_ = renderer_factory_->GetAudioRenderer(
145 web_stream, frame->GetRoutingID(), initial_audio_output_device_id_, 250 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() { 500 void WebMediaPlayerMS::OnHidden() {
396 #if defined(OS_ANDROID) 501 #if defined(OS_ANDROID)
397 DCHECK(thread_checker_.CalledOnValidThread()); 502 DCHECK(thread_checker_.CalledOnValidThread());
398 503
399 // Method called when the RenderFrame is sent to background and suspended 504 // Method called when the RenderFrame is sent to background and suspended
400 // (android). Substitute the displayed VideoFrame with a copy to avoid 505 // (android). Substitute the displayed VideoFrame with a copy to avoid
401 // holding on to it unnecessarily. 506 // holding on to it unnecessarily.
402 // 507 //
403 // During undoable tab closures OnHidden() may be called back to back, so we 508 // During undoable tab closures OnHidden() may be called back to back, so we
404 // can't rely on |render_frame_suspended_| being false here. 509 // can't rely on |render_frame_suspended_| being false here.
510 if (frame_deliverer_) {
511 compositor_task_runner_->PostTask(
512 FROM_HERE,
513 base::Bind(&FrameDelivererOnCompositor::SetRenderFrameSuspended,
514 frame_deliverer_->GetWeakPtr(), true));
515 }
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 compositor_task_runner_->PostTask(
527 FROM_HERE,
528 base::Bind(&FrameDelivererOnCompositor::SetRenderFrameSuspended,
529 frame_deliverer_->GetWeakPtr(), false));
417 530
418 // Resume playback on visibility. play() clears |should_play_upon_shown_|. 531 // Resume playback on visibility. play() clears |should_play_upon_shown_|.
419 if (should_play_upon_shown_) 532 if (should_play_upon_shown_)
420 play(); 533 play();
421 #endif // defined(OS_ANDROID) 534 #endif // defined(OS_ANDROID)
422 } 535 }
423 536
424 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) { 537 bool WebMediaPlayerMS::OnSuspendRequested(bool must_suspend) {
425 #if defined(OS_ANDROID) 538 #if defined(OS_ANDROID)
426 if (!must_suspend) 539 if (!must_suspend)
427 return false; 540 return false;
428 541
429 if (!paused_) { 542 if (!paused_) {
430 pause(); 543 pause();
431 should_play_upon_shown_ = true; 544 should_play_upon_shown_ = true;
432 } 545 }
433 546
434 if (delegate_) 547 if (delegate_)
435 delegate_->PlayerGone(delegate_id_); 548 delegate_->PlayerGone(delegate_id_);
436 549
437 render_frame_suspended_ = true; 550 compositor_task_runner_->PostTask(
438 #endif 551 FROM_HERE,
552 base::Bind(&FrameDelivererOnCompositor::SetRenderFrameSuspended,
553 frame_deliverer_->GetWeakPtr(), true));
554 #endif // defined(OS_ANDROID)
439 return true; 555 return true;
440 } 556 }
441 557
442 void WebMediaPlayerMS::OnPlay() { 558 void WebMediaPlayerMS::OnPlay() {
443 // TODO(perkj, magjed): It's not clear how WebRTC should work with an 559 // TODO(perkj, magjed): It's not clear how WebRTC should work with an
444 // MediaSession, until these issues are resolved, disable session controls. 560 // MediaSession, until these issues are resolved, disable session controls.
445 // http://crbug.com/595297. 561 // http://crbug.com/595297.
446 } 562 }
447 563
448 void WebMediaPlayerMS::OnPause() { 564 void WebMediaPlayerMS::OnPause() {
(...skipping 26 matching lines...) Expand all
475 // GPU Process crashed. 591 // GPU Process crashed.
476 if (!provider) 592 if (!provider)
477 return false; 593 return false;
478 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); 594 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext());
479 DCHECK(context_3d.gl); 595 DCHECK(context_3d.gl);
480 return video_renderer_.CopyVideoFrameTexturesToGLTexture( 596 return video_renderer_.CopyVideoFrameTexturesToGLTexture(
481 context_3d, gl, video_frame.get(), texture, internal_format, type, 597 context_3d, gl, video_frame.get(), texture, internal_format, type,
482 premultiply_alpha, flip_y); 598 premultiply_alpha, flip_y);
483 } 599 }
484 600
485 void WebMediaPlayerMS::OnFrameAvailable( 601 void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation,
486 const scoped_refptr<media::VideoFrame>& frame) { 602 bool is_opaque) {
487 DVLOG(3) << __func__; 603 DVLOG(1) << __func__;
604 DCHECK(thread_checker_.CalledOnValidThread());
605 video_rotation_ = video_rotation;
606 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
607 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
608
609 video_weblayer_.reset(new cc_blink::WebLayerImpl(
610 cc::VideoLayer::Create(compositor_.get(), video_rotation_)));
611 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
612 video_weblayer_->SetContentsOpaqueIsFixed(true);
613 get_client()->setWebLayer(video_weblayer_.get());
614 }
615
616 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) {
617 DVLOG(1) << __func__;
488 DCHECK(thread_checker_.CalledOnValidThread()); 618 DCHECK(thread_checker_.CalledOnValidThread());
489 619
490 if (render_frame_suspended_) 620 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 } 621 }
530 622
531 void WebMediaPlayerMS::RepaintInternal() { 623 void WebMediaPlayerMS::RepaintInternal() {
532 DVLOG(1) << __func__; 624 DVLOG(1) << __func__;
533 DCHECK(thread_checker_.CalledOnValidThread()); 625 DCHECK(thread_checker_.CalledOnValidThread());
534 get_client()->repaint(); 626 get_client()->repaint();
535 } 627 }
536 628
537 void WebMediaPlayerMS::OnSourceError() { 629 void WebMediaPlayerMS::OnSourceError() {
538 DCHECK(thread_checker_.CalledOnValidThread()); 630 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 22 matching lines...) Expand all
561 void WebMediaPlayerMS::ResetCanvasCache() { 653 void WebMediaPlayerMS::ResetCanvasCache() {
562 DCHECK(thread_checker_.CalledOnValidThread()); 654 DCHECK(thread_checker_.CalledOnValidThread());
563 video_renderer_.ResetCache(); 655 video_renderer_.ResetCache();
564 } 656 }
565 657
566 void WebMediaPlayerMS::TriggerResize() { 658 void WebMediaPlayerMS::TriggerResize() {
567 get_client()->sizeChanged(); 659 get_client()->sizeChanged();
568 } 660 }
569 661
570 } // namespace content 662 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698