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

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

Issue 1154153003: Relanding 1143663007: VideoFrame: Separate Pixel Format from Storage Type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added NV12 support in CrOS Created 5 years, 6 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 <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
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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/media/video_track_adapter.cc ('k') | content/renderer/pepper/pepper_video_encoder_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698