1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "vpx_ports/config.h"
12#include "vp8/common/idct.h"
13#include "vp8/decoder/dequantize.h"
14
15void idct_dequant_dc_0_2x_sse2
16            (short *q, short *dq, unsigned char *pre,
17             unsigned char *dst, int dst_stride, short *dc);
18void idct_dequant_dc_full_2x_sse2
19            (short *q, short *dq, unsigned char *pre,
20             unsigned char *dst, int dst_stride, short *dc);
21
22void idct_dequant_0_2x_sse2
23            (short *q, short *dq ,unsigned char *pre,
24             unsigned char *dst, int dst_stride, int blk_stride);
25void idct_dequant_full_2x_sse2
26            (short *q, short *dq ,unsigned char *pre,
27             unsigned char *dst, int dst_stride, int blk_stride);
28
29void vp8_dequant_dc_idct_add_y_block_sse2
30            (short *q, short *dq, unsigned char *pre,
31             unsigned char *dst, int stride, char *eobs, short *dc)
32{
33    int i;
34
35    for (i = 0; i < 4; i++)
36    {
37        if (((short *)(eobs))[0] & 0xfefe)
38            idct_dequant_dc_full_2x_sse2 (q, dq, pre, dst, stride, dc);
39        else
40            idct_dequant_dc_0_2x_sse2 (q, dq, pre, dst, stride, dc);
41
42        if (((short *)(eobs))[1] & 0xfefe)
43            idct_dequant_dc_full_2x_sse2 (q+32, dq, pre+8, dst+8, stride, dc+2);
44        else
45            idct_dequant_dc_0_2x_sse2 (q+32, dq, pre+8, dst+8, stride, dc+2);
46
47        q    += 64;
48        dc   += 4;
49        pre  += 64;
50        dst  += stride*4;
51        eobs += 4;
52    }
53}
54
55void vp8_dequant_idct_add_y_block_sse2
56            (short *q, short *dq, unsigned char *pre,
57             unsigned char *dst, int stride, char *eobs)
58{
59    int i;
60
61    for (i = 0; i < 4; i++)
62    {
63        if (((short *)(eobs))[0] & 0xfefe)
64            idct_dequant_full_2x_sse2 (q, dq, pre, dst, stride, 16);
65        else
66            idct_dequant_0_2x_sse2 (q, dq, pre, dst, stride, 16);
67
68        if (((short *)(eobs))[1] & 0xfefe)
69            idct_dequant_full_2x_sse2 (q+32, dq, pre+8, dst+8, stride, 16);
70        else
71            idct_dequant_0_2x_sse2 (q+32, dq, pre+8, dst+8, stride, 16);
72
73        q    += 64;
74        pre  += 64;
75        dst  += stride*4;
76        eobs += 4;
77    }
78}
79
80void vp8_dequant_idct_add_uv_block_sse2
81            (short *q, short *dq, unsigned char *pre,
82             unsigned char *dstu, unsigned char *dstv, int stride, char *eobs)
83{
84    if (((short *)(eobs))[0] & 0xfefe)
85        idct_dequant_full_2x_sse2 (q, dq, pre, dstu, stride, 8);
86    else
87        idct_dequant_0_2x_sse2 (q, dq, pre, dstu, stride, 8);
88
89    q    += 32;
90    pre  += 32;
91    dstu += stride*4;
92
93    if (((short *)(eobs))[1] & 0xfefe)
94        idct_dequant_full_2x_sse2 (q, dq, pre, dstu, stride, 8);
95    else
96        idct_dequant_0_2x_sse2 (q, dq, pre, dstu, stride, 8);
97
98    q    += 32;
99    pre  += 32;
100
101    if (((short *)(eobs))[2] & 0xfefe)
102        idct_dequant_full_2x_sse2 (q, dq, pre, dstv, stride, 8);
103    else
104        idct_dequant_0_2x_sse2 (q, dq, pre, dstv, stride, 8);
105
106    q    += 32;
107    pre  += 32;
108    dstv += stride*4;
109
110    if (((short *)(eobs))[3] & 0xfefe)
111        idct_dequant_full_2x_sse2 (q, dq, pre, dstv, stride, 8);
112    else
113        idct_dequant_0_2x_sse2 (q, dq, pre, dstv, stride, 8);
114}
115