Index: content/renderer/media/webmediaplayer_ms.cc |
diff --git a/content/renderer/media/webmediaplayer_ms.cc b/content/renderer/media/webmediaplayer_ms.cc |
index 49bdf42e5493976dc1b0cc249356c6bad6883e84..0940ab02cc9727559fb2345ddb15bcacbd679489 100644 |
--- a/content/renderer/media/webmediaplayer_ms.cc |
+++ b/content/renderer/media/webmediaplayer_ms.cc |
@@ -28,7 +28,6 @@ |
#include "media/base/media_switches.h" |
#include "media/base/video_frame.h" |
#include "media/base/video_rotation.h" |
-#include "media/base/video_util.h" |
#include "media/blink/webmediaplayer_delegate.h" |
#include "third_party/WebKit/public/platform/WebMediaPlayerClient.h" |
#include "third_party/WebKit/public/platform/WebMediaStream.h" |
@@ -40,6 +39,8 @@ |
#include "third_party/WebKit/public/web/WebFrame.h" |
#include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" |
#include "third_party/WebKit/public/web/WebView.h" |
+#include "third_party/libyuv/include/libyuv/convert.h" |
+#include "third_party/libyuv/include/libyuv/video_common.h" |
#include "third_party/skia/include/core/SkBitmap.h" |
using blink::WebCanvas; |
@@ -51,18 +52,17 @@ namespace content { |
namespace { |
-// This function copies |frame| to a new YV12 media::VideoFrame. |
-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 || |
- frame->format() == media::PIXEL_FORMAT_XRGB); |
SkBitmap bitmap; |
bitmap.allocN32Pixels(frame->visible_rect().width(), |
frame->visible_rect().height()); |
@@ -79,18 +79,37 @@ 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::ConvertToI420(reinterpret_cast<uint8*>(bitmap.getPixels()), |
fbarchard
2015/10/14 06:47:36
Consider calling ARGBToI420.
ConvertToI420 expect
emircan
2015/10/14 21:02:32
Done.
|
+ bitmap.getSize(), |
+ 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), |
+ 0 /* crop_x */, |
+ 0 /* crop_y */, |
+ bitmap.dimensions().fWidth, |
+ bitmap.dimensions().fHeight, |
+ size.width(), size.height(), |
+ libyuv::kRotate0, libyuv::FOURCC_ARGB); |
fbarchard
2015/10/14 06:47:36
Most code in media expects ABGR for Android. Can
emircan
2015/10/14 21:02:32
Sorry, I couldn't understand what you mean there.
fbarchard
2015/10/15 17:43:26
In media/blink/skcanvas_video_renderer.cc there ar
|
} else { |
DCHECK(frame->IsMappable()); |
DCHECK(frame->format() == media::PIXEL_FORMAT_YV12 || |
frame->format() == media::PIXEL_FORMAT_I420); |
- for (size_t i = 0; i < media::VideoFrame::NumPlanes(frame->format()); ++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; |
} |
@@ -732,7 +751,7 @@ void WebMediaPlayerMS::Compositor::ReplaceCurrentFrameWithACopy( |
// 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_, renderer); |
+ CopyFrameToI420(current_frame_, renderer); |
current_frame_ = new_frame; |
} |