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

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::ResetVideoLayer, 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 468 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 DCHECK(context_3d.gl); 608 DCHECK(context_3d.gl);
598 return video_renderer_.CopyVideoFrameTexturesToGLTexture( 609 return video_renderer_.CopyVideoFrameTexturesToGLTexture(
599 context_3d, gl, video_frame.get(), texture, internal_format, type, 610 context_3d, gl, video_frame.get(), texture, internal_format, type,
600 premultiply_alpha, flip_y); 611 premultiply_alpha, flip_y);
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;
608 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 618 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
609 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 619 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
610 620
611 video_weblayer_.reset(new cc_blink::WebLayerImpl( 621 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 } 622 }
617 623
618 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) { 624 void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) {
619 DVLOG(1) << __func__; 625 DVLOG(1) << __func__;
620 DCHECK(thread_checker_.CalledOnValidThread()); 626 DCHECK(thread_checker_.CalledOnValidThread());
621 627
622 video_weblayer_->layer()->SetContentsOpaque(is_opaque); 628 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
623 } 629 }
624 630
631 void WebMediaPlayerMS::ResetVideoLayer(media::VideoRotation video_rotation,
632 bool is_opaque) {
633 DVLOG(1) << __func__;
634 DCHECK(thread_checker_.CalledOnValidThread());
635 video_rotation_ = video_rotation;
636
637 video_weblayer_.reset(new cc_blink::WebLayerImpl(
638 cc::VideoLayer::Create(compositor_.get(), video_rotation)));
639 video_weblayer_->layer()->SetContentsOpaque(is_opaque);
640 video_weblayer_->SetContentsOpaqueIsFixed(true);
mcasas 2016/11/29 19:23:42 The opacity is set in OnOpacityChanged() which is
emircan 2016/11/29 19:48:25 We can change opacity dynamically while the sessio
641 get_client()->setWebLayer(video_weblayer_.get());
642 }
643
625 void WebMediaPlayerMS::RepaintInternal() { 644 void WebMediaPlayerMS::RepaintInternal() {
626 DVLOG(1) << __func__; 645 DVLOG(1) << __func__;
627 DCHECK(thread_checker_.CalledOnValidThread()); 646 DCHECK(thread_checker_.CalledOnValidThread());
628 get_client()->repaint(); 647 get_client()->repaint();
629 } 648 }
630 649
631 void WebMediaPlayerMS::OnSourceError() { 650 void WebMediaPlayerMS::OnSourceError() {
632 DCHECK(thread_checker_.CalledOnValidThread()); 651 DCHECK(thread_checker_.CalledOnValidThread());
633 SetNetworkState(WebMediaPlayer::NetworkStateFormatError); 652 SetNetworkState(WebMediaPlayer::NetworkStateFormatError);
634 RepaintInternal(); 653 RepaintInternal();
(...skipping 20 matching lines...) Expand all
655 void WebMediaPlayerMS::ResetCanvasCache() { 674 void WebMediaPlayerMS::ResetCanvasCache() {
656 DCHECK(thread_checker_.CalledOnValidThread()); 675 DCHECK(thread_checker_.CalledOnValidThread());
657 video_renderer_.ResetCache(); 676 video_renderer_.ResetCache();
658 } 677 }
659 678
660 void WebMediaPlayerMS::TriggerResize() { 679 void WebMediaPlayerMS::TriggerResize() {
661 get_client()->sizeChanged(); 680 get_client()->sizeChanged();
662 } 681 }
663 682
664 } // namespace content 683 } // 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