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

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

Issue 2150203002: Apply rotation for texture backed VideoFrames (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months 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 "build/build_config.h" 14 #include "build/build_config.h"
15 #include "cc/blink/web_layer_impl.h" 15 #include "cc/blink/web_layer_impl.h"
16 #include "cc/layers/video_frame_provider_client_impl.h" 16 #include "cc/layers/video_frame_provider_client_impl.h"
17 #include "cc/layers/video_layer.h" 17 #include "cc/layers/video_layer.h"
18 #include "content/common/gpu/client/context_provider_command_buffer.h" 18 #include "content/common/gpu/client/context_provider_command_buffer.h"
19 #include "content/public/renderer/media_stream_audio_renderer.h" 19 #include "content/public/renderer/media_stream_audio_renderer.h"
20 #include "content/public/renderer/media_stream_renderer_factory.h" 20 #include "content/public/renderer/media_stream_renderer_factory.h"
21 #include "content/public/renderer/media_stream_video_renderer.h" 21 #include "content/public/renderer/media_stream_video_renderer.h"
22 #include "content/renderer/media/web_media_element_source_utils.h" 22 #include "content/renderer/media/web_media_element_source_utils.h"
23 #include "content/renderer/media/webmediaplayer_ms_compositor.h" 23 #include "content/renderer/media/webmediaplayer_ms_compositor.h"
24 #include "content/renderer/render_frame_impl.h" 24 #include "content/renderer/render_frame_impl.h"
25 #include "content/renderer/render_thread_impl.h" 25 #include "content/renderer/render_thread_impl.h"
26 #include "media/base/media_log.h" 26 #include "media/base/media_log.h"
27 #include "media/base/video_frame.h" 27 #include "media/base/video_frame.h"
28 #include "media/base/video_rotation.h"
28 #include "media/blink/webmediaplayer_util.h" 29 #include "media/blink/webmediaplayer_util.h"
29 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" 30 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
30 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h" 31 #include "third_party/WebKit/public/platform/WebMediaPlayerSource.h"
31 #include "third_party/WebKit/public/platform/WebRect.h" 32 #include "third_party/WebKit/public/platform/WebRect.h"
32 #include "third_party/WebKit/public/platform/WebSize.h" 33 #include "third_party/WebKit/public/platform/WebSize.h"
33 34
34 namespace content { 35 namespace content {
35 36
36 WebMediaPlayerMS::WebMediaPlayerMS( 37 WebMediaPlayerMS::WebMediaPlayerMS(
37 blink::WebFrame* frame, 38 blink::WebFrame* frame,
(...skipping 10 matching lines...) Expand all
48 : frame_(frame), 49 : frame_(frame),
49 network_state_(WebMediaPlayer::NetworkStateEmpty), 50 network_state_(WebMediaPlayer::NetworkStateEmpty),
50 ready_state_(WebMediaPlayer::ReadyStateHaveNothing), 51 ready_state_(WebMediaPlayer::ReadyStateHaveNothing),
51 buffered_(static_cast<size_t>(0)), 52 buffered_(static_cast<size_t>(0)),
52 client_(client), 53 client_(client),
53 delegate_(delegate), 54 delegate_(delegate),
54 delegate_id_(0), 55 delegate_id_(0),
55 paused_(true), 56 paused_(true),
56 render_frame_suspended_(false), 57 render_frame_suspended_(false),
57 received_first_frame_(false), 58 received_first_frame_(false),
59 video_rotation_(media::VIDEO_ROTATION_0),
58 media_log_(media_log), 60 media_log_(media_log),
59 renderer_factory_(std::move(factory)), 61 renderer_factory_(std::move(factory)),
60 media_task_runner_(media_task_runner), 62 media_task_runner_(media_task_runner),
61 worker_task_runner_(worker_task_runner), 63 worker_task_runner_(worker_task_runner),
62 gpu_factories_(gpu_factories), 64 gpu_factories_(gpu_factories),
63 compositor_task_runner_(compositor_task_runner), 65 compositor_task_runner_(compositor_task_runner),
64 initial_audio_output_device_id_(sink_id.utf8()), 66 initial_audio_output_device_id_(sink_id.utf8()),
65 initial_security_origin_(security_origin.isNull() 67 initial_security_origin_(security_origin.isNull()
66 ? url::Origin() 68 ? url::Origin()
67 : url::Origin(security_origin)), 69 : url::Origin(security_origin)),
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 return (video_frame_provider_.get() != nullptr); 259 return (video_frame_provider_.get() != nullptr);
258 } 260 }
259 261
260 bool WebMediaPlayerMS::hasAudio() const { 262 bool WebMediaPlayerMS::hasAudio() const {
261 DCHECK(thread_checker_.CalledOnValidThread()); 263 DCHECK(thread_checker_.CalledOnValidThread());
262 return (audio_renderer_.get() != nullptr); 264 return (audio_renderer_.get() != nullptr);
263 } 265 }
264 266
265 blink::WebSize WebMediaPlayerMS::naturalSize() const { 267 blink::WebSize WebMediaPlayerMS::naturalSize() const {
266 DCHECK(thread_checker_.CalledOnValidThread()); 268 DCHECK(thread_checker_.CalledOnValidThread());
269 if (video_rotation_ == media::VIDEO_ROTATION_90 ||
270 video_rotation_ == media::VideoRotation::VIDEO_ROTATION_270) {
271 const gfx::Size& current_size = compositor_->GetCurrentSize();
272 return blink::WebSize(current_size.height(), current_size.width());
mcasas 2016/07/15 01:57:34 nit: blink::WebSize has a ctor with gfx::Size as p
chcunningham 2016/07/15 18:25:52 I think he means to swap width and height here. II
emircan 2016/07/15 18:43:13 I am swapping height and width here as ccunningham
273 }
267 return blink::WebSize(compositor_->GetCurrentSize()); 274 return blink::WebSize(compositor_->GetCurrentSize());
268 } 275 }
269 276
270 bool WebMediaPlayerMS::paused() const { 277 bool WebMediaPlayerMS::paused() const {
271 DCHECK(thread_checker_.CalledOnValidThread()); 278 DCHECK(thread_checker_.CalledOnValidThread());
272 return paused_; 279 return paused_;
273 } 280 }
274 281
275 bool WebMediaPlayerMS::seeking() const { 282 bool WebMediaPlayerMS::seeking() const {
276 DCHECK(thread_checker_.CalledOnValidThread()); 283 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 auto* provider = 345 auto* provider =
339 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); 346 RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
340 // GPU Process crashed. 347 // GPU Process crashed.
341 if (!provider) 348 if (!provider)
342 return; 349 return;
343 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); 350 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext());
344 DCHECK(context_3d.gl); 351 DCHECK(context_3d.gl);
345 } 352 }
346 const gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); 353 const gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height);
347 video_renderer_.Paint(frame, canvas, dest_rect, alpha, mode, 354 video_renderer_.Paint(frame, canvas, dest_rect, alpha, mode,
348 media::VIDEO_ROTATION_0, context_3d); 355 video_rotation_, context_3d);
349 } 356 }
350 357
351 bool WebMediaPlayerMS::hasSingleSecurityOrigin() const { 358 bool WebMediaPlayerMS::hasSingleSecurityOrigin() const {
352 DCHECK(thread_checker_.CalledOnValidThread()); 359 DCHECK(thread_checker_.CalledOnValidThread());
353 return true; 360 return true;
354 } 361 }
355 362
356 bool WebMediaPlayerMS::didPassCORSAccessCheck() const { 363 bool WebMediaPlayerMS::didPassCORSAccessCheck() const {
357 DCHECK(thread_checker_.CalledOnValidThread()); 364 DCHECK(thread_checker_.CalledOnValidThread());
358 return true; 365 return true;
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 } 494 }
488 495
489 if (!received_first_frame_) { 496 if (!received_first_frame_) {
490 received_first_frame_ = true; 497 received_first_frame_ = true;
491 if (getReadyState() < WebMediaPlayer::ReadyStateHaveEnoughData) { 498 if (getReadyState() < WebMediaPlayer::ReadyStateHaveEnoughData) {
492 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); 499 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata);
493 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); 500 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData);
494 } 501 }
495 502
496 if (video_frame_provider_.get()) { 503 if (video_frame_provider_.get()) {
504 if (frame->metadata()->GetRotation(media::VideoFrameMetadata::ROTATION,
505 &video_rotation_)) {
506 DVLOG(3) << "Applying rotation: " << video_rotation_;
507 }
mcasas 2016/07/15 01:57:34 All metadata() methods are marked WARN_UNUSED_RESU
chcunningham 2016/07/15 18:25:52 He does care though right? Line 510 where he uses
emircan 2016/07/15 18:43:13 What I ignore here is the return bool of GetRotati
emircan 2016/07/15 18:43:13 Done.
508
497 video_weblayer_.reset(new cc_blink::WebLayerImpl( 509 video_weblayer_.reset(new cc_blink::WebLayerImpl(
498 cc::VideoLayer::Create(compositor_.get(), media::VIDEO_ROTATION_0))); 510 cc::VideoLayer::Create(compositor_.get(), video_rotation_)));
499 video_weblayer_->layer()->SetContentsOpaque(false); 511 video_weblayer_->layer()->SetContentsOpaque(false);
500 video_weblayer_->SetContentsOpaqueIsFixed(true); 512 video_weblayer_->SetContentsOpaqueIsFixed(true);
501 get_client()->setWebLayer(video_weblayer_.get()); 513 get_client()->setWebLayer(video_weblayer_.get());
502 } 514 }
503 } 515 }
504 516
505 compositor_->EnqueueFrame(frame); 517 compositor_->EnqueueFrame(frame);
506 } 518 }
507 519
508 void WebMediaPlayerMS::RepaintInternal() { 520 void WebMediaPlayerMS::RepaintInternal() {
(...skipping 29 matching lines...) Expand all
538 void WebMediaPlayerMS::ResetCanvasCache() { 550 void WebMediaPlayerMS::ResetCanvasCache() {
539 DCHECK(thread_checker_.CalledOnValidThread()); 551 DCHECK(thread_checker_.CalledOnValidThread());
540 video_renderer_.ResetCache(); 552 video_renderer_.ResetCache();
541 } 553 }
542 554
543 void WebMediaPlayerMS::TriggerResize() { 555 void WebMediaPlayerMS::TriggerResize() {
544 get_client()->sizeChanged(); 556 get_client()->sizeChanged();
545 } 557 }
546 558
547 } // namespace content 559 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698