// Copyright 2011 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// NEON version of YUV to RGB upsampling functions.
//
// Author: mans@mansr.com (Mans Rullgard)
// Based on SSE code by: somnath@google.com (Somnath Banerjee)

#include "./dsp.h"

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

#if defined(WEBP_USE_NEON)

#if defined(STARBOARD)
#include "starboard/log.h"
#include "starboard/memory.h"
#else
#include <assert.h>
#include <string.h>
#endif
#include <arm_neon.h>
#include "./yuv.h"

#ifdef FANCY_UPSAMPLING

// Loads 9 pixels each from rows r1 and r2 and generates 16 pixels.
#define UPSAMPLE_16PIXELS(r1, r2, out) {                                \
  uint8x8_t a = vld1_u8(r1);                                            \
  uint8x8_t b = vld1_u8(r1 + 1);                                        \
  uint8x8_t c = vld1_u8(r2);                                            \
  uint8x8_t d = vld1_u8(r2 + 1);                                        \
                                                                        \
  uint16x8_t al = vshll_n_u8(a, 1);                                     \
  uint16x8_t bl = vshll_n_u8(b, 1);                                     \
  uint16x8_t cl = vshll_n_u8(c, 1);                                     \
  uint16x8_t dl = vshll_n_u8(d, 1);                                     \
                                                                        \
  uint8x8_t diag1, diag2;                                               \
  uint16x8_t sl;                                                        \
                                                                        \
  /* a + b + c + d */                                                   \
  sl = vaddl_u8(a,  b);                                                 \
  sl = vaddw_u8(sl, c);                                                 \
  sl = vaddw_u8(sl, d);                                                 \
                                                                        \
  al = vaddq_u16(sl, al); /* 3a +  b +  c +  d */                       \
  bl = vaddq_u16(sl, bl); /*  a + 3b +  c +  d */                       \
                                                                        \
  al = vaddq_u16(al, dl); /* 3a +  b +  c + 3d */                       \
  bl = vaddq_u16(bl, cl); /*  a + 3b + 3c +  d */                       \
                                                                        \
  diag2 = vshrn_n_u16(al, 3);                                           \
  diag1 = vshrn_n_u16(bl, 3);                                           \
                                                                        \
  a = vrhadd_u8(a, diag1);                                              \
  b = vrhadd_u8(b, diag2);                                              \
  c = vrhadd_u8(c, diag2);                                              \
  d = vrhadd_u8(d, diag1);                                              \
                                                                        \
  {                                                                     \
    const uint8x8x2_t a_b = {{ a, b }};                                 \
    const uint8x8x2_t c_d = {{ c, d }};                                 \
    vst2_u8(out,      a_b);                                             \
    vst2_u8(out + 32, c_d);                                             \
  }                                                                     \
}

// Turn the macro into a function for reducing code-size when non-critical
static void Upsample16Pixels(const uint8_t *r1, const uint8_t *r2,
                             uint8_t *out) {
  UPSAMPLE_16PIXELS(r1, r2, out);
}

#define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) {                  \
  uint8_t r1[9], r2[9];                                                 \
  SbMemoryCopy(r1, (tb), (num_pixels));                                       \
  SbMemoryCopy(r2, (bb), (num_pixels));                                       \
  /* replicate last byte */                                             \
  SbMemorySet(r1 + (num_pixels), r1[(num_pixels) - 1], 9 - (num_pixels));    \
  SbMemorySet(r2 + (num_pixels), r2[(num_pixels) - 1], 9 - (num_pixels));    \
  Upsample16Pixels(r1, r2, out);                                        \
}

#define CY  76283
#define CVR 89858
#define CUG 22014
#define CVG 45773
#define CUB 113618

static const int16_t coef[4] = { CVR / 4, CUG, CVG / 2, CUB / 4 };

