/*
 *  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 "vp8/common/idct.h"
#include "vp8/decoder/dequantize.h"

void vp8_idct_dequant_dc_0_2x_sse2
            (short *q, short *dq, unsigned char *pre,
             unsigned char *dst, int dst_stride, short *dc);
void vp8_idct_dequant_dc_full_2x_sse2
            (short *q, short *dq, unsigned char *pre,
             unsigned char *dst, int dst_stride, short *dc);

void vp8_idct_dequant_0_2x_sse2
            (short *q, short *dq ,unsigned char *pre,
             unsigned char *dst, int dst_stride, int blk_stride);
void vp8_idct_dequant_full_2x_sse2
            (short *q, short *dq ,unsigned char *pre,
             unsigned char *dst, int dst_stride, int blk_stride);

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

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

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

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

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

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

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

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

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

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

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

    q    += 32;
    pre  += 32;

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

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

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