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 <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 25 matching lines...) Expand all Loading... |
36 | 36 |
37 using blink::WebCanvas; | 37 using blink::WebCanvas; |
38 using blink::WebMediaPlayer; | 38 using blink::WebMediaPlayer; |
39 using blink::WebRect; | 39 using blink::WebRect; |
40 using blink::WebSize; | 40 using blink::WebSize; |
41 | 41 |
42 namespace content { | 42 namespace content { |
43 | 43 |
44 namespace { | 44 namespace { |
45 | 45 |
46 // This function copies a YV12 or NATIVE_TEXTURE to a new YV12 | 46 // This function copies |frame| to a new YV12 media::VideoFrame. |
47 // media::VideoFrame. | |
48 scoped_refptr<media::VideoFrame> CopyFrameToYV12( | 47 scoped_refptr<media::VideoFrame> CopyFrameToYV12( |
49 const scoped_refptr<media::VideoFrame>& frame, | 48 const scoped_refptr<media::VideoFrame>& frame, |
50 media::SkCanvasVideoRenderer* video_renderer) { | 49 media::SkCanvasVideoRenderer* video_renderer) { |
51 DCHECK(frame->format() == media::VideoFrame::YV12 || | |
52 frame->format() == media::VideoFrame::I420 || | |
53 frame->format() == media::VideoFrame::NATIVE_TEXTURE); | |
54 scoped_refptr<media::VideoFrame> new_frame = | 50 scoped_refptr<media::VideoFrame> new_frame = |
55 media::VideoFrame::CreateFrame(media::VideoFrame::YV12, | 51 media::VideoFrame::CreateFrame(media::VideoFrame::YV12, |
56 frame->coded_size(), | 52 frame->coded_size(), |
57 frame->visible_rect(), | 53 frame->visible_rect(), |
58 frame->natural_size(), | 54 frame->natural_size(), |
59 frame->timestamp()); | 55 frame->timestamp()); |
60 | 56 |
61 if (frame->format() == media::VideoFrame::NATIVE_TEXTURE) { | 57 if (frame->storage_type() == media::VideoFrame::STORAGE_TEXTURE) { |
| 58 DCHECK(frame->format() == media::VideoFrame::ARGB || |
| 59 frame->format() == media::VideoFrame::XRGB); |
62 SkBitmap bitmap; | 60 SkBitmap bitmap; |
63 bitmap.allocN32Pixels(frame->visible_rect().width(), | 61 bitmap.allocN32Pixels(frame->visible_rect().width(), |
64 frame->visible_rect().height()); | 62 frame->visible_rect().height()); |
65 SkCanvas canvas(bitmap); | 63 SkCanvas canvas(bitmap); |
66 | 64 |
67 cc::ContextProvider* provider = | 65 cc::ContextProvider* const provider = |
68 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); | 66 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); |
69 if (provider) { | 67 if (provider) { |
70 media::Context3D context_3d = | 68 const media::Context3D context_3d = |
71 media::Context3D(provider->ContextGL(), provider->GrContext()); | 69 media::Context3D(provider->ContextGL(), provider->GrContext()); |
72 DCHECK(context_3d.gl); | 70 DCHECK(context_3d.gl); |
73 video_renderer->Copy(frame.get(), &canvas, context_3d); | 71 video_renderer->Copy(frame.get(), &canvas, context_3d); |
74 } else { | 72 } else { |
75 // GPU Process crashed. | 73 // GPU Process crashed. |
76 bitmap.eraseColor(SK_ColorTRANSPARENT); | 74 bitmap.eraseColor(SK_ColorTRANSPARENT); |
77 } | 75 } |
78 media::CopyRGBToVideoFrame( | 76 media::CopyRGBToVideoFrame(reinterpret_cast<uint8*>(bitmap.getPixels()), |
79 reinterpret_cast<uint8*>(bitmap.getPixels()), | 77 bitmap.rowBytes(), |
80 bitmap.rowBytes(), | 78 frame->visible_rect(), |
81 frame->visible_rect(), | 79 new_frame.get()); |
82 new_frame.get()); | |
83 } else { | 80 } else { |
84 size_t number_of_planes = | 81 DCHECK(media::VideoFrame::IsMappable(frame->storage_type())); |
85 media::VideoFrame::NumPlanes(frame->format()); | 82 DCHECK(frame->format() == media::VideoFrame::YV12 || |
86 for (size_t i = 0; i < number_of_planes; ++i) { | 83 frame->format() == media::VideoFrame::I420); |
| 84 for (size_t i = 0; i < media::VideoFrame::NumPlanes(frame->format()); ++i) { |
87 media::CopyPlane(i, frame->data(i), frame->stride(i), | 85 media::CopyPlane(i, frame->data(i), frame->stride(i), |
88 frame->rows(i), new_frame.get()); | 86 frame->rows(i), new_frame.get()); |
89 } | 87 } |
90 } | 88 } |
91 return new_frame; | 89 return new_frame; |
92 } | 90 } |
93 | 91 |
94 } // anonymous namespace | 92 } // anonymous namespace |
95 | 93 |
96 WebMediaPlayerMS::WebMediaPlayerMS( | 94 WebMediaPlayerMS::WebMediaPlayerMS( |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 | 335 |
338 void WebMediaPlayerMS::paint(blink::WebCanvas* canvas, | 336 void WebMediaPlayerMS::paint(blink::WebCanvas* canvas, |
339 const blink::WebRect& rect, | 337 const blink::WebRect& rect, |
340 unsigned char alpha, | 338 unsigned char alpha, |
341 SkXfermode::Mode mode) { | 339 SkXfermode::Mode mode) { |
342 DVLOG(3) << "WebMediaPlayerMS::paint"; | 340 DVLOG(3) << "WebMediaPlayerMS::paint"; |
343 DCHECK(thread_checker_.CalledOnValidThread()); | 341 DCHECK(thread_checker_.CalledOnValidThread()); |
344 | 342 |
345 media::Context3D context_3d; | 343 media::Context3D context_3d; |
346 if (current_frame_.get() && | 344 if (current_frame_.get() && |
347 current_frame_->format() == media::VideoFrame::NATIVE_TEXTURE) { | 345 current_frame_->storage_type() == media::VideoFrame::STORAGE_TEXTURE) { |
348 cc::ContextProvider* provider = | 346 cc::ContextProvider* provider = |
349 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); | 347 RenderThreadImpl::current()->SharedMainThreadContextProvider().get(); |
350 // GPU Process crashed. | 348 // GPU Process crashed. |
351 if (!provider) | 349 if (!provider) |
352 return; | 350 return; |
353 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); | 351 context_3d = media::Context3D(provider->ContextGL(), provider->GrContext()); |
354 DCHECK(context_3d.gl); | 352 DCHECK(context_3d.gl); |
355 } | 353 } |
356 gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); | 354 gfx::RectF dest_rect(rect.x, rect.y, rect.width, rect.height); |
357 video_renderer_.Paint(current_frame_, canvas, dest_rect, alpha, mode, | 355 video_renderer_.Paint(current_frame_, canvas, dest_rect, alpha, mode, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
425 TRACE_EVENT0("media", "WebMediaPlayerMS:copyVideoTextureToPlatformTexture"); | 423 TRACE_EVENT0("media", "WebMediaPlayerMS:copyVideoTextureToPlatformTexture"); |
426 DCHECK(thread_checker_.CalledOnValidThread()); | 424 DCHECK(thread_checker_.CalledOnValidThread()); |
427 | 425 |
428 scoped_refptr<media::VideoFrame> video_frame; | 426 scoped_refptr<media::VideoFrame> video_frame; |
429 { | 427 { |
430 base::AutoLock auto_lock(current_frame_lock_); | 428 base::AutoLock auto_lock(current_frame_lock_); |
431 video_frame = current_frame_; | 429 video_frame = current_frame_; |
432 } | 430 } |
433 | 431 |
434 if (!video_frame.get() || | 432 if (!video_frame.get() || |
435 video_frame->format() != media::VideoFrame::NATIVE_TEXTURE) { | 433 video_frame->storage_type() != media::VideoFrame::STORAGE_TEXTURE) { |
436 return false; | 434 return false; |
437 } | 435 } |
438 | 436 |
439 // TODO(dshwang): need more elegant way to convert WebGraphicsContext3D to | 437 // TODO(dshwang): need more elegant way to convert WebGraphicsContext3D to |
440 // GLES2Interface. | 438 // GLES2Interface. |
441 gpu::gles2::GLES2Interface* gl = | 439 gpu::gles2::GLES2Interface* gl = |
442 static_cast<gpu_blink::WebGraphicsContext3DImpl*>(web_graphics_context) | 440 static_cast<gpu_blink::WebGraphicsContext3DImpl*>(web_graphics_context) |
443 ->GetGLInterface(); | 441 ->GetGLInterface(); |
444 media::SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture( | 442 media::SkCanvasVideoRenderer::CopyVideoFrameTextureToGLTexture( |
445 gl, video_frame.get(), texture, internal_format, type, premultiply_alpha, | 443 gl, video_frame.get(), texture, internal_format, type, premultiply_alpha, |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 GetClient()->readyStateChanged(); | 558 GetClient()->readyStateChanged(); |
561 } | 559 } |
562 | 560 |
563 blink::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { | 561 blink::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { |
564 DCHECK(thread_checker_.CalledOnValidThread()); | 562 DCHECK(thread_checker_.CalledOnValidThread()); |
565 DCHECK(client_); | 563 DCHECK(client_); |
566 return client_; | 564 return client_; |
567 } | 565 } |
568 | 566 |
569 } // namespace content | 567 } // namespace content |
OLD | NEW |