#define CONVERT8(FMT, XSTEP, N, src_y, src_uv, out, cur_x) {            \
  int i;                                                                \
  for (i = 0; i < N; i += 8) {                                          \
    int off = ((cur_x) + i) * XSTEP;                                    \
    uint8x8_t y  = vld1_u8(src_y + (cur_x)  + i);                       \
    uint8x8_t u  = vld1_u8((src_uv) + i);                               \
    uint8x8_t v  = vld1_u8((src_uv) + i + 16);                          \
    int16x8_t yy = vreinterpretq_s16_u16(vsubl_u8(y, u16));             \
    int16x8_t uu = vreinterpretq_s16_u16(vsubl_u8(u, u128));            \
    int16x8_t vv = vreinterpretq_s16_u16(vsubl_u8(v, u128));            \
                                                                        \
    int16x8_t ud = vshlq_n_s16(uu, 1);                                  \
    int16x8_t vd = vshlq_n_s16(vv, 1);                                  \
                                                                        \
    int32x4_t vrl = vqdmlal_lane_s16(vshll_n_s16(vget_low_s16(vv), 1),  \
                                     vget_low_s16(vd),  cf16, 0);       \
    int32x4_t vrh = vqdmlal_lane_s16(vshll_n_s16(vget_high_s16(vv), 1), \
                                     vget_high_s16(vd), cf16, 0);       \
    int16x8_t vr = vcombine_s16(vrshrn_n_s32(vrl, 16),                  \
                                vrshrn_n_s32(vrh, 16));                 \
                                                                        \
    int32x4_t vl = vmovl_s16(vget_low_s16(vv));                         \
    int32x4_t vh = vmovl_s16(vget_high_s16(vv));                        \
    int32x4_t ugl = vmlal_lane_s16(vl, vget_low_s16(uu),  cf16, 1);     \
    int32x4_t ugh = vmlal_lane_s16(vh, vget_high_s16(uu), cf16, 1);     \
    int32x4_t gcl = vqdmlal_lane_s16(ugl, vget_low_s16(vv),  cf16, 2);  \
    int32x4_t gch = vqdmlal_lane_s16(ugh, vget_high_s16(vv), cf16, 2);  \
    int16x8_t gc = vcombine_s16(vrshrn_n_s32(gcl, 16),                  \
                                vrshrn_n_s32(gch, 16));                 \
                                                                        \
    int32x4_t ubl = vqdmlal_lane_s16(vshll_n_s16(vget_low_s16(uu), 1),  \
                                     vget_low_s16(ud),  cf16, 3);       \
    int32x4_t ubh = vqdmlal_lane_s16(vshll_n_s16(vget_high_s16(uu), 1), \
                                     vget_high_s16(ud), cf16, 3);       \
    int16x8_t ub = vcombine_s16(vrshrn_n_s32(ubl, 16),                  \
                                vrshrn_n_s32(ubh, 16));                 \
                                                                        \
    int32x4_t rl = vaddl_s16(vget_low_s16(yy),  vget_low_s16(vr));      \
    int32x4_t rh = vaddl_s16(vget_high_s16(yy), vget_high_s16(vr));     \
    int32x4_t gl = vsubl_s16(vget_low_s16(yy),  vget_low_s16(gc));      \
    int32x4_t gh = vsubl_s16(vget_high_s16(yy), vget_high_s16(gc));     \
    int32x4_t bl = vaddl_s16(vget_low_s16(yy),  vget_low_s16(ub));      \
    int32x4_t bh = vaddl_s16(vget_high_s16(yy), vget_high_s16(ub));     \
                                                                        \
    rl = vmulq_lane_s32(rl, cf32, 0);                                   \
    rh = vmulq_lane_s32(rh, cf32, 0);                                   \
    gl = vmulq_lane_s32(gl, cf32, 0);                                   \
    gh = vmulq_lane_s32(gh, cf32, 0);                                   \
    bl = vmulq_lane_s32(bl, cf32, 0);                                   \
    bh = vmulq_lane_s32(bh, cf32, 0);                                   \
                                                                        \
    y = vqmovun_s16(vcombine_s16(vrshrn_n_s32(rl, 16),                  \
                                 vrshrn_n_s32(rh, 16)));                \
    u = vqmovun_s16(vcombine_s16(vrshrn_n_s32(gl, 16),                  \
                                 vrshrn_n_s32(gh, 16)));                \
    v = vqmovun_s16(vcombine_s16(vrshrn_n_s32(bl, 16),                  \
                                 vrshrn_n_s32(bh, 16)));                \
    STR_ ## FMT(out + off, y, u, v);                                    \
  }                                                                     \
}

