/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE 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.
 */

#include "vpx_ports/config.h"
#include "vp9/common/blockd.h"
#include "vp9/decoder/dequantize.h"

/* place these declarations here because we don't want to maintain them
 * outside of this scope
 */
void idct_dequant_dc_full_2x_neon
(short *input, short *dq, unsigned char *pre, unsigned char *dst,
 int stride, short *dc);
void idct_dequant_dc_0_2x_neon
(short *dc, unsigned char *pre, unsigned char *dst, int stride);
void idct_dequant_full_2x_neon
(short *q, short *dq, unsigned char *pre, unsigned char *dst,
 int pitch, int stride);
void idct_dequant_0_2x_neon
(short *q, short dq, unsigned char *pre, int pitch,
 unsigned char *dst, int stride);

void vp8_dequant_dc_idct_add_y_block_neon(short *q, short *dq,
                                          unsigned char *pre,
                                          unsigned char *dst, int stride,
                                          unsigned short *eobs, short *dc) {
  int i;

  for (i = 0; i < 4; i++) {
    if (((short *)eobs)[0] & 0xfefe)
      idct_dequant_dc_full_2x_neon(q, dq, pre, dst, stride, dc);
    else
      idct_dequant_dc_0_2x_neon(dc, pre, dst, stride);

    if (((short *)eobs)[1] & 0xfefe)
      idct_dequant_dc_full_2x_neon(q + 32, dq, pre + 8, dst + 8, stride, dc + 2);
    else
      idct_dequant_dc_0_2x_neon(dc + 2, pre + 8, dst + 8, stride);

    q    += 64;
    dc   += 4;
    pre  += 64;
    dst  += 4 * stride;
    eobs += 4;
  }
}

void vp8_dequant_idct_add_y_block_neon(short *q, short *dq, unsigned char *pre,
                                       unsigned char *dst, int stride,
                                       unsigned short *eobs) {
  int i;

  for (i = 0; i < 4; i++) {
    if (((short *)eobs)[0] & 0xfefe)
      idct_dequant_full_2x_neon(q, dq, pre, dst, 16, stride);
    else
      idct_dequant_0_2x_neon(q, dq[0], pre, 16, dst, stride);

    if (((short *)eobs)[1] & 0xfefe)
      idct_dequant_full_2x_neon(q + 32, dq, pre + 8, dst + 8, 16, stride);
    else
      idct_dequant_0_2x_neon(q + 32, dq[0], pre + 8, 16, dst + 8, stride);

    q    += 64;
    pre  += 64;
    dst  += 4 * stride;
    eobs += 4;
  }
}

void vp8_dequant_idct_add_uv_block_neon(short *q, short *dq,
                                        unsigned char *pre,
                                        unsigned char *dstu,
                                        unsigned char *dstv, int stride,
                                        unsigned short *eobs) {
  if (((short *)eobs)[0] & 0xfefe)
    idct_dequant_full_2x_neon(q, dq, pre, dstu, 8, stride);
  else
    idct_dequant_0_2x_neon(q, dq[0], pre, 8, dstu, stride);

  q    += 32;
  pre  += 32;
  dstu += 4 * stride;

  if (((short *)eobs)[1] & 0xfefe)
    idct_dequant_full_2x_neon(q, dq, pre, dstu, 8, stride);
  else
    idct_dequant_0_2x_neon(q, dq[0], pre, 8, dstu, stride);

  q += 32;
  pre += 32;

  if (((short *)eobs)[2] & 0xfefe)
    idct_dequant_full_2x_neon(q, dq, pre, dstv, 8, stride);
  else
    idct_dequant_0_2x_neon(q, dq[0], pre, 8, dstv, stride);

  q    += 32;
  pre  += 32;
  dstv += 4 * stride;

  if (((short *)eobs)[3] & 0xfefe)
    idct_dequant_full_2x_neon(q, dq, pre, dstv, 8, stride);
  else
    idct_dequant_0_2x_neon(q, dq[0], pre, 8, dstv, stride);
}
