Index: media/base/yuv_convert.cc |
diff --git a/media/base/yuv_convert.cc b/media/base/yuv_convert.cc |
index 2b27c1da4a9a717160e6640f84ac77c95d8bb2b4..5ad8f3079fbd552765e89ee4e0bfea37b713e2e0 100644 |
--- a/media/base/yuv_convert.cc |
+++ b/media/base/yuv_convert.cc |
@@ -25,6 +25,7 @@ |
#include "media/base/simd/convert_rgb_to_yuv.h" |
#include "media/base/simd/convert_yuv_to_rgb.h" |
#include "media/base/simd/filter_yuv.h" |
+#include "media/base/simd/yuv_to_rgb_table.h" |
#if defined(ARCH_CPU_X86_FAMILY) |
#if defined(COMPILER_MSVC) |
@@ -79,21 +80,24 @@ typedef void (*ConvertYUVToRGB32RowProc)(const uint8*, |
const uint8*, |
const uint8*, |
uint8*, |
- ptrdiff_t); |
+ ptrdiff_t, |
+ const int16[1024][4]); |
typedef void (*ConvertYUVAToARGBRowProc)(const uint8*, |
const uint8*, |
const uint8*, |
const uint8*, |
uint8*, |
- ptrdiff_t); |
+ ptrdiff_t, |
+ const int16[1024][4]); |
typedef void (*ScaleYUVToRGB32RowProc)(const uint8*, |
const uint8*, |
const uint8*, |
uint8*, |
ptrdiff_t, |
- ptrdiff_t); |
+ ptrdiff_t, |
+ const int16[1024][4]); |
static FilterYUVRowsProc g_filter_yuv_rows_proc_ = NULL; |
static ConvertYUVToRGB32RowProc g_convert_yuv_to_rgb32_row_proc_ = NULL; |
@@ -112,6 +116,31 @@ void EmptyRegisterStateIntrinsic() { _mm_empty(); } |
typedef void (*EmptyRegisterStateProc)(); |
static EmptyRegisterStateProc g_empty_register_state_proc_ = NULL; |
+// Get the appropriate value to bitshift by for vertical indices. |
+int GetVerticalShift(YUVType type) { |
+ switch (type) { |
+ case YV16: |
+ return 0; |
+ case YV12: |
+ case YV12J: |
+ return 1; |
+ } |
+ NOTREACHED(); |
+ return 0; |
+} |
+ |
+const int16 (&GetLookupTable(YUVType type))[1024][4] { |
+ switch (type) { |
+ case YV12: |
+ case YV16: |
+ return kCoefficientsRgbY; |
+ case YV12J: |
+ return kCoefficientsRgbY_JPEG; |
+ } |
+ NOTREACHED(); |
+ return kCoefficientsRgbY; |
+} |
+ |
void InitializeCPUSpecificYUVConversions() { |
CHECK(!g_filter_yuv_rows_proc_); |
CHECK(!g_convert_yuv_to_rgb32_row_proc_); |
@@ -222,7 +251,7 @@ void ScaleYUVToRGB32(const uint8* y_buf, |
if (source_width > kFilterBufferSize || view_rotate) |
filter = FILTER_NONE; |
- unsigned int y_shift = yuv_type; |
+ unsigned int y_shift = GetVerticalShift(yuv_type); |
// Diagram showing origin and direction of source sampling. |
// ->0 4<- |
// 7 3 |
@@ -354,14 +383,25 @@ void ScaleYUVToRGB32(const uint8* y_buf, |
v_ptr = v_buf + (source_y >> y_shift) * uv_pitch; |
} |
if (source_dx == kFractionMax) { // Not scaled |
- g_convert_yuv_to_rgb32_row_proc_(y_ptr, u_ptr, v_ptr, dest_pixel, width); |
+ g_convert_yuv_to_rgb32_row_proc_( |
+ y_ptr, u_ptr, v_ptr, dest_pixel, width, kCoefficientsRgbY); |
} else { |
if (filter & FILTER_BILINEAR_H) { |
- g_linear_scale_yuv_to_rgb32_row_proc_( |
- y_ptr, u_ptr, v_ptr, dest_pixel, width, source_dx); |
+ g_linear_scale_yuv_to_rgb32_row_proc_(y_ptr, |
+ u_ptr, |
+ v_ptr, |
+ dest_pixel, |
+ width, |
+ source_dx, |
+ kCoefficientsRgbY); |
} else { |
- g_scale_yuv_to_rgb32_row_proc_( |
- y_ptr, u_ptr, v_ptr, dest_pixel, width, source_dx); |
+ g_scale_yuv_to_rgb32_row_proc_(y_ptr, |
+ u_ptr, |
+ v_ptr, |
+ dest_pixel, |
+ width, |
+ source_dx, |
+ kCoefficientsRgbY); |
} |
} |
} |
@@ -505,7 +545,8 @@ void ScaleYUVToRGB32WithRect(const uint8* y_buf, |
rgb_buf, |
dest_rect_width, |
source_left, |
- x_step); |
+ x_step, |
+ kCoefficientsRgbY); |
} else { |
// If the frame is too large then we linear scale a single row. |
LinearScaleYUVToRGB32RowWithRange_C(y0_ptr, |
@@ -514,7 +555,8 @@ void ScaleYUVToRGB32WithRect(const uint8* y_buf, |
rgb_buf, |
dest_rect_width, |
source_left, |
- x_step); |
+ x_step, |
+ kCoefficientsRgbY); |
} |
// Advance vertically in the source and destination image. |