Chromium Code Reviews| 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> |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |