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 :
15 : void idct_dequant_dc_0_2x_sse2
16 : (short *q, short *dq, unsigned char *pre,
17 : unsigned char *dst, int dst_stride, short *dc);
18 : void idct_dequant_dc_full_2x_sse2
19 : (short *q, short *dq, unsigned char *pre,
20 : unsigned char *dst, int dst_stride, short *dc);
21 :
22 : void idct_dequant_0_2x_sse2
23 : (short *q, short *dq ,unsigned char *pre,
24 : unsigned char *dst, int dst_stride, int blk_stride);
25 : void idct_dequant_full_2x_sse2
26 : (short *q, short *dq ,unsigned char *pre,
27 : unsigned char *dst, int dst_stride, int blk_stride);
28 :
29 0 : void 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 0 : for (i = 0; i < 4; i++)
36 : {
37 0 : if (((short *)(eobs))[0] & 0xfefe)
38 0 : idct_dequant_dc_full_2x_sse2 (q, dq, pre, dst, stride, dc);
39 : else
40 0 : idct_dequant_dc_0_2x_sse2 (q, dq, pre, dst, stride, dc);
41 :
42 0 : if (((short *)(eobs))[1] & 0xfefe)
43 0 : idct_dequant_dc_full_2x_sse2 (q+32, dq, pre+8, dst+8, stride, dc+2);
44 : else
45 0 : idct_dequant_dc_0_2x_sse2 (q+32, dq, pre+8, dst+8, stride, dc+2);
46 :
47 0 : q += 64;
48 0 : dc += 4;
49 0 : pre += 64;
50 0 : dst += stride*4;
51 0 : eobs += 4;
52 : }
53 0 : }
54 :
55 0 : void 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 0 : for (i = 0; i < 4; i++)
62 : {
63 0 : if (((short *)(eobs))[0] & 0xfefe)
64 0 : idct_dequant_full_2x_sse2 (q, dq, pre, dst, stride, 16);
65 : else
66 0 : idct_dequant_0_2x_sse2 (q, dq, pre, dst, stride, 16);
67 :
68 0 : if (((short *)(eobs))[1] & 0xfefe)
69 0 : idct_dequant_full_2x_sse2 (q+32, dq, pre+8, dst+8, stride, 16);
70 : else
71 0 : idct_dequant_0_2x_sse2 (q+32, dq, pre+8, dst+8, stride, 16);
72 :
73 0 : q += 64;
74 0 : pre += 64;
75 0 : dst += stride*4;
76 0 : eobs += 4;
77 : }
78 0 : }
79 :
80 0 : void 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 0 : if (((short *)(eobs))[0] & 0xfefe)
85 0 : idct_dequant_full_2x_sse2 (q, dq, pre, dstu, stride, 8);
86 : else
87 0 : idct_dequant_0_2x_sse2 (q, dq, pre, dstu, stride, 8);
88 :
89 0 : q += 32;
90 0 : pre += 32;
91 0 : dstu += stride*4;
92 :
93 0 : if (((short *)(eobs))[1] & 0xfefe)
94 0 : idct_dequant_full_2x_sse2 (q, dq, pre, dstu, stride, 8);
95 : else
96 0 : idct_dequant_0_2x_sse2 (q, dq, pre, dstu, stride, 8);
97 :
98 0 : q += 32;
99 0 : pre += 32;
100 :
101 0 : if (((short *)(eobs))[2] & 0xfefe)
102 0 : idct_dequant_full_2x_sse2 (q, dq, pre, dstv, stride, 8);
103 : else
104 0 : idct_dequant_0_2x_sse2 (q, dq, pre, dstv, stride, 8);
105 :
106 0 : q += 32;
107 0 : pre += 32;
108 0 : dstv += stride*4;
109 :
110 0 : if (((short *)(eobs))[3] & 0xfefe)
111 0 : idct_dequant_full_2x_sse2 (q, dq, pre, dstv, stride, 8);
112 : else
113 0 : idct_dequant_0_2x_sse2 (q, dq, pre, dstv, stride, 8);
114 0 : }
|