From a14ee988dc90dede8e2852df18e527bf51eae928 Mon Sep 17 00:00:00 2001 From: "wjia@chromium.org" Date: Thu, 19 Dec 2013 18:43:28 +0000 Subject: Use libyuv::ConvertToI420 for all color formats in video capture on WIN Reland https://codereview.chromium.org/116573005/ with fix for android_aosp build. Since libyuv has added support for image flipping (vertically) with negative src_height as indicator, we'd converge all color formats into one code path. And libyuv provides better performance. BUG= R=ronghuawu@chromium.org Review URL: https://codereview.chromium.org/118653004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@241894 0039d316-1c4b-4281-b951-d872f2087c98 --- .../media/video_capture_controller.cc | 67 ++++++++-------------- 1 file changed, 25 insertions(+), 42 deletions(-) diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc index 1840af2..37aa27e 100644 --- a/content/browser/renderer_host/media/video_capture_controller.cc +++ b/content/browser/renderer_host/media/video_capture_controller.cc @@ -304,6 +304,7 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedFrame( if (!buffer) return; #if !defined(AVOID_LIBYUV_FOR_ANDROID_WEBVIEW) + bool flip = false; uint8* yplane = reinterpret_cast(buffer->data()); uint8* uplane = yplane + @@ -352,6 +353,13 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedFrame( break; case media::PIXEL_FORMAT_RGB24: origin_colorspace = libyuv::FOURCC_RAW; +#if defined(OS_WIN) + // TODO(wjia): Currently, for RGB24 on WIN, capture device always + // passes in positive src_width and src_height. Remove this hardcoded + // value when nagative src_height is supported. The negative src_height + // indicates that vertical flipping is needed. + flip = true; +#endif break; case media::PIXEL_FORMAT_ARGB: origin_colorspace = libyuv::FOURCC_ARGB; @@ -363,48 +371,23 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedFrame( NOTREACHED(); } - int need_convert_rgb24_on_win = false; -#if defined(OS_WIN) - // TODO(wjia): Use libyuv::ConvertToI420 since support for image inversion - // (vertical flipping) has been added. Use negative src_height as indicator. - if (frame_format.pixel_format == media::PIXEL_FORMAT_RGB24) { - // Rotation is not supported in kRGB24 and OS_WIN case. - DCHECK(!rotation); - need_convert_rgb24_on_win = true; - } -#endif - if (need_convert_rgb24_on_win) { - int rgb_stride = -3 * (new_unrotated_width + chopped_width); - const uint8* rgb_src = - data + 3 * (new_unrotated_width + chopped_width) * - (new_unrotated_height - 1 + chopped_height); - media::ConvertRGB24ToYUV(rgb_src, - yplane, - uplane, - vplane, - new_unrotated_width, - new_unrotated_height, - rgb_stride, - yplane_stride, - uv_plane_stride); - } else { - libyuv::ConvertToI420(data, - length, - yplane, - yplane_stride, - uplane, - uv_plane_stride, - vplane, - uv_plane_stride, - crop_x, - crop_y, - new_unrotated_width + chopped_width, - new_unrotated_height, - new_unrotated_width, - new_unrotated_height, - rotation_mode, - origin_colorspace); - } + libyuv::ConvertToI420(data, + length, + yplane, + yplane_stride, + uplane, + uv_plane_stride, + vplane, + uv_plane_stride, + crop_x, + crop_y, + frame_format.frame_size.width(), + (flip ? -frame_format.frame_size.height() : + frame_format.frame_size.height()), + new_unrotated_width, + new_unrotated_height, + rotation_mode, + origin_colorspace); #else // Libyuv is not linked in for Android WebView builds, but video capture is // not used in those builds either. Whenever libyuv is added in that build, -- cgit v1.1