// 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 "cobalt/media/base/simd/convert_yuv_to_rgb.h"
#include "cobalt/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
