// Copyright (c) 2011 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/simd/filter_yuv.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {

void FilterYUVRows_C(uint8_t* ybuf, const uint8_t* y0_ptr,
                     const uint8_t* y1_ptr, int source_width,
                     uint8_t source_y_fraction) {
  uint8_t y1_fraction = source_y_fraction;
  uint16_t y0_fraction = 256 - y1_fraction;
  uint8_t* end = ybuf + source_width;
  uint8_t* rounded_end = ybuf + (source_width & ~7);

  while (ybuf < rounded_end) {
    ybuf[0] = (y0_ptr[0] * y0_fraction + y1_ptr[0] * y1_fraction) >> 8;
    ybuf[1] = (y0_ptr[1] * y0_fraction + y1_ptr[1] * y1_fraction) >> 8;
    ybuf[2] = (y0_ptr[2] * y0_fraction + y1_ptr[2] * y1_fraction) >> 8;
    ybuf[3] = (y0_ptr[3] * y0_fraction + y1_ptr[3] * y1_fraction) >> 8;
    ybuf[4] = (y0_ptr[4] * y0_fraction + y1_ptr[4] * y1_fraction) >> 8;
    ybuf[5] = (y0_ptr[5] * y0_fraction + y1_ptr[5] * y1_fraction) >> 8;
    ybuf[6] = (y0_ptr[6] * y0_fraction + y1_ptr[6] * y1_fraction) >> 8;
    ybuf[7] = (y0_ptr[7] * y0_fraction + y1_ptr[7] * y1_fraction) >> 8;
    y0_ptr += 8;
    y1_ptr += 8;
    ybuf += 8;
  }

  while (ybuf < end) {
    ybuf[0] = (y0_ptr[0] * y0_fraction + y1_ptr[0] * y1_fraction) >> 8;
    ++ybuf;
    ++y0_ptr;
    ++y1_ptr;
  }
}

}  // namespace media
}  // namespace cobalt
