| Index: content/renderer/media/webmediaplayer_ms_compositor.cc
|
| diff --git a/content/renderer/media/webmediaplayer_ms_compositor.cc b/content/renderer/media/webmediaplayer_ms_compositor.cc
|
| index 6b8f546c848308ff718baa4757b8de5d9cec730c..8ca82285de3ba50966d58dfdbdad575710e0263e 100644
|
| --- a/content/renderer/media/webmediaplayer_ms_compositor.cc
|
| +++ b/content/renderer/media/webmediaplayer_ms_compositor.cc
|
| @@ -20,20 +20,22 @@
|
| #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
|
| #include "third_party/WebKit/public/platform/WebURL.h"
|
| #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
|
| +#include "third_party/libyuv/include/libyuv/convert.h"
|
| +#include "third_party/libyuv/include/libyuv/video_common.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
|
|
| -// This function copies |frame| to a new YV12 media::VideoFrame.
|
| -// TODO: Consider using libyuv for better performance. see http://crbug/541728
|
| -scoped_refptr<media::VideoFrame> CopyFrameToYV12(
|
| +// This function copies |frame| to a new I420 media::VideoFrame.
|
| +scoped_refptr<media::VideoFrame> CopyFrameToI420(
|
| const scoped_refptr<media::VideoFrame>& frame,
|
| media::SkCanvasVideoRenderer* video_renderer) {
|
| const scoped_refptr<media::VideoFrame> new_frame =
|
| media::VideoFrame::CreateFrame(media::PIXEL_FORMAT_YV12,
|
| frame->coded_size(), frame->visible_rect(),
|
| frame->natural_size(), frame->timestamp());
|
| + const gfx::Size& size = frame->coded_size();
|
|
|
| if (frame->HasTextures()) {
|
| DCHECK(frame->format() == media::PIXEL_FORMAT_ARGB ||
|
| @@ -56,18 +58,32 @@ scoped_refptr<media::VideoFrame> CopyFrameToYV12(
|
| // GPU Process crashed.
|
| bitmap.eraseColor(SK_ColorTRANSPARENT);
|
| }
|
| - media::CopyRGBToVideoFrame(reinterpret_cast<uint8*>(bitmap.getPixels()),
|
| - bitmap.rowBytes(), frame->visible_rect(),
|
| - new_frame.get());
|
| + libyuv::ARGBToI420(reinterpret_cast<uint8*>(bitmap.getPixels()),
|
| + bitmap.rowBytes(),
|
| + new_frame->data(media::VideoFrame::kYPlane),
|
| + new_frame->stride(media::VideoFrame::kYPlane),
|
| + new_frame->data(media::VideoFrame::kUPlane),
|
| + new_frame->stride(media::VideoFrame::kUPlane),
|
| + new_frame->data(media::VideoFrame::kVPlane),
|
| + new_frame->stride(media::VideoFrame::kVPlane),
|
| + size.width(), size.height());
|
| } else {
|
| DCHECK(frame->IsMappable());
|
| DCHECK(frame->format() == media::PIXEL_FORMAT_YV12 ||
|
| frame->format() == media::PIXEL_FORMAT_I420);
|
| - const size_t num_planes = media::VideoFrame::NumPlanes(frame->format());
|
| - for (size_t i = 0; i < num_planes; ++i) {
|
| - media::CopyPlane(i, frame->data(i), frame->stride(i), frame->rows(i),
|
| - new_frame.get());
|
| - }
|
| + libyuv::I420Copy(frame->data(media::VideoFrame::kYPlane),
|
| + frame->stride(media::VideoFrame::kYPlane),
|
| + frame->data(media::VideoFrame::kUPlane),
|
| + frame->stride(media::VideoFrame::kUPlane),
|
| + frame->data(media::VideoFrame::kVPlane),
|
| + frame->stride(media::VideoFrame::kVPlane),
|
| + new_frame->data(media::VideoFrame::kYPlane),
|
| + new_frame->stride(media::VideoFrame::kYPlane),
|
| + new_frame->data(media::VideoFrame::kUPlane),
|
| + new_frame->stride(media::VideoFrame::kUPlane),
|
| + new_frame->data(media::VideoFrame::kVPlane),
|
| + new_frame->stride(media::VideoFrame::kVPlane),
|
| + size.width(), size.height());
|
| }
|
| return new_frame;
|
| }
|
| @@ -292,7 +308,7 @@ void WebMediaPlayerMSCompositor::ReplaceCurrentFrameWithACopy(
|
| // 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.
|
| - current_frame_ = CopyFrameToYV12(current_frame_, renderer);
|
| + current_frame_ = CopyFrameToI420(current_frame_, renderer);
|
| }
|
|
|
| bool WebMediaPlayerMSCompositor::MapTimestampsToRenderTimeTicks(
|
|
|