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

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

Issue 2536893002: Reset WebMediaPlayerMS video layer on rotation change (Closed)
Patch Set: Created 4 years 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>
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 // It is created on the main thread, but methods should be called and class 44 // It is created on the main thread, but methods should be called and class
45 // should be destructed on the compositor thread. 45 // should be destructed on the compositor thread.
46 class WebMediaPlayerMS::FrameDeliverer { 46 class WebMediaPlayerMS::FrameDeliverer {
47 public: 47 public:
48 typedef base::Callback<void(scoped_refptr<media::VideoFrame>)> 48 typedef base::Callback<void(scoped_refptr<media::VideoFrame>)>
49 EnqueueFrameCallback; 49 EnqueueFrameCallback;
50 50
51 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, 51 FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player,
52 const EnqueueFrameCallback& enqueue_frame_cb) 52 const EnqueueFrameCallback& enqueue_frame_cb)
53 : last_frame_opaque_(true), 53 : last_frame_opaque_(true),
54 last_frame_rotation_(media::VIDEO_ROTATION_0),
54 received_first_frame_(false), 55 received_first_frame_(false),
55 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), 56 main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
56 player_(player), 57 player_(player),
57 enqueue_frame_cb_(enqueue_frame_cb), 58 enqueue_frame_cb_(enqueue_frame_cb),
58 weak_factory_for_compositor_(this) { 59 weak_factory_for_compositor_(this) {
59 compositor_thread_checker_.DetachFromThread(); 60 compositor_thread_checker_.DetachFromThread();
60 } 61 }
61 62
62 ~FrameDeliverer() { 63 ~FrameDeliverer() {
63 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 64 DCHECK(compositor_thread_checker_.CalledOnValidThread());
64 } 65 }
65 66
66 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) { 67 void OnVideoFrame(scoped_refptr<media::VideoFrame> frame) {
67 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 68 DCHECK(compositor_thread_checker_.CalledOnValidThread());
68 69
69 #if defined(OS_ANDROID) 70 #if defined(OS_ANDROID)
70 if (render_frame_suspended_) 71 if (render_frame_suspended_)
71 return; 72 return;
72 #endif // defined(OS_ANDROID) 73 #endif // defined(OS_ANDROID)
73 74
74 base::TimeTicks render_time; 75 base::TimeTicks render_time;
75 if (frame->metadata()->GetTimeTicks( 76 if (frame->metadata()->GetTimeTicks(
76 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) { 77 media::VideoFrameMetadata::REFERENCE_TIME, &render_time)) {
77 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable", 78 TRACE_EVENT1("webrtc", "WebMediaPlayerMS::OnFrameAvailable",
78 "Ideal Render Instant", render_time.ToInternalValue()); 79 "Ideal Render Instant", render_time.ToInternalValue());
79 } else { 80 } else {
80 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable"); 81 TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable");
81 } 82 }
83
82 const bool is_opaque = media::IsOpaque(frame->format()); 84 const bool is_opaque = media::IsOpaque(frame->format());
85 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0;
86 ignore_result(frame->metadata()->GetRotation(
87 media::VideoFrameMetadata::ROTATION, &video_rotation));
83 88
84 if (!received_first_frame_) { 89 if (!received_first_frame_) {
85 received_first_frame_ = true; 90 received_first_frame_ = true;
86 last_frame_opaque_ = is_opaque; 91 last_frame_opaque_ = is_opaque;
87 media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; 92 last_frame_rotation_ = video_rotation;
88 ignore_result(frame->metadata()->GetRotation(
89 media::VideoFrameMetadata::ROTATION, &video_rotation));
90 main_task_runner_->PostTask( 93 main_task_runner_->PostTask(
91 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnFirstFrameReceived, 94 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnFirstFrameReceived,
92 player_, video_rotation, is_opaque)); 95 player_, video_rotation, is_opaque));
93 } 96 }
94 97
95 if (last_frame_opaque_ != is_opaque) { 98 if (last_frame_opaque_ != is_opaque) {
96 last_frame_opaque_ = is_opaque; 99 last_frame_opaque_ = is_opaque;
97 main_task_runner_->PostTask( 100 main_task_runner_->PostTask(
98 FROM_HERE, 101 FROM_HERE,
99 base::Bind(&WebMediaPlayerMS::OnOpacityChanged, player_, is_opaque)); 102 base::Bind(&WebMediaPlayerMS::OnOpacityChanged, player_, is_opaque));
100 } 103 }
101 104
105 if (last_frame_rotation_ != video_rotation) {
106 last_frame_rotation_ = video_rotation;
107 main_task_runner_->PostTask(
108 FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_,
109 video_rotation, is_opaque));
110 }
111
102 enqueue_frame_cb_.Run(frame); 112 enqueue_frame_cb_.Run(frame);
103 } 113 }
104 114
105 #if defined(OS_ANDROID) 115 #if defined(OS_ANDROID)
106 void SetRenderFrameSuspended(bool render_frame_suspended) { 116 void SetRenderFrameSuspended(bool render_frame_suspended) {
107 DCHECK(compositor_thread_checker_.CalledOnValidThread()); 117 DCHECK(compositor_thread_checker_.CalledOnValidThread());
108 render_frame_suspended_ = render_frame_suspended; 118 render_frame_suspended_ = render_frame_suspended;
109 } 119 }
110 #endif // defined(OS_ANDROID) 120 #endif // defined(OS_ANDROID)
111 121
112 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() { 122 MediaStreamVideoRenderer::RepaintCB GetRepaintCallback() {
113 return base::Bind(&FrameDeliverer::OnVideoFrame, 123 return base::Bind(&FrameDeliverer::OnVideoFrame,
114 weak_factory_for_compositor_.GetWeakPtr()); 124 weak_factory_for_compositor_.GetWeakPtr());
115 } 125 }
116 126
117 private: 127 private:
118 bool last_frame_opaque_; 128 bool last_frame_opaque_;
129 media::VideoRotation last_frame_rotation_;
119 bool received_first_frame_; 130 bool received_first_frame_;
120 131
121 #if defined(OS_ANDROID) 132 #if defined(OS_ANDROID)
122 bool render_frame_suspended_ = false; 133 bool render_frame_suspended_ = false;
123 #endif // defined(OS_ANDROID) 134 #endif // defined(OS_ANDROID)
124 135
125 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; 136 const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
126 const base::WeakPtr<WebMediaPlayerMS> player_; 137 const base::WeakPtr<WebMediaPlayerMS> player_;
127 const EnqueueFrameCallback enqueue_frame_cb_; 138 const EnqueueFrameCallback enqueue_frame_cb_;
128 139
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 } 612 }
602 613
603 void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation, 614 void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation,
604 bool is_opaque) { 615 bool is_opaque) {
605 DVLOG(1) << __func__; 616 DVLOG(1) << __func__;
606 DCHECK(thread_checker_.CalledOnValidThread()); 617 DCHECK(thread_checker_.CalledOnValidThread());
607 video_rotation_ = video_rotation; 618 video_rotation_ = video_rotation;
608 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 619 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
609 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 620 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
610 621
611 video_weblayer_.reset(new cc_blink::WebLayerImpl( 622 ResetVideoLayer(video_rotation, is_opaque);
612 cc::VideoLayer::Create(compositor_.get(), video_rotation_)));
613 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
614 video_weblayer_->SetContentsOpaqueIsFixed(true);
615 get_client()->setWebLayer(video_weblayer_.get());
616 } 623 }
617 624
618 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) { 625 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) {
619 DVLOG(1) << __func__; 626 DVLOG(1) << __func__;
620 DCHECK(thread_checker_.CalledOnValidThread()); 627 DCHECK(thread_checker_.CalledOnValidThread());
621 628
622 video_weblayer_->layer()->SetContentsOpaque(is_opaque); 629 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
623 } 630 }
624 631
632 void WebMediaPlayerMS::OnRotationChanged(media::VideoRotation video_rotation,
633 bool is_opaque) {
634 DVLOG(1) << __func__;
635 DCHECK(thread_checker_.CalledOnValidThread());
636 video_rotation_ = video_rotation;
637
638 ResetVideoLayer(video_rotation, is_opaque);
639 }
640
641 void WebMediaPlayerMS::ResetVideoLayer(media::VideoRotation video_rotation,
mcasas 2016/11/29 01:04:31 You could remove OnRotationChanged(), moving l.636
emircan 2016/11/29 18:19:21 Done. I was trying to be consistent with On*Change
mcasas 2016/11/29 19:23:42 Yeah, the names are misleading since they don't ac
emircan 2016/11/29 19:48:25 Done.
642 bool is_opaque) {
643 DVLOG(1) << __func__;
644 DCHECK(thread_checker_.CalledOnValidThread());
645
646 video_weblayer_.reset(new cc_blink::WebLayerImpl(
647 cc::VideoLayer::Create(compositor_.get(), video_rotation)));
648 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
649 video_weblayer_->SetContentsOpaqueIsFixed(true);
650 get_client()->setWebLayer(video_weblayer_.get());
651 }
652
625 void WebMediaPlayerMS::RepaintInternal() { 653 void WebMediaPlayerMS::RepaintInternal() {
626 DVLOG(1) << __func__; 654 DVLOG(1) << __func__;
627 DCHECK(thread_checker_.CalledOnValidThread()); 655 DCHECK(thread_checker_.CalledOnValidThread());
628 get_client()->repaint(); 656 get_client()->repaint();
629 } 657 }
630 658
631 void WebMediaPlayerMS::OnSourceError() { 659 void WebMediaPlayerMS::OnSourceError() {
632 DCHECK(thread_checker_.CalledOnValidThread()); 660 DCHECK(thread_checker_.CalledOnValidThread());
633 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 661 SetNetworkState(WebMediaPlayer::NetworkStateFormatError);
634 RepaintInternal(); 662 RepaintInternal();
(...skipping 20 matching lines...) Expand all
655 void WebMediaPlayerMS::ResetCanvasCache() { 683 void WebMediaPlayerMS::ResetCanvasCache() {
656 DCHECK(thread_checker_.CalledOnValidThread()); 684 DCHECK(thread_checker_.CalledOnValidThread());
657 video_renderer_.ResetCache(); 685 video_renderer_.ResetCache();
658 } 686 }
659 687
660 void WebMediaPlayerMS::TriggerResize() { 688 void WebMediaPlayerMS::TriggerResize() {
661 get_client()->sizeChanged(); 689 get_client()->sizeChanged();
662 } 690 }
663 691
664 } // namespace content 692 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/webmediaplayer_ms.h ('k') | content/renderer/media/webmediaplayer_ms_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698