#define v255 vmov_n_u8(255)

#define STR_Rgb(out, r, g, b) do {                                      \
  const uint8x8x3_t r_g_b = {{ r, g, b }};                              \
  vst3_u8(out, r_g_b);                                                  \
} while (0)

#define STR_Bgr(out, r, g, b) do {                                      \
  const uint8x8x3_t b_g_r = {{ b, g, r }};                              \
  vst3_u8(out, b_g_r);                                                  \
} while (0)

#define STR_Rgba(out, r, g, b) do {                                     \
  const uint8x8x4_t r_g_b_v255 = {{ r, g, b, v255 }};                   \
  vst4_u8(out, r_g_b_v255);                                             \
} while (0)

#define STR_Bgra(out, r, g, b) do {                                     \
  const uint8x8x4_t b_g_r_v255 = {{ b, g, r, v255 }};                   \
  vst4_u8(out, b_g_r_v255);                                             \
} while (0)

#define CONVERT1(FMT, XSTEP, N, src_y, src_uv, rgb, cur_x) {            \
  int i;                                                                \
  for (i = 0; i < N; i++) {                                             \
    int off = ((cur_x) + i) * XSTEP;                                    \
    int y = src_y[(cur_x) + i];                                         \
    int u = (src_uv)[i];                                                \
    int v = (src_uv)[i + 16];                                           \
    VP8YuvTo ## FMT(y, u, v, rgb + off);                                \
  }                                                                     \
}

#define CONVERT2RGB_8(FMT, XSTEP, top_y, bottom_y, uv,                  \
                      top_dst, bottom_dst, cur_x, len) {                \
  if (top_y) {                                                          \
    CONVERT8(FMT, XSTEP, len, top_y, uv, top_dst, cur_x)                \
  }                                                                     \
  if (bottom_y) {                                                       \
    CONVERT8(FMT, XSTEP, len, bottom_y, (uv) + 32, bottom_dst, cur_x)   \
  }                                                                     \
}

#define CONVERT2RGB_1(FMT, XSTEP, top_y, bottom_y, uv,                  \
                      top_dst, bottom_dst, cur_x, len) {                \
  if (top_y) {                                                          \
    CONVERT1(FMT, XSTEP, len, top_y, uv, top_dst, cur_x);               \
  }                                                                     \
  if (bottom_y) {                                                       \
    CONVERT1(FMT, XSTEP, len, bottom_y, (uv) + 32, bottom_dst, cur_x);  \
  }                                                                     \
}

