| // Copyright (c) 2010 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. |
| |
| // yuv_row internal functions to handle YUV conversion and scaling to RGB. |
| // These functions are used from both yuv_convert.cc and yuv_scale.cc. |
| |
| // TODO(fbarchard): Write function that can handle rotation and scaling. |
| |
| #ifndef MEDIA_BASE_YUV_ROW_H_ |
| #define MEDIA_BASE_YUV_ROW_H_ |
| |
| #include "base/basictypes.h" |
| |
| extern "C" { |
| // Can only do 1x. |
| // This is the second fastest of the scalers. |
| void FastConvertYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width); |
| |
| // Can do 1x, half size or any scale down by an integer amount. |
| // Step can be negative (mirroring, rotate 180). |
| // This is the third fastest of the scalers. |
| void ConvertYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width, |
| int step); |
| |
| // Rotate is like Convert, but applies different step to Y versus U and V. |
| // This allows rotation by 90 or 270, by stepping by stride. |
| // This is the forth fastest of the scalers. |
| void RotateConvertYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width, |
| int ystep, |
| int uvstep); |
| |
| // Doubler does 4 pixels at a time. Each pixel is replicated. |
| // This is the fastest of the scalers. |
| void DoubleYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width); |
| |
| // Handles arbitrary scaling up or down. |
| // Mirroring is supported, but not 90 or 270 degree rotation. |
| // Chroma is under sampled every 2 pixels for performance. |
| void ScaleYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width, |
| int source_dx); |
| |
| // Handles arbitrary scaling up or down with bilinear filtering. |
| // Mirroring is supported, but not 90 or 270 degree rotation. |
| // Chroma is under sampled every 2 pixels for performance. |
| // This is the slowest of the scalers. |
| void LinearScaleYUVToRGB32Row(const uint8* y_buf, |
| const uint8* u_buf, |
| const uint8* v_buf, |
| uint8* rgb_buf, |
| int width, |
| int source_dx); |
| |
| #if defined(_MSC_VER) |
| #define SIMD_ALIGNED(var) __declspec(align(16)) var |
| #else |
| #define SIMD_ALIGNED(var) var __attribute__((aligned(16))) |
| #endif |
| extern SIMD_ALIGNED(int16 kCoefficientsRgbY[768][4]); |
| |
| // Method to force C version. |
| //#define USE_MMX 0 |
| //#define USE_SSE2 0 |
| |
| #if !defined(USE_MMX) |
| // Windows, Mac and Linux/BSD use MMX |
| #if defined(__MMX__) || defined(_MSC_VER) |
| #define USE_MMX 1 |
| #else |
| #define USE_MMX 0 |
| #endif |
| #endif |
| |
| #if !defined(USE_SSE2) |
| #if defined(__SSE2__) || defined(ARCH_CPU_X86_64) || _M_IX86_FP==2 |
| #define USE_SSE2 1 |
| #else |
| #define USE_SSE2 0 |
| #endif |
| #endif |
| |
| // x64 uses MMX2 (SSE) so emms is not required. |
| // Warning C4799: function has no EMMS instruction. |
| // EMMS() is slow and should be called by the calling function once per image. |
| #if USE_MMX && !defined(ARCH_CPU_X86_64) |
| #if defined(_MSC_VER) |
| #define EMMS() __asm emms |
| #pragma warning(disable: 4799) |
| #else |
| #define EMMS() asm("emms") |
| #endif |
| #else |
| #define EMMS() |
| #endif |
| |
| } // extern "C" |
| |
| #endif // MEDIA_BASE_YUV_ROW_H_ |