/work/openh264/codec/common/src/deblocking_common.cpp
Line | Count | Source |
1 | | #include "deblocking_common.h" |
2 | | #include "macros.h" |
3 | | |
4 | | // C code only |
5 | | void DeblockLumaLt4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta, |
6 | 76.5k | int8_t* pTc) { |
7 | 1.30M | for (int32_t i = 0; i < 16; i++) { |
8 | 1.22M | int32_t iTc0 = pTc[i >> 2]; |
9 | 1.22M | if (iTc0 >= 0) { |
10 | 1.17M | int32_t p0 = pPix[-iStrideX]; |
11 | 1.17M | int32_t p1 = pPix[-2 * iStrideX]; |
12 | 1.17M | int32_t p2 = pPix[-3 * iStrideX]; |
13 | 1.17M | int32_t q0 = pPix[0]; |
14 | 1.17M | int32_t q1 = pPix[iStrideX]; |
15 | 1.17M | int32_t q2 = pPix[2 * iStrideX]; |
16 | 1.17M | bool bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
17 | 1.17M | bool bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
18 | 1.17M | bool bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
19 | 1.17M | int32_t iTc = iTc0; |
20 | 1.17M | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
21 | 1.01M | bool bDetaP2P0 = WELS_ABS (p2 - p0) < iBeta; |
22 | 1.01M | bool bDetaQ2Q0 = WELS_ABS (q2 - q0) < iBeta; |
23 | 1.01M | if (bDetaP2P0) { |
24 | 987k | pPix[-2 * iStrideX] = p1 + WELS_CLIP3 ((p2 + ((p0 + q0 + 1) >> 1) - (p1 * (1 << 1))) >> 1, -iTc0, iTc0); |
25 | 987k | iTc++; |
26 | 987k | } |
27 | 1.01M | if (bDetaQ2Q0) { |
28 | 989k | pPix[iStrideX] = q1 + WELS_CLIP3 ((q2 + ((p0 + q0 + 1) >> 1) - (q1 * (1 << 1))) >> 1, -iTc0, iTc0); |
29 | 989k | iTc++; |
30 | 989k | } |
31 | 1.01M | int32_t iDeta = WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc, iTc); |
32 | 1.01M | pPix[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ |
33 | 1.01M | pPix[0] = WelsClip1 (q0 - iDeta); /* q0' */ |
34 | 1.01M | } |
35 | 1.17M | } |
36 | 1.22M | pPix += iStrideY; |
37 | 1.22M | } |
38 | 76.5k | } |
39 | 30.4k | void DeblockLumaEq4_c (uint8_t* pPix, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, int32_t iBeta) { |
40 | 30.4k | int32_t p0, p1, p2, q0, q1, q2; |
41 | 30.4k | int32_t iDetaP0Q0; |
42 | 30.4k | bool bDetaP1P0, bDetaQ1Q0; |
43 | 518k | for (int32_t i = 0; i < 16; i++) { |
44 | 487k | p0 = pPix[-iStrideX]; |
45 | 487k | p1 = pPix[-2 * iStrideX]; |
46 | 487k | p2 = pPix[-3 * iStrideX]; |
47 | 487k | q0 = pPix[0]; |
48 | 487k | q1 = pPix[iStrideX]; |
49 | 487k | q2 = pPix[2 * iStrideX]; |
50 | 487k | iDetaP0Q0 = WELS_ABS (p0 - q0); |
51 | 487k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
52 | 487k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
53 | 487k | if ((iDetaP0Q0 < iAlpha) && bDetaP1P0 && bDetaQ1Q0) { |
54 | 422k | if (iDetaP0Q0 < ((iAlpha >> 2) + 2)) { |
55 | 404k | bool bDetaP2P0 = WELS_ABS (p2 - p0) < iBeta; |
56 | 404k | bool bDetaQ2Q0 = WELS_ABS (q2 - q0) < iBeta; |
57 | 404k | if (bDetaP2P0) { |
58 | 397k | const int32_t p3 = pPix[-4 * iStrideX]; |
59 | 397k | pPix[-iStrideX] = (p2 + (p1 * (1 << 1)) + (p0 * (1 << 1)) + (q0 * (1 << 1)) + q1 + 4) >> 3; //p0 |
60 | 397k | pPix[-2 * iStrideX] = (p2 + p1 + p0 + q0 + 2) >> 2; //p1 |
61 | 397k | pPix[-3 * iStrideX] = ((p3 * (1 << 1)) + p2 + (p2 * (1 << 1)) + p1 + p0 + q0 + 4) >> 3; //p2 |
62 | 397k | } else { |
63 | 7.72k | pPix[-1 * iStrideX] = ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2; //p0 |
64 | 7.72k | } |
65 | 404k | if (bDetaQ2Q0) { |
66 | 397k | const int32_t q3 = pPix[3 * iStrideX]; |
67 | 397k | pPix[0] = (p1 + (p0 * (1 << 1)) + (q0 * (1 << 1)) + (q1 * (1 << 1)) + q2 + 4) >> 3; //q0 |
68 | 397k | pPix[iStrideX] = (p0 + q0 + q1 + q2 + 2) >> 2; //q1 |
69 | 397k | pPix[2 * iStrideX] = ((q3 * (1 << 1)) + q2 + (q2 * (1 << 1)) + q1 + q0 + p0 + 4) >> 3; //q2 |
70 | 397k | } else { |
71 | 7.18k | pPix[0] = ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2; //q0 |
72 | 7.18k | } |
73 | 404k | } else { |
74 | 17.6k | pPix[-iStrideX] = ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2; //p0 |
75 | 17.6k | pPix[ 0] = ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2; //q0 |
76 | 17.6k | } |
77 | 422k | } |
78 | 487k | pPix += iStrideY; |
79 | 487k | } |
80 | 30.4k | } |
81 | 38.3k | void DeblockLumaLt4V_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc) { |
82 | 38.3k | DeblockLumaLt4_c (pPix, iStride, 1, iAlpha, iBeta, tc); |
83 | 38.3k | } |
84 | 38.1k | void DeblockLumaLt4H_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* tc) { |
85 | 38.1k | DeblockLumaLt4_c (pPix, 1, iStride, iAlpha, iBeta, tc); |
86 | 38.1k | } |
87 | 12.8k | void DeblockLumaEq4V_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
88 | 12.8k | DeblockLumaEq4_c (pPix, iStride, 1, iAlpha, iBeta); |
89 | 12.8k | } |
90 | 17.6k | void DeblockLumaEq4H_c (uint8_t* pPix, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
91 | 17.6k | DeblockLumaEq4_c (pPix, 1, iStride, iAlpha, iBeta); |
92 | 17.6k | } |
93 | | void DeblockChromaLt4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, |
94 | 38.4k | int32_t iBeta, int8_t* pTc) { |
95 | 38.4k | int32_t p0, p1, q0, q1, iDeta; |
96 | 38.4k | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; |
97 | | |
98 | 346k | for (int32_t i = 0; i < 8; i++) { |
99 | 307k | int32_t iTc0 = pTc[i >> 1]; |
100 | 307k | if (iTc0 > 0) { |
101 | 299k | p0 = pPixCb[-iStrideX]; |
102 | 299k | p1 = pPixCb[-2 * iStrideX]; |
103 | 299k | q0 = pPixCb[0]; |
104 | 299k | q1 = pPixCb[iStrideX]; |
105 | | |
106 | 299k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
107 | 299k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
108 | 299k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
109 | 299k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
110 | 289k | iDeta = WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0); |
111 | 289k | pPixCb[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ |
112 | 289k | pPixCb[0] = WelsClip1 (q0 - iDeta); /* q0' */ |
113 | 289k | } |
114 | | |
115 | | |
116 | 299k | p0 = pPixCr[-iStrideX]; |
117 | 299k | p1 = pPixCr[-2 * iStrideX]; |
118 | 299k | q0 = pPixCr[0]; |
119 | 299k | q1 = pPixCr[iStrideX]; |
120 | | |
121 | 299k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
122 | 299k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
123 | 299k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
124 | | |
125 | 299k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
126 | 288k | iDeta = WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0); |
127 | 288k | pPixCr[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ |
128 | 288k | pPixCr[0] = WelsClip1 (q0 - iDeta); /* q0' */ |
129 | 288k | } |
130 | 299k | } |
131 | 307k | pPixCb += iStrideY; |
132 | 307k | pPixCr += iStrideY; |
133 | 307k | } |
134 | 38.4k | } |
135 | | void DeblockChromaEq4_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, |
136 | 21.9k | int32_t iBeta) { |
137 | 21.9k | int32_t p0, p1, q0, q1; |
138 | 21.9k | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; |
139 | 197k | for (int32_t i = 0; i < 8; i++) { |
140 | | //cb |
141 | 175k | p0 = pPixCb[-iStrideX]; |
142 | 175k | p1 = pPixCb[-2 * iStrideX]; |
143 | 175k | q0 = pPixCb[0]; |
144 | 175k | q1 = pPixCb[iStrideX]; |
145 | 175k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
146 | 175k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
147 | 175k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
148 | 175k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
149 | 172k | pPixCb[-iStrideX] = ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2; /* p0' */ |
150 | 172k | pPixCb[0] = ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2; /* q0' */ |
151 | 172k | } |
152 | | |
153 | | //cr |
154 | 175k | p0 = pPixCr[-iStrideX]; |
155 | 175k | p1 = pPixCr[-2 * iStrideX]; |
156 | 175k | q0 = pPixCr[0]; |
157 | 175k | q1 = pPixCr[iStrideX]; |
158 | 175k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
159 | 175k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
160 | 175k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
161 | 175k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
162 | 172k | pPixCr[-iStrideX] = ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2; /* p0' */ |
163 | 172k | pPixCr[0] = ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2; /* q0' */ |
164 | 172k | } |
165 | 175k | pPixCr += iStrideY; |
166 | 175k | pPixCb += iStrideY; |
167 | 175k | } |
168 | 21.9k | } |
169 | | void DeblockChromaLt4V_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, |
170 | 19.3k | int8_t* tc) { |
171 | 19.3k | DeblockChromaLt4_c (pPixCb, pPixCr, iStride, 1, iAlpha, iBeta, tc); |
172 | 19.3k | } |
173 | | void DeblockChromaLt4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, |
174 | 19.1k | int8_t* tc) { |
175 | 19.1k | DeblockChromaLt4_c (pPixCb, pPixCr, 1, iStride, iAlpha, iBeta, tc); |
176 | 19.1k | } |
177 | 9.15k | void DeblockChromaEq4V_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
178 | 9.15k | DeblockChromaEq4_c (pPixCb, pPixCr, iStride, 1, iAlpha, iBeta); |
179 | 9.15k | } |
180 | 12.7k | void DeblockChromaEq4H_c (uint8_t* pPixCb, uint8_t* pPixCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
181 | 12.7k | DeblockChromaEq4_c (pPixCb, pPixCr, 1, iStride, iAlpha, iBeta); |
182 | 12.7k | } |
183 | | |
184 | | void DeblockChromaLt42_c (uint8_t* pPixCbCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, |
185 | 30.2k | int32_t iBeta, int8_t* pTc) { |
186 | 30.2k | int32_t p0, p1, q0, q1, iDeta; |
187 | 30.2k | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; |
188 | | |
189 | 272k | for (int32_t i = 0; i < 8; i++) { |
190 | 242k | int32_t iTc0 = pTc[i >> 1]; |
191 | 242k | if (iTc0 > 0) { |
192 | 236k | p0 = pPixCbCr[-iStrideX]; |
193 | 236k | p1 = pPixCbCr[-2 * iStrideX]; |
194 | 236k | q0 = pPixCbCr[0]; |
195 | 236k | q1 = pPixCbCr[iStrideX]; |
196 | | |
197 | 236k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
198 | 236k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
199 | 236k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
200 | 236k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
201 | 223k | iDeta = WELS_CLIP3 ((((q0 - p0) * (1 << 2)) + (p1 - q1) + 4) >> 3, -iTc0, iTc0); |
202 | 223k | pPixCbCr[-iStrideX] = WelsClip1 (p0 + iDeta); /* p0' */ |
203 | 223k | pPixCbCr[0] = WelsClip1 (q0 - iDeta); /* q0' */ |
204 | 223k | } |
205 | | |
206 | | |
207 | 236k | } |
208 | 242k | pPixCbCr += iStrideY; |
209 | 242k | } |
210 | 30.2k | } |
211 | | void DeblockChromaEq42_c (uint8_t* pPixCbCr, int32_t iStrideX, int32_t iStrideY, int32_t iAlpha, |
212 | 16.7k | int32_t iBeta) { |
213 | 16.7k | int32_t p0, p1, q0, q1; |
214 | 16.7k | bool bDetaP0Q0, bDetaP1P0, bDetaQ1Q0; |
215 | 150k | for (int32_t i = 0; i < 8; i++) { |
216 | 134k | p0 = pPixCbCr[-iStrideX]; |
217 | 134k | p1 = pPixCbCr[-2 * iStrideX]; |
218 | 134k | q0 = pPixCbCr[0]; |
219 | 134k | q1 = pPixCbCr[iStrideX]; |
220 | 134k | bDetaP0Q0 = WELS_ABS (p0 - q0) < iAlpha; |
221 | 134k | bDetaP1P0 = WELS_ABS (p1 - p0) < iBeta; |
222 | 134k | bDetaQ1Q0 = WELS_ABS (q1 - q0) < iBeta; |
223 | 134k | if (bDetaP0Q0 && bDetaP1P0 && bDetaQ1Q0) { |
224 | 129k | pPixCbCr[-iStrideX] = ((p1 * (1 << 1)) + p0 + q1 + 2) >> 2; /* p0' */ |
225 | 129k | pPixCbCr[0] = ((q1 * (1 << 1)) + q0 + p1 + 2) >> 2; /* q0' */ |
226 | 129k | } |
227 | | |
228 | 134k | pPixCbCr += iStrideY; |
229 | 134k | } |
230 | 16.7k | } |
231 | | |
232 | | void DeblockChromaLt4V2_c (uint8_t* pPixCbCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, |
233 | 15.0k | int8_t* tc) { |
234 | 15.0k | DeblockChromaLt42_c (pPixCbCr, iStride, 1, iAlpha, iBeta, tc); |
235 | 15.0k | } |
236 | | void DeblockChromaLt4H2_c (uint8_t* pPixCbCr, int32_t iStride, int32_t iAlpha, int32_t iBeta, |
237 | 15.1k | int8_t* tc) { |
238 | | |
239 | 15.1k | DeblockChromaLt42_c (pPixCbCr, 1, iStride, iAlpha, iBeta, tc); |
240 | 15.1k | } |
241 | 7.38k | void DeblockChromaEq4V2_c (uint8_t* pPixCbCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
242 | 7.38k | DeblockChromaEq42_c (pPixCbCr, iStride, 1, iAlpha, iBeta); |
243 | 7.38k | } |
244 | 9.36k | void DeblockChromaEq4H2_c (uint8_t* pPixCbCr, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
245 | 9.36k | DeblockChromaEq42_c (pPixCbCr, 1, iStride, iAlpha, iBeta); |
246 | 9.36k | } |
247 | | |
248 | 1.62k | void WelsNonZeroCount_c (int8_t* pNonZeroCount) { |
249 | 1.62k | int32_t i; |
250 | 40.5k | for (i = 0; i < 24; i++) { |
251 | 38.8k | pNonZeroCount[i] = !!pNonZeroCount[i]; |
252 | 38.8k | } |
253 | 1.62k | } |
254 | | |
255 | | #ifdef X86_ASM |
256 | | extern "C" { |
257 | | void DeblockLumaLt4H_ssse3 (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc) { |
258 | | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); |
259 | | |
260 | | DeblockLumaTransposeH2V_sse2 (pPixY - 4, iStride, &uiBuf[0]); |
261 | | DeblockLumaLt4V_ssse3 (&uiBuf[4 * 16], 16, iAlpha, iBeta, pTc); |
262 | | DeblockLumaTransposeV2H_sse2 (pPixY - 4, iStride, &uiBuf[0]); |
263 | | } |
264 | | |
265 | | void DeblockLumaEq4H_ssse3 (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
266 | | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); |
267 | | |
268 | | DeblockLumaTransposeH2V_sse2 (pPixY - 4, iStride, &uiBuf[0]); |
269 | | DeblockLumaEq4V_ssse3 (&uiBuf[4 * 16], 16, iAlpha, iBeta); |
270 | | DeblockLumaTransposeV2H_sse2 (pPixY - 4, iStride, &uiBuf[0]); |
271 | | } |
272 | | |
273 | | } |
274 | | |
275 | | #endif |
276 | | |
277 | | #ifdef HAVE_MMI |
278 | | extern "C" { |
279 | | void DeblockLumaLt4H_mmi (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta, int8_t* pTc) { |
280 | | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); |
281 | | |
282 | | DeblockLumaTransposeH2V_mmi (pPixY - 4, iStride, &uiBuf[0]); |
283 | | DeblockLumaLt4V_mmi (&uiBuf[4 * 16], 16, iAlpha, iBeta, pTc); |
284 | | DeblockLumaTransposeV2H_mmi (pPixY - 4, iStride, &uiBuf[0]); |
285 | | } |
286 | | |
287 | | void DeblockLumaEq4H_mmi (uint8_t* pPixY, int32_t iStride, int32_t iAlpha, int32_t iBeta) { |
288 | | ENFORCE_STACK_ALIGN_1D (uint8_t, uiBuf, 16 * 8, 16); |
289 | | |
290 | | DeblockLumaTransposeH2V_mmi (pPixY - 4, iStride, &uiBuf[0]); |
291 | | DeblockLumaEq4V_mmi (&uiBuf[4 * 16], 16, iAlpha, iBeta); |
292 | | DeblockLumaTransposeV2H_mmi (pPixY - 4, iStride, &uiBuf[0]); |
293 | | } |
294 | | } |
295 | | #endif//HAVE_MMI |