#define NEON_UPSAMPLE_FUNC(FUNC_NAME, FMT, XSTEP)                       \
static void FUNC_NAME(const uint8_t *top_y, const uint8_t *bottom_y,    \
                      const uint8_t *top_u, const uint8_t *top_v,       \
                      const uint8_t *cur_u, const uint8_t *cur_v,       \
                      uint8_t *top_dst, uint8_t *bottom_dst, int len) { \
  int block;                                                            \
  /* 16 byte aligned array to cache reconstructed u and v */            \
  uint8_t uv_buf[2 * 32 + 15];                                          \
  uint8_t *const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);     \
  const int uv_len = (len + 1) >> 1;                                    \
  /* 9 pixels must be read-able for each block */                       \
  const int num_blocks = (uv_len - 1) >> 3;                             \
  const int leftover = uv_len - num_blocks * 8;                         \
  const int last_pos = 1 + 16 * num_blocks;                             \
                                                                        \
  const int u_diag = ((top_u[0] + cur_u[0]) >> 1) + 1;                  \
  const int v_diag = ((top_v[0] + cur_v[0]) >> 1) + 1;                  \
                                                                        \
  const int16x4_t cf16 = vld1_s16(coef);                                \
  const int32x2_t cf32 = vmov_n_s32(CY);                                \
  const uint8x8_t u16  = vmov_n_u8(16);                                 \
  const uint8x8_t u128 = vmov_n_u8(128);                                \
                                                                        \
  /* Treat the first pixel in regular way */                            \
  if (top_y) {                                                          \
    const int u0 = (top_u[0] + u_diag) >> 1;                            \
    const int v0 = (top_v[0] + v_diag) >> 1;                            \
    VP8YuvTo ## FMT(top_y[0], u0, v0, top_dst);                         \
  }                                                                     \
  if (bottom_y) {                                                       \
    const int u0 = (cur_u[0] + u_diag) >> 1;                            \
    const int v0 = (cur_v[0] + v_diag) >> 1;                            \
    VP8YuvTo ## FMT(bottom_y[0], u0, v0, bottom_dst);                   \
  }                                                                     \
                                                                        \
  for (block = 0; block < num_blocks; ++block) {                        \
    UPSAMPLE_16PIXELS(top_u, cur_u, r_uv);                              \
    UPSAMPLE_16PIXELS(top_v, cur_v, r_uv + 16);                         \
    CONVERT2RGB_8(FMT, XSTEP, top_y, bottom_y, r_uv,                    \
                  top_dst, bottom_dst, 16 * block + 1, 16);             \
    top_u += 8;                                                         \
    cur_u += 8;                                                         \
    top_v += 8;                                                         \
    cur_v += 8;                                                         \
  }                                                                     \
                                                                        \
  UPSAMPLE_LAST_BLOCK(top_u, cur_u, leftover, r_uv);                    \
  UPSAMPLE_LAST_BLOCK(top_v, cur_v, leftover, r_uv + 16);               \
  CONVERT2RGB_1(FMT, XSTEP, top_y, bottom_y, r_uv,                      \
                top_dst, bottom_dst, last_pos, len - last_pos);         \
}

// NEON variants of the fancy upsampler.
NEON_UPSAMPLE_FUNC(UpsampleRgbLinePairNEON,  Rgb,  3)
NEON_UPSAMPLE_FUNC(UpsampleBgrLinePairNEON,  Bgr,  3)
NEON_UPSAMPLE_FUNC(UpsampleRgbaLinePairNEON, Rgba, 4)
NEON_UPSAMPLE_FUNC(UpsampleBgraLinePairNEON, Bgra, 4)

#endif  // FANCY_UPSAMPLING

#endif   // WEBP_USE_NEON

//------------------------------------------------------------------------------

extern WebPUpsampleLinePairFunc WebPUpsamplers[/* MODE_LAST */];

void WebPInitUpsamplersNEON(void) {
#if defined(WEBP_USE_NEON)
  WebPUpsamplers[MODE_RGB]  = UpsampleRgbLinePairNEON;
  WebPUpsamplers[MODE_RGBA] = UpsampleRgbaLinePairNEON;
  WebPUpsamplers[MODE_BGR]  = UpsampleBgrLinePairNEON;
  WebPUpsamplers[MODE_BGRA] = UpsampleBgraLinePairNEON;
#endif   // WEBP_USE_NEON
}

void WebPInitPremultiplyNEON(void) {
#if defined(WEBP_USE_NEON)
  WebPUpsamplers[MODE_rgbA] = UpsampleRgbaLinePairNEON;
  WebPUpsamplers[MODE_bgrA] = UpsampleBgraLinePairNEON;
#endif   // WEBP_USE_NEON
}

#if defined(__cplusplus) || defined(c_plusplus)
}    // extern "C"
#endif
