Chromium Code Reviews| Index: content/renderer/media/webmediaplayer_ms.cc |
| diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc |
| index 8d833ee750ef40b9b4dcdf54daab43e1138d00d9..ea69cbed54bb52d4af9962e3186333e8f5290871 100644 |
| --- a/content/renderer/media/webmediaplayer_ms.cc |
| +++ b/content/renderer/media/webmediaplayer_ms.cc |
| @@ -51,6 +51,7 @@ class WebMediaPlayerMS::FrameDeliverer { |
| FrameDeliverer(const base::WeakPtr<WebMediaPlayerMS>& player, |
| const EnqueueFrameCallback& enqueue_frame_cb) |
| : last_frame_opaque_(true), |
| + last_frame_rotation_(media::VIDEO_ROTATION_0), |
| received_first_frame_(false), |
| main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| player_(player), |
| @@ -79,14 +80,16 @@ class WebMediaPlayerMS::FrameDeliverer { |
| } else { |
| TRACE_EVENT0("webrtc", "WebMediaPlayerMS::OnFrameAvailable"); |
| } |
| + |
| const bool is_opaque = media::IsOpaque(frame->format()); |
| + media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; |
| + ignore_result(frame->metadata()->GetRotation( |
| + media::VideoFrameMetadata::ROTATION, &video_rotation)); |
| if (!received_first_frame_) { |
| received_first_frame_ = true; |
| last_frame_opaque_ = is_opaque; |
| - media::VideoRotation video_rotation = media::VIDEO_ROTATION_0; |
| - ignore_result(frame->metadata()->GetRotation( |
| - media::VideoFrameMetadata::ROTATION, &video_rotation)); |
| + last_frame_rotation_ = video_rotation; |
| main_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&WebMediaPlayerMS::OnFirstFrameReceived, |
| player_, video_rotation, is_opaque)); |
| @@ -99,6 +102,13 @@ class WebMediaPlayerMS::FrameDeliverer { |
| base::Bind(&WebMediaPlayerMS::OnOpacityChanged, player_, is_opaque)); |
| } |
| + if (last_frame_rotation_ != video_rotation) { |
| + last_frame_rotation_ = video_rotation; |
| + main_task_runner_->PostTask( |
| + FROM_HERE, base::Bind(&WebMediaPlayerMS::OnRotationChanged, player_, |
| + video_rotation, is_opaque)); |
| + } |
| + |
| enqueue_frame_cb_.Run(frame); |
| } |
| @@ -116,6 +126,7 @@ class WebMediaPlayerMS::FrameDeliverer { |
| private: |
| bool last_frame_opaque_; |
| + media::VideoRotation last_frame_rotation_; |
| bool received_first_frame_; |
| #if defined(OS_ANDROID) |
| @@ -608,11 +619,7 @@ void WebMediaPlayerMS::OnFirstFrameReceived(media::VideoRotation video_rotation, |
| SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| - video_weblayer_.reset(new cc_blink::WebLayerImpl( |
| - cc::VideoLayer::Create(compositor_.get(), video_rotation_))); |
| - video_weblayer_->layer()->SetContentsOpaque(is_opaque); |
| - video_weblayer_->SetContentsOpaqueIsFixed(true); |
| - get_client()->setWebLayer(video_weblayer_.get()); |
| + ResetVideoLayer(video_rotation, is_opaque); |
| } |
| void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) { |
| @@ -622,6 +629,27 @@ void WebMediaPlayerMS::OnOpacityChanged(bool is_opaque) { |
| video_weblayer_->layer()->SetContentsOpaque(is_opaque); |
| } |
| +void WebMediaPlayerMS::OnRotationChanged(media::VideoRotation video_rotation, |
| + bool is_opaque) { |
| + DVLOG(1) << __func__; |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + video_rotation_ = video_rotation; |
| + |
| + ResetVideoLayer(video_rotation, is_opaque); |
| +} |
| + |
| +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.
|
| + bool is_opaque) { |
| + DVLOG(1) << __func__; |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + video_weblayer_.reset(new cc_blink::WebLayerImpl( |
| + cc::VideoLayer::Create(compositor_.get(), video_rotation))); |
| + video_weblayer_->layer()->SetContentsOpaque(is_opaque); |
| + video_weblayer_->SetContentsOpaqueIsFixed(true); |
| + get_client()->setWebLayer(video_weblayer_.get()); |
| +} |
| + |
| void WebMediaPlayerMS::RepaintInternal() { |
| DVLOG(1) << __func__; |
| DCHECK(thread_checker_.CalledOnValidThread()); |