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 0 : void vp8_dequant_dc_idct_add_y_block_mmx
16 : (short *q, short *dq, unsigned char *pre,
17 : unsigned char *dst, int stride, char *eobs, short *dc)
18 : {
19 : int i;
20 :
21 0 : for (i = 0; i < 4; i++)
22 : {
23 0 : if (eobs[0] > 1)
24 0 : vp8_dequant_dc_idct_add_mmx (q, dq, pre, dst, 16, stride, dc[0]);
25 : else
26 0 : vp8_dc_only_idct_add_mmx (dc[0], pre, dst, 16, stride);
27 :
28 0 : if (eobs[1] > 1)
29 0 : vp8_dequant_dc_idct_add_mmx (q+16, dq, pre+4, dst+4, 16, stride, dc[1]);
30 : else
31 0 : vp8_dc_only_idct_add_mmx (dc[1], pre+4, dst+4, 16, stride);
32 :
33 0 : if (eobs[2] > 1)
34 0 : vp8_dequant_dc_idct_add_mmx (q+32, dq, pre+8, dst+8, 16, stride, dc[2]);
35 : else
36 0 : vp8_dc_only_idct_add_mmx (dc[2], pre+8, dst+8, 16, stride);
37 :
38 0 : if (eobs[3] > 1)
39 0 : vp8_dequant_dc_idct_add_mmx (q+48, dq, pre+12, dst+12, 16, stride, dc[3]);
40 : else
41 0 : vp8_dc_only_idct_add_mmx (dc[3], pre+12, dst+12, 16, stride);
42 :
43 0 : q += 64;
44 0 : dc += 4;
45 0 : pre += 64;
46 0 : dst += 4*stride;
47 0 : eobs += 4;
48 : }
49 0 : }
50 :
51 0 : void vp8_dequant_idct_add_y_block_mmx
52 : (short *q, short *dq, unsigned char *pre,
53 : unsigned char *dst, int stride, char *eobs)
54 : {
55 : int i;
56 :
57 0 : for (i = 0; i < 4; i++)
58 : {
59 0 : if (eobs[0] > 1)
60 0 : vp8_dequant_idct_add_mmx (q, dq, pre, dst, 16, stride);
61 : else
62 : {
63 0 : vp8_dc_only_idct_add_mmx (q[0]*dq[0], pre, dst, 16, stride);
64 0 : ((int *)q)[0] = 0;
65 : }
66 :
67 0 : if (eobs[1] > 1)
68 0 : vp8_dequant_idct_add_mmx (q+16, dq, pre+4, dst+4, 16, stride);
69 : else
70 : {
71 0 : vp8_dc_only_idct_add_mmx (q[16]*dq[0], pre+4, dst+4, 16, stride);
72 0 : ((int *)(q+16))[0] = 0;
73 : }
74 :
75 0 : if (eobs[2] > 1)
76 0 : vp8_dequant_idct_add_mmx (q+32, dq, pre+8, dst+8, 16, stride);
77 : else
78 : {
79 0 : vp8_dc_only_idct_add_mmx (q[32]*dq[0], pre+8, dst+8, 16, stride);
80 0 : ((int *)(q+32))[0] = 0;
81 : }
82 :
83 0 : if (eobs[3] > 1)
84 0 : vp8_dequant_idct_add_mmx (q+48, dq, pre+12, dst+12, 16, stride);
85 : else
86 : {
87 0 : vp8_dc_only_idct_add_mmx (q[48]*dq[0], pre+12, dst+12, 16, stride);
88 0 : ((int *)(q+48))[0] = 0;
89 : }
90 :
91 0 : q += 64;
92 0 : pre += 64;
93 0 : dst += 4*stride;
94 0 : eobs += 4;
95 : }
96 0 : }
97 :
98 0 : void vp8_dequant_idct_add_uv_block_mmx
99 : (short *q, short *dq, unsigned char *pre,
100 : unsigned char *dstu, unsigned char *dstv, int stride, char *eobs)
101 : {
102 : int i;
103 :
104 0 : for (i = 0; i < 2; i++)
105 : {
106 0 : if (eobs[0] > 1)
107 0 : vp8_dequant_idct_add_mmx (q, dq, pre, dstu, 8, stride);
108 : else
109 : {
110 0 : vp8_dc_only_idct_add_mmx (q[0]*dq[0], pre, dstu, 8, stride);
111 0 : ((int *)q)[0] = 0;
112 : }
113 :
114 0 : if (eobs[1] > 1)
115 0 : vp8_dequant_idct_add_mmx (q+16, dq, pre+4, dstu+4, 8, stride);
116 : else
117 : {
118 0 : vp8_dc_only_idct_add_mmx (q[16]*dq[0], pre+4, dstu+4, 8, stride);
119 0 : ((int *)(q+16))[0] = 0;
120 : }
121 :
122 0 : q += 32;
123 0 : pre += 32;
124 0 : dstu += 4*stride;
125 0 : eobs += 2;
126 : }
127 :
128 0 : for (i = 0; i < 2; i++)
129 : {
130 0 : if (eobs[0] > 1)
131 0 : vp8_dequant_idct_add_mmx (q, dq, pre, dstv, 8, stride);
132 : else
133 : {
134 0 : vp8_dc_only_idct_add_mmx (q[0]*dq[0], pre, dstv, 8, stride);
135 0 : ((int *)q)[0] = 0;
136 : }
137 :
138 0 : if (eobs[1] > 1)
139 0 : vp8_dequant_idct_add_mmx (q+16, dq, pre+4, dstv+4, 8, stride);
140 : else
141 : {
142 0 : vp8_dc_only_idct_add_mmx (q[16]*dq[0], pre+4, dstv+4, 8, stride);
143 0 : ((int *)(q+16))[0] = 0;
144 : }
145 :
146 0 : q += 32;
147 0 : pre += 32;
148 0 : dstv += 4*stride;
149 0 : eobs += 2;
150 : }
151 0 : }
|