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

Unified Diff: media/base/yuv_scale.cc

Issue 113407: ScaleYV12 optimization.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/yuv_scale.h ('k') | media/base/yuv_scale_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/base/yuv_scale.cc
===================================================================
--- media/base/yuv_scale.cc (revision 16299)
+++ media/base/yuv_scale.cc (working copy)
@@ -1,166 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/base/yuv_scale.h"
-// yuv_row.h included to detect USE_MMX
-#include "media/base/yuv_row.h"
-
-#ifdef _OPENMP
-#include <omp.h>
-#endif
-
-#ifdef _DEBUG
-#include "base/logging.h"
-#else
-#define DCHECK(a)
-#endif
-
-// TODO(fbarchard): Determine is HALF_TEST will be used or removed.
-// Half test is a prototype function that may or may not be useful in the
-// future. It is slower, but higher quality. The low level function
-// Half2Row() is in yuv_row.h and yuv_row_win.cc.
-// The function is small, so it has been left in, but if it turns out to
-// be useless, it should be removed in the future.
-// #define HALF_TEST 1
-
-namespace media {
-
-// Scale a frame of YV12 (aka YUV420) to 32 bit ARGB.
-void ScaleYV12ToRGB32(const uint8* y_buf,
- const uint8* u_buf,
- const uint8* v_buf,
- uint8* rgb_buf,
- int width,
- int height,
- int scaled_width,
- int scaled_height,
- int y_pitch,
- int uv_pitch,
- int rgb_pitch,
- Rotate view_rotate) {
- // Rotations that start at right side of image.
- if ((view_rotate == ROTATE_180) ||
- (view_rotate == ROTATE_270) ||
- (view_rotate == MIRROR_ROTATE_0) ||
- (view_rotate == MIRROR_ROTATE_90)) {
- y_buf += width - 1;
- u_buf += width / 2 - 1;
- v_buf += width / 2 - 1;
- width = -width;
- }
- // Rotations that start at bottom of image.
- if ((view_rotate == ROTATE_90) ||
- (view_rotate == ROTATE_180) ||
- (view_rotate == MIRROR_ROTATE_90) ||
- (view_rotate == MIRROR_ROTATE_180)) {
- y_buf += (height - 1) * y_pitch;
- u_buf += (height / 2 - 1) * uv_pitch;
- v_buf += (height / 2 - 1) * uv_pitch;
- height = -height;
- }
- // Only these rotations are implemented.
- DCHECK((view_rotate == ROTATE_0) ||
- (view_rotate == ROTATE_180) ||
- (view_rotate == MIRROR_ROTATE_0) ||
- (view_rotate == MIRROR_ROTATE_180));
-
- int scaled_dx = width * 16 / scaled_width;
-#ifdef _OPENMP
-#pragma omp parallel for
-#endif
- for (int y = 0; y < scaled_height; ++y) {
- uint8* dest_pixel = rgb_buf + y * rgb_pitch;
- int scaled_y = (y * height / scaled_height);
- const uint8* y_ptr = y_buf + scaled_y * y_pitch;
- const uint8* u_ptr = u_buf + scaled_y / 2 * uv_pitch;
- const uint8* v_ptr = v_buf + scaled_y / 2 * uv_pitch;
- if (scaled_width == width) {
- ConvertYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width);
- } else if (scaled_width == (width / 2)) {
-#if HALF_TEST
- uint8 y_half[2048];
- uint8 u_half[1024];
- uint8 v_half[1024];
- Half2Row(y_ptr, y_ptr + y_pitch, y_half, scaled_width);
- Half2Row(u_ptr, u_ptr + uv_pitch, u_half, scaled_width / 2);
- Half2Row(v_ptr, v_ptr + uv_pitch, v_half, scaled_width / 2);
- ConvertYV12ToRGB32Row(y_half, u_half, v_half,
- dest_pixel, scaled_width);
-#else
- HalfYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width);
-#endif
- } else {
- ScaleYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width, scaled_dx);
- }
- }
- EMMS();
-}
-
-// Scale a frame of YV16 (aka YUV422) to 32 bit ARGB.
-void ScaleYV16ToRGB32(const uint8* y_buf,
- const uint8* u_buf,
- const uint8* v_buf,
- uint8* rgb_buf,
- int width,
- int height,
- int scaled_width,
- int scaled_height,
- int y_pitch,
- int uv_pitch,
- int rgb_pitch,
- Rotate view_rotate) {
- // Rotations that start at right side of image.
- if ((view_rotate == ROTATE_180) ||
- (view_rotate == ROTATE_270) ||
- (view_rotate == MIRROR_ROTATE_0) ||
- (view_rotate == MIRROR_ROTATE_90)) {
- y_buf += width - 1;
- u_buf += width / 2 - 1;
- v_buf += width / 2 - 1;
- width = -width;
- }
- // Rotations that start at bottom of image.
- if ((view_rotate == ROTATE_90) ||
- (view_rotate == ROTATE_180) ||
- (view_rotate == MIRROR_ROTATE_90) ||
- (view_rotate == MIRROR_ROTATE_180)) {
- y_buf += (height - 1) * y_pitch;
- u_buf += (height - 1) * uv_pitch;
- v_buf += (height - 1) * uv_pitch;
- height = -height;
- }
- // Only these rotations are implemented.
- DCHECK((view_rotate == ROTATE_0) ||
- (view_rotate == ROTATE_180) ||
- (view_rotate == MIRROR_ROTATE_0) ||
- (view_rotate == MIRROR_ROTATE_180));
- int scaled_dx = width * 16 / scaled_width;
-#ifdef _OPENMP
-#pragma omp parallel for
-#endif
- for (int y = 0; y < scaled_height; ++y) {
- uint8* dest_pixel = rgb_buf + y * rgb_pitch;
- int scaled_y = (y * height / scaled_height);
- const uint8* y_ptr = y_buf + scaled_y * y_pitch;
- const uint8* u_ptr = u_buf + scaled_y * uv_pitch;
- const uint8* v_ptr = v_buf + scaled_y * uv_pitch;
- if (scaled_width == width) {
- ConvertYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width);
- } else if (scaled_width == (width / 2)) {
- HalfYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width);
- } else {
- ScaleYV12ToRGB32Row(y_ptr, u_ptr, v_ptr,
- dest_pixel, scaled_width, scaled_dx);
- }
- }
- EMMS();
-}
-
-} // namespace media
-
« no previous file with comments | « media/base/yuv_scale.h ('k') | media/base/yuv_scale_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698