| // Copyright (c) 2012 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. |
| |
| #if defined(_MSC_VER) |
| #include <intrin.h> |
| #else |
| #include <mmintrin.h> |
| #endif |
| |
| #include "media/base/simd/convert_yuv_to_rgb.h" |
| #include "media/base/yuv_convert.h" |
| #include "starboard/types.h" |
| |
| namespace cobalt { |
| namespace media { |
| |
| void ConvertYUVAToARGB_MMX(const uint8_t* yplane, const uint8_t* uplane, |
| const uint8_t* vplane, const uint8_t* aplane, |
| uint8_t* rgbframe, int width, int height, |
| int ystride, int uvstride, int astride, |
| int rgbstride, YUVType yuv_type) { |
| unsigned int y_shift = GetVerticalShift(yuv_type); |
| for (int y = 0; y < height; ++y) { |
| uint8_t* rgb_row = rgbframe + y * rgbstride; |
| const uint8_t* y_ptr = yplane + y * ystride; |
| const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride; |
| const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride; |
| const uint8_t* a_ptr = aplane + y * astride; |
| |
| ConvertYUVAToARGBRow_MMX(y_ptr, u_ptr, v_ptr, a_ptr, rgb_row, width, |
| GetLookupTable(yuv_type)); |
| } |
| |
| EmptyRegisterState(); |
| } |
| |
| void ConvertYUVToRGB32_SSE(const uint8_t* yplane, const uint8_t* uplane, |
| const uint8_t* vplane, uint8_t* rgbframe, int width, |
| int height, int ystride, int uvstride, int rgbstride, |
| YUVType yuv_type) { |
| unsigned int y_shift = GetVerticalShift(yuv_type); |
| for (int y = 0; y < height; ++y) { |
| uint8_t* rgb_row = rgbframe + y * rgbstride; |
| const uint8_t* y_ptr = yplane + y * ystride; |
| const uint8_t* u_ptr = uplane + (y >> y_shift) * uvstride; |
| const uint8_t* v_ptr = vplane + (y >> y_shift) * uvstride; |
| |
| ConvertYUVToRGB32Row_SSE(y_ptr, u_ptr, v_ptr, rgb_row, width, |
| GetLookupTable(yuv_type)); |
| } |
| |
| EmptyRegisterState(); |
| } |
| |
| } // namespace media |
| } // namespace cobalt |