| Index: content/renderer/media/webmediaplayer_ms.cc
|
| diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc
|
| index 4c689d6d4e7bdd362865268a0267fcb315c0b211..84214fc4be0d5767046e983b86237fcab1eaa3c0 100644
|
| --- a/content/renderer/media/webmediaplayer_ms.cc
|
| +++ b/content/renderer/media/webmediaplayer_ms.cc
|
| @@ -39,12 +39,15 @@ using blink::WebMediaPlayer;
|
| using blink::WebRect;
|
| using blink::WebSize;
|
|
|
| +namespace content {
|
| +
|
| namespace {
|
|
|
| // This function copies a YV12 or NATIVE_TEXTURE to a new YV12
|
| // media::VideoFrame.
|
| scoped_refptr<media::VideoFrame> CopyFrameToYV12(
|
| - const scoped_refptr<media::VideoFrame>& frame) {
|
| + const scoped_refptr<media::VideoFrame>& frame,
|
| + media::SkCanvasVideoRenderer* video_renderer) {
|
| DCHECK(frame->format() == media::VideoFrame::YV12 ||
|
| frame->format() == media::VideoFrame::I420 ||
|
| frame->format() == media::VideoFrame::NATIVE_TEXTURE);
|
| @@ -59,8 +62,19 @@ scoped_refptr<media::VideoFrame> CopyFrameToYV12(
|
| SkBitmap bitmap;
|
| bitmap.allocN32Pixels(frame->visible_rect().width(),
|
| frame->visible_rect().height());
|
| - frame->ReadPixelsFromNativeTexture(bitmap);
|
| + SkCanvas canvas(bitmap);
|
|
|
| + cc::ContextProvider* provider =
|
| + RenderThreadImpl::current()->SharedMainThreadContextProvider().get();
|
| + if (provider) {
|
| + media::Context3D context_3d =
|
| + media::Context3D(provider->ContextGL(), provider->GrContext());
|
| + DCHECK(context_3d.gl);
|
| + video_renderer->Copy(frame.get(), &canvas, context_3d);
|
| + } else {
|
| + // GPU Process crashed.
|
| + bitmap.eraseColor(SK_ColorTRANSPARENT);
|
| + }
|
| media::CopyRGBToVideoFrame(
|
| reinterpret_cast<uint8*>(bitmap.getPixels()),
|
| bitmap.rowBytes(),
|
| @@ -79,8 +93,6 @@ scoped_refptr<media::VideoFrame> CopyFrameToYV12(
|
|
|
| } // anonymous namespace
|
|
|
| -namespace content {
|
| -
|
| WebMediaPlayerMS::WebMediaPlayerMS(
|
| blink::WebFrame* frame,
|
| blink::WebMediaPlayerClient* client,
|
| @@ -220,7 +232,9 @@ void WebMediaPlayerMS::pause() {
|
| // The original frame must not be referenced when the player is paused since
|
| // there might be a finite number of available buffers. E.g, video that
|
| // originates from a video camera.
|
| - scoped_refptr<media::VideoFrame> new_frame = CopyFrameToYV12(current_frame_);
|
| + scoped_refptr<media::VideoFrame> new_frame =
|
| + CopyFrameToYV12(current_frame_, &video_renderer_);
|
| +
|
| base::AutoLock auto_lock(current_frame_lock_);
|
| current_frame_ = new_frame;
|
| }
|
|
|