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 :
12 : #include "vpx_config.h"
13 : #include "vp8/common/loopfilter.h"
14 :
15 : prototype_loopfilter(vp8_mbloop_filter_vertical_edge_mmx);
16 : prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_mmx);
17 : prototype_loopfilter(vp8_loop_filter_vertical_edge_mmx);
18 : prototype_loopfilter(vp8_loop_filter_horizontal_edge_mmx);
19 :
20 : prototype_loopfilter(vp8_loop_filter_vertical_edge_sse2);
21 : prototype_loopfilter(vp8_loop_filter_horizontal_edge_sse2);
22 : prototype_loopfilter(vp8_mbloop_filter_vertical_edge_sse2);
23 : prototype_loopfilter(vp8_mbloop_filter_horizontal_edge_sse2);
24 :
25 : extern loop_filter_uvfunction vp8_loop_filter_horizontal_edge_uv_sse2;
26 : extern loop_filter_uvfunction vp8_loop_filter_vertical_edge_uv_sse2;
27 : extern loop_filter_uvfunction vp8_mbloop_filter_horizontal_edge_uv_sse2;
28 : extern loop_filter_uvfunction vp8_mbloop_filter_vertical_edge_uv_sse2;
29 :
30 : #if HAVE_MMX
31 : /* Horizontal MB filtering */
32 0 : void vp8_loop_filter_mbh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
33 : int y_stride, int uv_stride, loop_filter_info *lfi)
34 : {
35 0 : vp8_mbloop_filter_horizontal_edge_mmx(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
36 :
37 0 : if (u_ptr)
38 0 : vp8_mbloop_filter_horizontal_edge_mmx(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
39 :
40 0 : if (v_ptr)
41 0 : vp8_mbloop_filter_horizontal_edge_mmx(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
42 0 : }
43 :
44 :
45 : /* Vertical MB Filtering */
46 0 : void vp8_loop_filter_mbv_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
47 : int y_stride, int uv_stride, loop_filter_info *lfi)
48 : {
49 0 : vp8_mbloop_filter_vertical_edge_mmx(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
50 :
51 0 : if (u_ptr)
52 0 : vp8_mbloop_filter_vertical_edge_mmx(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
53 :
54 0 : if (v_ptr)
55 0 : vp8_mbloop_filter_vertical_edge_mmx(v_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 1);
56 0 : }
57 :
58 :
59 : /* Horizontal B Filtering */
60 0 : void vp8_loop_filter_bh_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
61 : int y_stride, int uv_stride, loop_filter_info *lfi)
62 : {
63 0 : vp8_loop_filter_horizontal_edge_mmx(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
64 0 : vp8_loop_filter_horizontal_edge_mmx(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
65 0 : vp8_loop_filter_horizontal_edge_mmx(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
66 :
67 0 : if (u_ptr)
68 0 : vp8_loop_filter_horizontal_edge_mmx(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
69 :
70 0 : if (v_ptr)
71 0 : vp8_loop_filter_horizontal_edge_mmx(v_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
72 0 : }
73 :
74 :
75 0 : void vp8_loop_filter_bhs_mmx(unsigned char *y_ptr, int y_stride, const unsigned char *blimit)
76 : {
77 0 : vp8_loop_filter_simple_horizontal_edge_mmx(y_ptr + 4 * y_stride, y_stride, blimit);
78 0 : vp8_loop_filter_simple_horizontal_edge_mmx(y_ptr + 8 * y_stride, y_stride, blimit);
79 0 : vp8_loop_filter_simple_horizontal_edge_mmx(y_ptr + 12 * y_stride, y_stride, blimit);
80 0 : }
81 :
82 :
83 : /* Vertical B Filtering */
84 0 : void vp8_loop_filter_bv_mmx(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
85 : int y_stride, int uv_stride, loop_filter_info *lfi)
86 : {
87 0 : vp8_loop_filter_vertical_edge_mmx(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
88 0 : vp8_loop_filter_vertical_edge_mmx(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
89 0 : vp8_loop_filter_vertical_edge_mmx(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
90 :
91 0 : if (u_ptr)
92 0 : vp8_loop_filter_vertical_edge_mmx(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
93 :
94 0 : if (v_ptr)
95 0 : vp8_loop_filter_vertical_edge_mmx(v_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, 1);
96 0 : }
97 :
98 :
99 0 : void vp8_loop_filter_bvs_mmx(unsigned char *y_ptr, int y_stride, const unsigned char *blimit)
100 : {
101 0 : vp8_loop_filter_simple_vertical_edge_mmx(y_ptr + 4, y_stride, blimit);
102 0 : vp8_loop_filter_simple_vertical_edge_mmx(y_ptr + 8, y_stride, blimit);
103 0 : vp8_loop_filter_simple_vertical_edge_mmx(y_ptr + 12, y_stride, blimit);
104 0 : }
105 : #endif
106 :
107 :
108 : /* Horizontal MB filtering */
109 : #if HAVE_SSE2
110 0 : void vp8_loop_filter_mbh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
111 : int y_stride, int uv_stride, loop_filter_info *lfi)
112 : {
113 0 : vp8_mbloop_filter_horizontal_edge_sse2(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
114 :
115 0 : if (u_ptr)
116 0 : vp8_mbloop_filter_horizontal_edge_uv_sse2(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, v_ptr);
117 0 : }
118 :
119 :
120 : /* Vertical MB Filtering */
121 0 : void vp8_loop_filter_mbv_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
122 : int y_stride, int uv_stride, loop_filter_info *lfi)
123 : {
124 0 : vp8_mbloop_filter_vertical_edge_sse2(y_ptr, y_stride, lfi->mblim, lfi->lim, lfi->hev_thr, 2);
125 :
126 0 : if (u_ptr)
127 0 : vp8_mbloop_filter_vertical_edge_uv_sse2(u_ptr, uv_stride, lfi->mblim, lfi->lim, lfi->hev_thr, v_ptr);
128 0 : }
129 :
130 :
131 : /* Horizontal B Filtering */
132 0 : void vp8_loop_filter_bh_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
133 : int y_stride, int uv_stride, loop_filter_info *lfi)
134 : {
135 0 : vp8_loop_filter_horizontal_edge_sse2(y_ptr + 4 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
136 0 : vp8_loop_filter_horizontal_edge_sse2(y_ptr + 8 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
137 0 : vp8_loop_filter_horizontal_edge_sse2(y_ptr + 12 * y_stride, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
138 :
139 0 : if (u_ptr)
140 0 : vp8_loop_filter_horizontal_edge_uv_sse2(u_ptr + 4 * uv_stride, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, v_ptr + 4 * uv_stride);
141 0 : }
142 :
143 :
144 0 : void vp8_loop_filter_bhs_sse2(unsigned char *y_ptr, int y_stride, const unsigned char *blimit)
145 : {
146 0 : vp8_loop_filter_simple_horizontal_edge_sse2(y_ptr + 4 * y_stride, y_stride, blimit);
147 0 : vp8_loop_filter_simple_horizontal_edge_sse2(y_ptr + 8 * y_stride, y_stride, blimit);
148 0 : vp8_loop_filter_simple_horizontal_edge_sse2(y_ptr + 12 * y_stride, y_stride, blimit);
149 0 : }
150 :
151 :
152 : /* Vertical B Filtering */
153 0 : void vp8_loop_filter_bv_sse2(unsigned char *y_ptr, unsigned char *u_ptr, unsigned char *v_ptr,
154 : int y_stride, int uv_stride, loop_filter_info *lfi)
155 : {
156 0 : vp8_loop_filter_vertical_edge_sse2(y_ptr + 4, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
157 0 : vp8_loop_filter_vertical_edge_sse2(y_ptr + 8, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
158 0 : vp8_loop_filter_vertical_edge_sse2(y_ptr + 12, y_stride, lfi->blim, lfi->lim, lfi->hev_thr, 2);
159 :
160 0 : if (u_ptr)
161 0 : vp8_loop_filter_vertical_edge_uv_sse2(u_ptr + 4, uv_stride, lfi->blim, lfi->lim, lfi->hev_thr, v_ptr + 4);
162 0 : }
163 :
164 :
165 0 : void vp8_loop_filter_bvs_sse2(unsigned char *y_ptr, int y_stride, const unsigned char *blimit)
166 : {
167 0 : vp8_loop_filter_simple_vertical_edge_sse2(y_ptr + 4, y_stride, blimit);
168 0 : vp8_loop_filter_simple_vertical_edge_sse2(y_ptr + 8, y_stride, blimit);
169 0 : vp8_loop_filter_simple_vertical_edge_sse2(y_ptr + 12, y_stride, blimit);
170 0 : }
171 :
172 : #endif
|