1 @/****************************************************************************** 2 @ * 3 @ * Copyright (C) 2015 The Android Open Source Project 4 @ * 5 @ * Licensed under the Apache License, Version 2.0 (the "License"); 6 @ * you may not use this file except in compliance with the License. 7 @ * You may obtain a copy of the License at: 8 @ * 9 @ * http://www.apache.org/licenses/LICENSE-2.0 10 @ * 11 @ * Unless required by applicable law or agreed to in writing, software 12 @ * distributed under the License is distributed on an "AS IS" BASIS, 13 @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 @ * See the License for the specific language governing permissions and 15 @ * limitations under the License. 16 @ * 17 @ ***************************************************************************** 18 @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 @*/ 20 @/*****************************************************************************/ 21 @/* */ 22 @/* File Name : ih264_deblk_luma_a9.s */ 23 @/* */ 24 @/* Description : Contains function definitions for deblocking luma */ 25 @/* edge. Functions are coded in NEON assembly and can */ 26 @/* be compiled using ARM RVDS. */ 27 @/* */ 28 @/* List of Functions : ih264_deblk_luma_vert_bs4_a9() */ 29 @/* ih264_deblk_luma_vert_bslt4_a9() */ 30 @/* ih264_deblk_luma_horz_bs4_a9() */ 31 @/* ih264_deblk_luma_horz_bslt4_a9() */ 32 @/* ih264_deblk_luma_vert_bs4_mbaff_a9() */ 33 @/* ih264_deblk_luma_vert_bslt4_mbaff_a9() */ 34 @/* */ 35 @/* Issues / Problems : None */ 36 @/* */ 37 @/* Revision History : */ 38 @/* */ 39 @/* DD MM YYYY Author(s) Changes (Describe the changes made) */ 40 @/* 28 11 2013 Ittiam Draft */ 41 @/* 05 01 2015 Kaushik Added double-call functions for */ 42 @/* Senthoor vertical deblocking. */ 43 @/* */ 44 @/*****************************************************************************/ 45 46 47 .text 48 .p2align 2 49 50 @** 51 @******************************************************************************* 52 @* 53 @* @brief 54 @* Performs filtering of a luma block horizontal edge for cases where the 55 @* boundary strength is less than 4 56 @* 57 @* @par Description: 58 @* This operation is described in Sec. 8.7.2.4 under the title 59 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 60 @* 61 @* @param[in] r0 - pu1_src 62 @* Pointer to the src sample q0 63 @* 64 @* @param[in] r1 - src_strd 65 @* Source stride 66 @* 67 @* @param[in] r2 - alpha 68 @* Alpha Value for the boundary 69 @* 70 @* @param[in] r3 - beta 71 @* Beta Value for the boundary 72 @* 73 @* @param[in] sp(0) - u4_bs 74 @* Packed Boundary strength array 75 @* 76 @* @param[in] sp(4) - pu1_cliptab 77 @* tc0_table 78 @* 79 @* @returns 80 @* None 81 @* 82 @* @remarks 83 @* None 84 @* 85 @******************************************************************************* 86 @* 87 88 .global ih264_deblk_luma_horz_bslt4_a9 89 90 ih264_deblk_luma_horz_bslt4_a9: 91 92 stmfd sp!, {r4-r7, lr} 93 94 ldrd r4, r5, [sp, #0x14] @r4 = ui_Bs , r5 = *puc_ClpTab 95 vpush {d8 - d15} 96 sub r0, r0, r1, lsl #1 @R1 = uc_Horizonpad 97 sub r0, r0, r1 @r0 pointer to p2 98 rev r4, r4 @ 99 vld1.8 {q5}, [r0], r1 @p2 values are loaded into q5 100 vmov.32 d12[0], r4 @d12[0] = ui_Bs 101 mov r6, r0 @keeping backup of pointer to p1 102 vld1.8 {q4}, [r0], r1 @p1 values are loaded into q4 103 mov r7, r0 @keeping backup of pointer to p0 104 vld1.8 {q3}, [r0], r1 @p0 values are loaded into q3 105 vmovl.u8 q6, d12 @q6 = uc_Bs in each 16 bt scalar 106 vld1.8 {q0}, [r0], r1 @q0 values are loaded into q0 107 vabd.u8 q13, q4, q3 @Q13 = ABS(p1 - p0) 108 vld1.8 {q1}, [r0], r1 @q1 values are loaded into q1 109 vabd.u8 q11, q3, q0 @Q11 = ABS(p0 - q0) 110 vld1.32 d16[0], [r5] @D16[0] contains cliptab 111 vabd.u8 q12, q1, q0 @Q12 = ABS(q1 - q0) 112 vld1.8 {q2}, [r0], r1 @q2 values are loaded into q2 113 vtbl.8 d14, {d16}, d12 @ 114 vdup.8 q10, r2 @Q10 contains alpha 115 vdup.8 q8, r3 @Q8 contains beta 116 vmovl.u16 q6, d12 @ 117 vmovl.u16 q7, d14 @ 118 vabd.u8 q14, q5, q3 @Q14 = Ap = ABS(p2 - p0) 119 vabd.u8 q15, q2, q0 @Q15 = Aq = ABS(q2 - q0) 120 vcgt.s32 q6, q6, #0 @Q6 = (us_Bs > 0) 121 vsli.32 q7, q7, #8 @ 122 vcge.u8 q9, q11, q10 @Q9 = ( ABS(p0 - q0) >= Alpha ) 123 vcge.u8 q12, q12, q8 @Q12=( ABS(q1 - q0) >= Beta ) 124 vcge.u8 q13, q13, q8 @Q13=( ABS(p1 - p0) >= Beta ) 125 vcgt.u8 q10, q8, q14 @Q10=(Ap<Beta) 126 vcgt.u8 q11, q8, q15 @Q11=(Aq<Beta) 127 vsli.32 q7, q7, #16 @Q7 = C0 128 vorr q9, q9, q12 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) 129 vsubl.u8 q15, d1, d7 @ 130 vsubl.u8 q12, d0, d6 @Q15,Q12 = (q0 - p0) 131 vorr q9, q9, q13 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta ) 132 vsubl.u8 q14, d8, d2 @Q14 = (p1 - q1)L 133 vshl.i16 q13, q15, #2 @Q13 = (q0 - p0)<<2 134 vshl.i16 q12, q12, #2 @Q12 = (q0 - p0)<<2 135 vsubl.u8 q15, d9, d3 @Q15 = (p1 - q1)H 136 vbic q6, q6, q9 @final condition 137 vadd.i16 q12, q12, q14 @ 138 vadd.i16 q13, q13, q15 @Q13,Q12 = [ (q0 - p0)<<2 ] + (p1 - q1) 139 vsub.i8 q9, q7, q10 @Q9 = C0 + (Ap < Beta) 140 vrhadd.u8 q8, q3, q0 @Q8 = ((p0+q0+1) >> 1) 141 vqrshrn.s16 d24, q12, #3 @ 142 vqrshrn.s16 d25, q13, #3 @Q12 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3 143 vsub.i8 q9, q9, q11 @Q9 = C0 + (Ap < Beta) + (Aq < Beta) 144 vand.i8 q10, q10, q6 @ 145 vand.i8 q11, q11, q6 @ 146 vabs.s8 q13, q12 @Q13 = ABS (i_macro) 147 vaddl.u8 q14, d17, d11 @ 148 vaddl.u8 q5, d16, d10 @Q14,Q5 = p2 + (p0+q0+1)>>1 149 vaddl.u8 q15, d17, d5 @ 150 vmin.u8 q9, q13, q9 @Q9 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro) 151 vshll.u8 q13, d9, #1 @ 152 vaddl.u8 q2, d16, d4 @Q15,Q2 = q2 + (p0+q0+1)>>1 153 vshll.u8 q8, d8, #1 @Q13,Q8 = (p1<<1) 154 vand q9, q9, q6 @Making delta zero in places where values shouldn be filterd 155 vsub.i16 q14, q14, q13 @Q14,Q5 = [p2 + (p0+q0+1)>>1] - (p1<<1) 156 vsub.i16 q5, q5, q8 @ 157 vshll.u8 q8, d2, #1 @ 158 vshll.u8 q13, d3, #1 @Q13,Q8 = (q1<<1) 159 vqshrn.s16 d29, q14, #1 @ 160 vqshrn.s16 d28, q5, #1 @Q14 = i_macro_p1 161 vsub.i16 q2, q2, q8 @ 162 vsub.i16 q15, q15, q13 @Q15,Q2 = [q2 + (p0+q0+1)>>1] - (q1<<1) 163 vneg.s8 q13, q7 @Q13 = -C0 164 vmin.s8 q14, q14, q7 @Q14 = min(C0,i_macro_p1) 165 vcge.s8 q12, q12, #0 @Q12 = (i_macro >= 0) 166 vqshrn.s16 d31, q15, #1 @ 167 vqshrn.s16 d30, q2, #1 @Q15 = i_macro_q1 168 vmax.s8 q14, q14, q13 @Q14 = max( - C0 , min(C0, i_macro_p1) ) 169 vqadd.u8 q8, q3, q9 @Q8 = p0 + delta 170 vqsub.u8 q3, q3, q9 @Q3 = p0 - delta 171 vmin.s8 q15, q15, q7 @Q15 = min(C0,i_macro_q1) 172 vand.i8 q14, q10, q14 @condition check Ap<beta 173 vqadd.u8 q7, q0, q9 @Q7 = q0 + delta 174 vqsub.u8 q0, q0, q9 @Q0 = q0 - delta 175 vmax.s8 q15, q15, q13 @Q15 = max( - C0 , min(C0, i_macro_q1) ) 176 vbif q8, q3, q12 @Q8 = (i_macro >= 0 ) ? (p0+delta) : (p0-delta) 177 vbif q0, q7, q12 @Q0 = (i_macro >= 0 ) ? (q0-delta) : (q0+delta) 178 vadd.i8 q14, q14, q4 @ 179 vand.i8 q15, q11, q15 @condition check Aq<beta 180 vst1.8 {q8}, [r7], r1 @writting back filtered value of p0 181 vadd.i8 q15, q15, q1 @ 182 vst1.8 {q0}, [r7], r1 @writting back filtered value of q0 183 vst1.8 {q14}, [r6] @writting back filtered value of p1 184 vst1.8 {q15}, [r7], r1 @writting back filtered value of q1 185 vpop {d8 - d15} 186 ldmfd sp!, {r4-r7, pc} 187 188 189 190 @** 191 @******************************************************************************* 192 @* 193 @* @brief 194 @* Performs filtering of a luma block horizontal edge when the 195 @* boundary strength is set to 4 196 @* 197 @* @par Description: 198 @* This operation is described in Sec. 8.7.2.4 under the title 199 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 200 @* 201 @* @param[in] r0 - pu1_src 202 @* Pointer to the src sample q0 203 @* 204 @* @param[in] r1 - src_strd 205 @* Source stride 206 @* 207 @* @param[in] r2 - alpha 208 @* Alpha Value for the boundary 209 @* 210 @* @param[in] r3 - beta 211 @* Beta Value for the boundary 212 @* 213 @* @returns 214 @* None 215 @* 216 @* @remarks 217 @* None 218 @* 219 @******************************************************************************* 220 @* 221 222 .global ih264_deblk_luma_horz_bs4_a9 223 224 ih264_deblk_luma_horz_bs4_a9: 225 226 @ Back up necessary registers on stack 227 stmfd sp!, {r12, r14} 228 vpush {d8 - d15} 229 @ Init 230 vdup.8 q0, r2 @duplicate alpha 231 sub r12, r0, r1 @pointer to p0 = q0 - src_strd 232 vdup.8 q1, r3 @duplicate beta 233 sub r14, r0, r1, lsl#1 @pointer to p1 = q0 - src_strd*2 234 sub r2, r0, r1, lsl#2 @pointer to p3 = q0 - src_strd*4 235 sub r3, r14, r1 @pointer to p2 = p1 - src_strd 236 237 @ Load Data 238 vld1.8 {d4, d5}, [r0], r1 @load q0 to Q2, q0 = q0 + src_strd 239 vld1.8 {d6, d7}, [r12] @load p0 to Q3 240 vld1.8 {d8, d9}, [r0], r1 @load q1 to Q4, q0 = q0 + src_strd 241 vld1.8 {d10, d11}, [r14] @load p1 to Q5 242 243 @ Filter Decision 244 vabd.u8 q6, q2, q3 @ABS(p0 - q0) 245 vabd.u8 q7, q4, q2 @ABS(q1 - q0) 246 vabd.u8 q8, q5, q3 @ABS(p1 - p0) 247 vcge.u8 q9, q6, q0 @ABS(p0 - q0) >= Alpha 248 vcge.u8 q7, q7, q1 @ABS(q1 - q0) >= Beta 249 vcge.u8 q8, q8, q1 @ABS(p1 - p0) >= Beta 250 vmov.i8 q10, #2 251 vorr q9, q9, q7 @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta 252 vld1.8 {d14, d15}, [r0], r1 @load q2 to Q7, q0 = q0 + src_strd 253 vorr q9, q9, q8 @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta 254 vsra.u8 q10, q0, #2 @((Alpha >> 2) + 2) 255 vabd.u8 q11, q7, q2 @Aq = ABS(q2 - q0) 256 vaddl.u8 q12, d4, d6 @p0+q0 L 257 vaddl.u8 q13, d5, d7 @p0+q0 H 258 vclt.u8 q11, q11, q1 @Aq < Beta 259 vclt.u8 q10, q6, q10 @(ABS(p0 - q0) <((Alpha >>2) + 2)) 260 261 @ Deblock Filtering q0', q1', q2' 262 vaddw.u8 q14, q12, d8 @p0+q0+q1 L 263 vaddw.u8 q15, q13, d9 @p0+q0+q1 H 264 vand q11, q11, q10 @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) 265 @ q0' if (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) TRUE 266 vadd.i16 q8, q14, q14 @2*(p0+q0+q1)L 267 vadd.i16 q0, q15, q15 @2*(p0+q0+q1)H 268 vaddw.u8 q8, q8, d14 @2*(p0+q0+q1)+q2 L 269 vaddw.u8 q0, q0, d15 @2*(p0+q0+q1)+q2 H 270 vaddw.u8 q8, q8, d10 @2*(p0+q0+q1)+q2 +p1 L 271 vaddw.u8 q0, q0, d11 @2*(p0+q0+q1)+q2 +p1 H 272 vrshrn.u16 d12, q8, #3 @(2*(p0+q0+q1)+q2 +p1 +4)>> 3 L [q0'] 273 vrshrn.u16 d13, q0, #3 @(2*(p0+q0+q1)+q2 +p1 +4)>> 3 H [q0'] 274 @ q0" if (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) FALSE 275 vaddl.u8 q8, d8, d8 @2*q1 L 276 vaddl.u8 q0, d9, d9 @2*q1 H 277 vaddw.u8 q8, q8, d4 @2*q1+q0 L 278 vaddw.u8 q0, q0, d5 @2*q1+q0 H 279 vaddw.u8 q8, q8, d10 @2*q1+q0+p1 L 280 vaddw.u8 q0, q0, d11 @2*q1+q0+p1 H 281 vrshrn.u16 d16, q8, #2 @(2*q1+q0+p1+2)>>2 L [q0"] 282 vrshrn.u16 d17, q0, #2 @(2*q1+q0+p1+2)>>2 H [q0"] 283 @ q1' 284 vaddw.u8 q14, q14, d14 @p0+q0+q1+q2 L 285 vaddw.u8 q15, q15, d15 @p0+q0+q1+q2 H 286 vld1.8 {q0}, [r0], r1 @load q3 to Q0, q0 = q0 + src_strd 287 vbit q8, q6, q11 @choosing between q0' and q0" depending on condn 288 sub r0, r0, r1, lsl #2 @pointer to q0 289 vbic q11, q11, q9 @((ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta)) 290 @ && (Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) 291 vrshrn.u16 d12, q14, #2 @(p0+q0+q1+q2+2)>>2 L [q1'] 292 vrshrn.u16 d13, q15, #2 @(p0+q0+q1+q2+2)>>2 H [q1'] 293 vbif q2, q8, q9 @choose q0 or filtered q0 294 @ q2' 295 vaddl.u8 q8, d14, d0 @q2+q3,L 296 vaddl.u8 q0, d15, d1 @q2+q3,H 297 vadd.i16 q14, q14, q8 @p0+q0+q1+2*q2+q3 L 298 vst1.8 {d4, d5}, [r0], r1 @store q0 299 vadd.i16 q15, q15, q0 @p0+q0+q1+2*q2+q3 H 300 vadd.i16 q14, q14, q8 @p0+q0+q1+3*q2+2*q3 L 301 vadd.i16 q15, q15, q0 @p0+q0+q1+3*q2+2*q3 H 302 vrshrn.u16 d0, q14, #3 @(p0+q0+q1+3*q2+2*q3+4)>>3 L [q2'] 303 vrshrn.u16 d1, q15, #3 @(p0+q0+q1+3*q2+2*q3+4)>>3 H [q2'] 304 vld1.8 {d30, d31}, [r3] @load p2 to Q15 305 vbif q6, q4, q11 @choose q1 or filtered value of q1 306 307 vabd.u8 q8, q15, q3 @Ap,ABS(p2 - p0) 308 vaddw.u8 q12, q12, d10 @p0+q0+p1 L 309 vbif q0, q7, q11 @choose q2 or filtered q2 310 vaddw.u8 q13, q13, d11 @p0+q0+p1 H 311 vst1.8 {d12, d13}, [r0], r1 @store q1 312 vclt.u8 q8, q8, q1 @Ap < Beta 313 vadd.i16 q14, q12, q12 @2*(p0+q0+p1) L 314 vadd.i16 q2, q13, q13 @2*(p0+q0+p1) H 315 vst1.8 {d0, d1}, [r0], r1 @store q2 316 vand q10, q10, q8 @((Ap < Beta) && (ABS(p0 - q0) <((Alpha >>2) + 2))) 317 vaddw.u8 q14, q14, d30 @2*(p0+q0+p1)+p2 l 318 vaddw.u8 q2, q2, d31 @2*(p0+q0+p1)+p2 H 319 vaddw.u8 q14, q14, d8 @2*(p0+q0+p1)+p2+q1 L 320 vaddw.u8 q2, q2, d9 @2*(p0+q0+p1)+p2+q1 H 321 vrshrn.u16 d28, q14, #3 @(2*(p0+q0+p1)+p2+q1+4)>>3 L,p0' 322 vrshrn.u16 d29, q2, #3 @(2*(p0+q0+p1)+p2+q1+4)>>3 H,p0' 323 vmov.i8 d0, #2 324 vmov.i16 d1, #2 325 vaddl.u8 q1, d6, d8 @p0+q1 L 326 vmlal.u8 q1, d10, d0 @2*p1+p0+q1 L 327 vaddl.u8 q8, d7, d9 @p0+q1 H 328 vmlal.u8 q8, d11, d0 @2*p1+p0+q1 H 329 vaddw.u8 q6, q12, d30 @(p0+q0+p1) +p2 L 330 vld1.8 {d24, d25}, [r2] @load p3,Q12 331 vaddw.u8 q2, q13, d31 @(p0+q0+p1) +p2 H 332 vaddl.u8 q4, d30, d24 @p2+p3 L 333 vrshrn.u16 d26, q6, #2 @((p0+q0+p1)+p2 +2)>>2,p1' L 334 vrshrn.u16 d2, q1, #2 @(2*p1+p0+q1+2)>>2,p0"L 335 vrshrn.u16 d27, q2, #2 @((p0+q0+p1)+p2 +2)>>2,p1' H 336 vrshrn.u16 d3, q8, #2 @(2*p1+p0+q1+2)>>2,p0" H 337 vaddl.u8 q8, d31, d25 @p2+p3 H 338 vmla.u16 q6, q4, d1[0] @(p0+q0+p1)+3*p2+2*p3 L 339 vmla.u16 q2, q8, d1[0] @(p0+q0+p1)+3*p2+2*p3 H 340 vbic q8, q10, q9 @((ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta)) 341 @&& (Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) 342 vbit q1, q14, q10 @choosing between po' and p0" 343 vrshrn.u16 d12, q6, #3 @((p0+q0+p1)+3*p2+2*p3+4)>>3 L p2' 344 vrshrn.u16 d13, q2, #3 @((p0+q0+p1)+3*p2+2*p3+4)>>3 H p2' 345 vbif q3, q1, q9 @choosing between p0 and filtered value of p0 346 vbit q5, q13, q8 @choosing between p1 and p1' 347 vbit q15, q6, q8 @choosing between p2 and p2' 348 vst1.8 {d6, d7}, [r12] @store p0 349 vst1.8 {d10, d11}, [r14] @store p1 350 vst1.8 {d30, d31}, [r3] @store p2 351 vpop {d8 - d15} 352 ldmfd sp!, {r12, pc} 353 354 355 356 @** 357 @******************************************************************************* 358 @* 359 @* @brief 360 @* Performs filtering of a luma block vertical edge for cases where the 361 @* boundary strength is less than 4 362 @* 363 @* @par Description: 364 @* This operation is described in Sec. 8.7.2.4 under the title 365 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 366 @* 367 @* @param[in] r0 - pu1_src 368 @* Pointer to the src sample q0 369 @* 370 @* @param[in] r1 - src_strd 371 @* Source stride 372 @* 373 @* @param[in] r2 - alpha 374 @* Alpha Value for the boundary 375 @* 376 @* @param[in] r3 - beta 377 @* Beta Value for the boundary 378 @* 379 @* @param[in] sp(0) - u4_bs 380 @* Packed Boundary strength array 381 @* 382 @* @param[in] sp(4) - pu1_cliptab 383 @* tc0_table 384 @* 385 @* @returns 386 @* None 387 @* 388 @* @remarks 389 @* None 390 @* 391 @******************************************************************************* 392 @* 393 394 .global ih264_deblk_luma_vert_bslt4_a9 395 396 ih264_deblk_luma_vert_bslt4_a9: 397 398 stmfd sp!, {r12, lr} 399 400 sub r0, r0, #4 @pointer uc_edgePixel-4 401 ldr r12, [sp, #8] @r12 = ui_Bs 402 ldr r14, [sp, #12] @r14 = *puc_ClpTab 403 vpush {d8 - d15} 404 @loading p3:p2:p1:p0:q0:q1:q2:q3 for every row 405 vld1.8 {d0}, [r0], r1 @row1 406 vld1.8 d2, [r0], r1 @row2 407 vld1.8 d4, [r0], r1 @row3 408 rev r12, r12 @reversing ui_bs 409 vld1.8 d6, [r0], r1 @row4 410 vmov.32 d18[0], r12 @d12[0] = ui_Bs 411 vld1.32 d16[0], [r14] @D16[0] contains cliptab 412 vld1.8 d8, [r0], r1 @row5 413 vmovl.u8 q9, d18 @q6 = uc_Bs in each 16 bt scalar 414 vld1.8 d10, [r0], r1 @row6 415 vld1.8 d12, [r0], r1 @row7 416 vtbl.8 d16, {d16}, d18 @puc_ClipTab[uc_Bs] 417 vld1.8 d14, [r0], r1 @row8 418 vld1.8 d1, [r0], r1 @row9 419 vmovl.u16 q8, d16 @ 420 vld1.8 d3, [r0], r1 @row10 421 vld1.8 d5, [r0], r1 @row11 422 vld1.8 d7, [r0], r1 @row12 423 vsli.32 q8, q8, #8 @ 424 vld1.8 d9, [r0], r1 @row13 425 vld1.8 d11, [r0], r1 @row14 426 vld1.8 d13, [r0], r1 @row15 427 vsli.32 q8, q8, #16 @Q8 = C0 428 vld1.8 d15, [r0], r1 @row16 429 430 @taking two 8x8 transposes 431 @2X2 transposes 432 vtrn.8 d0, d2 @row1 &2 433 vtrn.8 d4, d6 @row3&row4 434 vtrn.8 d8, d10 @row5&6 435 vtrn.8 d12, d14 @row7 & 8 436 vtrn.8 d1, d3 @row9 &10 437 vtrn.8 d5, d7 @row11 & 12 438 vtrn.8 d9, d11 @row13 &14 439 vtrn.8 d13, d15 @row15 & 16 440 @4x4 transposes 441 vtrn.16 d2, d6 @row2 & row4 442 vtrn.16 d10, d14 @row6 & row8 443 vtrn.16 d3, d7 @row10 & 12 444 vtrn.16 d11, d15 @row14 & row16 445 vtrn.32 d6, d14 @row4 & 8 446 vtrn.32 d7, d15 @row 12 & 16 447 448 @now Q3 ->p0 and Q7->q3 449 vtrn.16 d0, d4 @row1 & 3 450 vtrn.16 d8, d12 @row 5 & 7 451 vtrn.16 d1, d5 @row9 & row11 452 vtrn.16 d9, d13 @row13 & row15 453 vtrn.32 d0, d8 @row1 & row5 454 vtrn.32 d1, d9 @row9 & 13 455 456 @now Q0->p3 & Q4->q0 457 @starting processing as p0 and q0 are now ready 458 vtrn.32 d2, d10 @row2 &6 459 vrhadd.u8 q10, q3, q4 @((p0 + q0 + 1) >> 1) 460 vtrn.32 d3, d11 @row10&row14 461 vmov.i8 d19, #2 462 @now Q1->p2 & Q5->q1 463 vtrn.32 d4, d12 @row3 & 7 464 vabd.u8 q11, q3, q4 @ABS(p0 - q0) 465 vtrn.32 d5, d13 @row11 & row15 466 vaddl.u8 q12, d20, d2 @(p2 + ((p0 + q0 + 1) >> 1) L 467 @now Q2->p1,Q6->q2 468 vaddl.u8 q13, d21, d3 @(p2 + ((p0 + q0 + 1) >> 1) H 469 vmlsl.u8 q12, d4, d19 @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) L 470 vmlsl.u8 q13, d5, d19 @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) H 471 vdup.8 q14, r2 @alpha 472 vcle.u8 q11, q14, q11 @ABS(p0 - q0) >= Alpha(Alpha <=ABS(p0 - q0)) 473 vdup.i8 q14, r3 @beta 474 vabd.u8 q15, q5, q4 @ABS(q1 - q0) 475 vqshrn.s16 d24, q12, #1 @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) L 476 vqshrn.s16 d25 , q13, #1 @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) H 477 vcge.u8 q15, q15, q14 @ABS(q1 - q0) >= Beta 478 vabd.u8 q13, q2, q3 @ABS(p1 - p0) 479 vmin.s8 q12, q12, q8 @min(deltap1 ,C0) 480 vorr q11, q11, q15 @ABS(q1 - q0) >= Beta ||ABS(p0 - q0) >= Alpha 481 vneg.s8 q15, q8 @-C0 482 vcge.u8 q13, q13, q14 @ABS(p1 - p0) >= Beta 483 vmax.s8 q12, q12, q15 @max(deltap1,-C0) 484 vorr q11, q11, q13 @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta) 485 vmovl.u16 q13, d18 @ui_bs 486 vaddl.u8 q9, d20, d12 @q2 + ((p0 + q0 + 1) >> 1) L 487 vceq.u32 q13, q13, #0 @ui_bs == 0 488 vsubw.u8 q9, q9, d10 @(q2 + ((p0 + q0 + 1) >> 1) - q1) L 489 vaddl.u8 q10, d21, d13 @q2 + ((p0 + q0 + 1) >> 1) H 490 vsubw.u8 q9, q9, d10 @(q2 + ((p0 + q0 + 1) >> 1) - 2*q1)L 491 vsubw.u8 q10, q10, d11 @(q2 + ((p0 + q0 + 1) >> 1) - q1) H 492 vorr q13, q13, q11 @(ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta)) &&(ui_bs) 493 vsubw.u8 q10, q10, d11 @(q2 + ((p0 + q0 + 1) >> 1) - 2*q1) H 494 vqshrn.s16 d18, q9, #1 @((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1) L 495 vabd.u8 q11, q1, q3 @Ap = ABS(p2 - p0) 496 vqshrn.s16 d19, q10, #1 @((q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1) H 497 vabd.u8 q10, q6, q4 @Aq= ABS(q2 - q0) 498 vclt.u8 q11, q11, q14 @Ap < Beta 499 vmin.s8 q9, q9, q8 @min(delatq1,C0) 500 vclt.u8 q10, q10, q14 @Aq <Beta 501 vsubl.u8 q14, d8, d6 @(q0 - p0) L 502 vmax.s8 q9, q9, q15 @max(deltaq1,-C0) 503 vsubl.u8 q15, d9, d7 @(q0 - p0) H 504 vshl.s16 q14, q14, #2 @(q0 - p0)<<2 L 505 vsub.u8 q8, q8, q11 @C0 + (Ap < Beta) 506 vshl.s16 q15, q15, #2 @(q0 - p0) << 2) H 507 vaddw.u8 q14, q14, d4 @((q0 - p0) << 2) + (p1 L 508 vaddw.u8 q15, q15, d5 @((q0 - p0) << 2) + (p1 H 509 vsubw.u8 q14, q14, d10 @((q0 - p0) << 2) + (p1 - q1) L 510 vsubw.u8 q15, q15, d11 @((q0 - p0) << 2) + (p1 - q1) H 511 vbic q11, q11, q13 @final condition for p1 512 vrshrn.s16 d28, q14, #3 @delta = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3); L 513 vrshrn.s16 d29, q15, #3 @delta = ((((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) H 514 vsub.u8 q8, q8, q10 @C0 + (Ap < Beta) + (Aq < Beta) 515 vbic q10, q10, q13 @final condition for q1 516 vabs.s8 q15, q14 @abs(delta) 517 vand q12, q12, q11 @delatp1 518 vand q9, q9, q10 @delta q1 519 vmin.u8 q15, q15, q8 @min((abs(delta),C) 520 vadd.i8 q2, q2, q12 @p1+deltap1 521 vadd.i8 q5, q5, q9 @q1+deltaq1 522 vbic q15, q15, q13 @abs(delta) of pixels to be changed only 523 vcge.s8 q14, q14, #0 @sign(delta) 524 vqsub.u8 q11, q3, q15 @clip(p0-delta) 525 vtrn.8 d0, d2 @row1 &2 526 vqadd.u8 q3, q3, q15 @clip(p0+delta) 527 vtrn.8 d1, d3 @row9 &10 528 vqadd.u8 q12, q4, q15 @clip(q0+delta) 529 vtrn.8 d12, d14 @row7 & 8 530 vqsub.u8 q4, q4, q15 @clip(q0-delta) 531 vtrn.8 d13, d15 @row15 & 16 532 vbif q3, q11, q14 @p0 533 vbif q4, q12, q14 @q0 534 vtrn.8 d4, d6 @row3&row4 535 vtrn.8 d8, d10 @row5&6 536 vtrn.8 d5, d7 @row11 & 12 537 vtrn.8 d9, d11 @row13 &14 538 vtrn.16 d2, d6 @row2 & row4 539 vtrn.16 d10, d14 @row6 & row8 540 vtrn.16 d3, d7 @row10 & 12 541 vtrn.16 d11, d15 @row14 & row16 542 vtrn.32 d6, d14 @row4 & 8 543 vtrn.32 d7, d15 @row 12 & 16 544 @now Q3 ->p0 and Q7->q3 545 vtrn.16 d0, d4 @row1 & 3 546 vtrn.16 d8, d12 @row 5 & 7 547 vtrn.16 d1, d5 @row9 & row11 548 vtrn.16 d9, d13 @row13 & row15 549 sub r0, r0, r1, lsl#4 @restore pointer 550 vtrn.32 d0, d8 @row1 & row5 551 vtrn.32 d1, d9 @row9 & 13 552 vtrn.32 d2, d10 @row2 &6 553 vtrn.32 d3, d11 @row10&row14 554 vtrn.32 d4, d12 @row3 & 7 555 vtrn.32 d5, d13 @row11 & row15 556 vst1.8 {d0}, [r0], r1 @row1 557 vst1.8 d2, [r0], r1 @row2 558 vst1.8 d4, [r0], r1 @row3 559 vst1.8 d6, [r0], r1 @row4 560 vst1.8 d8, [r0], r1 @row5 561 vst1.8 d10, [r0], r1 @row6 562 vst1.8 d12, [r0], r1 @row7 563 vst1.8 d14, [r0], r1 @row8 564 vst1.8 d1, [r0], r1 @row9 565 vst1.8 d3, [r0], r1 @row10 566 vst1.8 d5, [r0], r1 @row11 567 vst1.8 d7, [r0], r1 @row12 568 vst1.8 d9, [r0], r1 @row13 569 vst1.8 d11, [r0], r1 @row14 570 vst1.8 d13, [r0], r1 @row15 571 vst1.8 d15, [r0], r1 @row16 572 vpop {d8 - d15} 573 ldmfd sp!, {r12, pc} 574 575 576 577 @** 578 @******************************************************************************* 579 @* 580 @* @brief 581 @* Performs filtering of a luma block vertical edge when the 582 @* boundary strength is set to 4 583 @* 584 @* @par Description: 585 @* This operation is described in Sec. 8.7.2.4 under the title 586 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 587 @* 588 @* @param[in] r0 - pu1_src 589 @* Pointer to the src sample q0 590 @* 591 @* @param[in] r1 - src_strd 592 @* Source stride 593 @* 594 @* @param[in] r2 - alpha 595 @* Alpha Value for the boundary 596 @* 597 @* @param[in] r3 - beta 598 @* Beta Value for the boundary 599 @* 600 @* @returns 601 @* None 602 @* 603 @* @remarks 604 @* None 605 @* 606 @******************************************************************************* 607 @* 608 609 .global ih264_deblk_luma_vert_bs4_a9 610 611 ih264_deblk_luma_vert_bs4_a9: 612 613 stmfd sp!, {r12, lr} 614 vpush {d8 - d15} 615 sub r0, r0, #4 @pointer uc_edgePixel-4 616 @loading p3:p2:p1:p0:q0:q1:q2:q3 for every row 617 vld1.8 d0, [r0], r1 @row1 618 vld1.8 d2, [r0], r1 @row2 619 vld1.8 d4, [r0], r1 @row3 620 vld1.8 d6, [r0], r1 @row4 621 vld1.8 d8, [r0], r1 @row5 622 vld1.8 d10, [r0], r1 @row6 623 vld1.8 d12, [r0], r1 @row7 624 vld1.8 d14, [r0], r1 @row8 625 vld1.8 d1, [r0], r1 @row9 626 vld1.8 d3, [r0], r1 @row10 627 vld1.8 d5, [r0], r1 @row11 628 vld1.8 d7, [r0], r1 @row12 629 vld1.8 d9, [r0], r1 @row13 630 vld1.8 d11, [r0], r1 @row14 631 vld1.8 d13, [r0], r1 @row15 632 vld1.8 d15, [r0], r1 @row16 633 @taking two 8x8 transposes 634 @2X2 transposes 635 vtrn.8 d0, d2 @row1 &2 636 vtrn.8 d4, d6 @row3&row4 637 vtrn.8 d8, d10 @row5&6 638 vtrn.8 d12, d14 @row7 & 8 639 vtrn.8 d1, d3 @row9 &10 640 vtrn.8 d5, d7 @row11 & 12 641 vtrn.8 d9, d11 @row13 &14 642 vtrn.8 d13, d15 @row15 & 16 643 @4x4 transposes 644 vtrn.16 d2, d6 @row2 & row4 645 vtrn.16 d10, d14 @row6 & row8 646 vtrn.16 d3, d7 @row10 & 12 647 vtrn.16 d11, d15 @row14 & row16 648 vtrn.32 d6, d14 @row4 & 8 649 vtrn.32 d7, d15 @row 12 & 16 650 @now Q3 ->p0 and Q7->q3 651 vtrn.16 d0, d4 @row1 & 3 652 vtrn.16 d8, d12 @row 5 & 7 653 vtrn.16 d1, d5 @row9 & row11 654 vtrn.16 d9, d13 @row13 & row15 655 vtrn.32 d0, d8 @row1 & row5 656 vtrn.32 d1, d9 @row9 & 13 657 @now Q0->p3 & Q4->q0 658 @starting processing as p0 and q0 are now ready 659 @now Q1->p2 & Q5->q1 660 vpush {q7} @saving in stack 661 vtrn.32 d4, d12 @row3 & 7 662 vmov.i16 q14, #2 663 vtrn.32 d5, d13 @row11 & row15 664 vaddl.u8 q8, d6, d8 @p0+q0 L 665 vtrn.32 d2, d10 @row2 &6 666 vaddl.u8 q9, d7, d9 @p0+q0 H 667 vtrn.32 d3, d11 @row10&row14 668 vaddw.u8 q10, q8, d4 @p0+q0+p1 L 669 vaddw.u8 q11, q9, d5 @p0+q0+p1 H 670 vaddl.u8 q12, d2, d10 @p2+q1 L 671 vaddl.u8 q13, d3, d11 @p2+q1 H 672 vmla.u16 q12, q10, q14 @p2 + X2(p1) + X2(p0) + X2(q0) + q1 L 673 vmla.u16 q13, q11, q14 @p2 + X2(p1) + X2(p0) + X2(q0) + q1 H 674 vmov.i8 q14, #2 675 vaddw.u8 q8, q10, d2 @p0+q0+p1+p2 L 676 vaddw.u8 q9, q11, d3 @p0+q0+p1+p2 H 677 vdup.i8 q15, r2 @duplicate alpha 678 vrshrn.u16 d20, q8, #2 @(p2 + p1 + p0 + q0 + 2) >> 2)L p1' 679 vrshrn.u16 d21, q9, #2 @(p2 + p1 + p0 + q0 + 2) >> 2)H p1' 680 vabd.u8 q11, q3, q4 @ABD(p0-q0) 681 vsra.u8 q14, q15, #2 @alpha >>2 +2 682 vabd.u8 q15, q1, q3 @Ap = ABD(p2-p0) 683 vrshrn.u16 d24, q12, #3 @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) L p0' 684 vrshrn.u16 d25, q13, #3 @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) H p0' 685 vdup.i8 q13, r3 @beta 686 vcgt.u8 q14, q14, q11 @ABS(p0 - q0) <((Alpha >>2) + 2) 687 vaddl.u8 q11, d6, d10 @p0+q1 L 688 vcgt.u8 q7, q13, q15 @beta>Ap 689 vaddl.u8 q15, d7, d11 @p0+q1 H 690 vaddw.u8 q11, q11, d4 @p0+q1+p1 L 691 vaddw.u8 q15, q15, d5 @p0+q1+p1 H 692 vaddw.u8 q11, q11, d4 @p0+q1+2*p1 L 693 vaddw.u8 q15, q15, d5 @p0+q1+2*p1 H 694 vand q7, q7, q14 @(Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2) 695 vrshrn.u16 d22, q11, #2 @((X2(p1) + p0 + q1 + 2) >> 2) L p0" 696 vrshrn.u16 d23, q15, #2 @((X2(p1) + p0 + q1 + 2) >> 2) H p0" 697 vaddl.u8 q15, d2, d0 @p2+p3 L 698 vbif q12, q11, q7 @p0' or p0 " 699 vaddl.u8 q11, d3, d1 @p2+p3 H 700 vadd.u16 q15, q15, q15 @2*(p2+p3) L 701 vadd.u16 q11, q11, q11 @2*(p2+p3)H 702 vadd.u16 q8, q8, q15 @(X2(p3) + X3(p2) + p1 + p0 + q0) L 703 vadd.u16 q9, q9, q11 @(X2(p3) + X3(p2) + p1 + p0 + q0) H 704 vabd.u8 q15, q6, q4 @Aq = abs(q2-q0) 705 vabd.u8 q11, q5, q4 @ABS(Q1-Q0) 706 vrshrn.u16 d16, q8, #3 @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); L p2' 707 vrshrn.u16 d17, q9, #3 @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); H p2' 708 vabd.u8 q9, q2, q3 @ABS(p1-p0) 709 vcgt.u8 q15, q13, q15 @Aq < Beta 710 vcge.u8 q11, q11, q13 @ABS(q1 - q0) >= Beta 711 vcge.u8 q9, q9, q13 @ABS(p1 - p0) >= beta 712 vdup.i8 q13, r2 @duplicate alpha 713 vand q15, q15, q14 @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) 714 vabd.u8 q14, q3, q4 @abs(p0-q0) 715 vorr q11, q11, q9 @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta 716 vaddl.u8 q9, d6, d8 @p0+q0 L 717 vcge.u8 q14, q14, q13 @ABS(p0 - q0) >= Alpha 718 vaddl.u8 q13, d7, d9 @p0+q0 H 719 vaddw.u8 q9, q9, d10 @p0+q0+q1 L 720 vorr q11, q11, q14 @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta||ABS(p0 - q0) >= Alpha 721 vaddw.u8 q13, q13, d11 @p0+q0+q1 H 722 vbic q7, q7, q11 @final condn for p's 723 vmov.i8 q14, #2 724 vbif q3, q12, q11 @final p0 725 vbit q1, q8, q7 @final p2 726 vbif q10, q2, q7 @final p1 727 vaddl.u8 q12, d8, d4 @q0+p1 L 728 vmlal.u8 q12, d10, d28 @X2(q1) + q0 + p1 L 729 vaddl.u8 q8, d9, d5 @q0+p1 H 730 vmlal.u8 q8, d11, d28 @X2(q1) + q0 + p1 H 731 vmov.i16 q14, #2 732 vaddl.u8 q7, d4, d12 @p1+q2 L 733 vmla.u16 q7, q9, q14 @p1 + X2(p0) + X2(q0) + X2(q1) + q2L 734 vaddl.u8 q2, d5, d13 @p1+q2H 735 vmla.u16 q2, q13, q14 @p1 + X2(p0) + X2(q0) + X2(q1) + q2H 736 vrshrn.u16 d24, q12, #2 @(X2(q1) + q0 + p1 + 2) >> 2; L q0' 737 vrshrn.u16 d25, q8, #2 @(X2(q1) + q0 + p1 + 2) >> 2; H q0' 738 vaddw.u8 q9, q9, d12 @p0 + q0 + q1 + q2 L 739 vaddw.u8 q13, q13, d13 @p0 + q0 + q1 + q2 H 740 vrshrn.u16 d16, q7, #3 @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 L qo" 741 vpop {q7} 742 vrshrn.u16 d17, q2, #3 @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 H qo" 743 vrshrn.u16 d4, q9, #2 @p0 + q0 + q1 + q2 + 2)>>2 L q1' 744 vrshrn.u16 d5, q13, #2 @p0 + q0 + q1 + q2 + 2)>>2 H q1' 745 vbit q12, q8, q15 @q0' or q0" 746 vbic q15, q15, q11 @final condn for q's 747 vtrn.8 d0, d2 @row1 &2 748 vbit q5, q2, q15 @final q1 749 vtrn.8 d1, d3 @row9 &10 750 vaddl.u8 q8, d12, d14 @q2+q3 L 751 vtrn.8 d20, d6 @row3&row4 752 vaddl.u8 q2, d13, d15 @q2+q3 H 753 vtrn.8 d21, d7 @row11 & 12 754 vmla.u16 q9, q8, q14 @X2(q3) + X3(q2) + q1 + q0 + p0 L 755 vtrn.16 d2, d6 @row2 & row4 756 vmla.u16 q13, q2, q14 @X2(q3) + X3(q2) + q1 + q0 + p0 H 757 vtrn.16 d3, d7 @row10 & 12 758 vbif q4, q12, q11 @final q0 759 vtrn.16 d0, d20 @row1 & 3 760 vrshrn.u16 d18, q9, #3 @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3; L 761 vtrn.16 d1, d21 @row9 & row11 762 vrshrn.u16 d19, q13, #3 @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3; H 763 vtrn.8 d8, d10 @row5&6 764 vbit q6, q9, q15 @final q2 765 vtrn.8 d9, d11 @row13 &14 766 vtrn.8 d12, d14 @row7 & 8 767 vtrn.8 d13, d15 @row15 & 16 768 vtrn.16 d10, d14 @row6 & row8 769 vtrn.16 d11, d15 @row14 & row16 770 @now Q3 ->p0 and Q7->q3 771 vtrn.16 d8, d12 @row 5 & 7 772 vtrn.16 d9, d13 @row13 & row15 773 sub r0, r0, r1, lsl#4 @restore pointer 774 vtrn.32 d6, d14 @row4 & 8 775 vtrn.32 d7, d15 @row 12 & 16 776 vtrn.32 d0, d8 @row1 & row5 777 vtrn.32 d1, d9 @row9 & 13 778 vtrn.32 d2, d10 @row2 &6 779 vtrn.32 d3, d11 @row10&row14 780 vtrn.32 d20, d12 @row3 & 7 781 vtrn.32 d21, d13 @row11 & row15 782 vst1.8 d0, [r0], r1 @row1 783 vst1.8 d2, [r0], r1 @row2 784 vst1.8 d20, [r0], r1 @row3 785 vst1.8 d6, [r0], r1 @row4 786 vst1.8 d8, [r0], r1 @row5 787 vst1.8 d10, [r0], r1 @row6 788 vst1.8 d12, [r0], r1 @row7 789 vst1.8 d14, [r0], r1 @row8 790 vst1.8 d1, [r0], r1 @row9 791 vst1.8 d3, [r0], r1 @row10 792 vst1.8 d21, [r0], r1 @row11 793 vst1.8 d7, [r0], r1 @row12 794 vst1.8 d9, [r0], r1 @row13 795 vst1.8 d11, [r0], r1 @row14 796 vst1.8 d13, [r0], r1 @row15 797 vst1.8 d15, [r0], r1 @row16 798 vpop {d8 - d15} 799 ldmfd sp!, {r12, pc} 800 801 802 803 @** 804 @******************************************************************************* 805 @* 806 @* @brief 807 @* Performs filtering of a luma block vertical edge when the 808 @* boundary strength is set to 4 on calling twice 809 @* 810 @* @par Description: 811 @* This operation is described in Sec. 8.7.2.4 under the title 812 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 813 @* 814 @* @param[in] r0 - pu1_src 815 @* Pointer to the src sample q0 816 @* 817 @* @param[in] r1 - src_strd 818 @* Source stride 819 @* 820 @* @param[in] r2 - alpha 821 @* Alpha Value for the boundary 822 @* 823 @* @param[in] r3 - beta 824 @* Beta Value for the boundary 825 @* 826 @* @returns 827 @* None 828 @* 829 @* @remarks 830 @* None 831 @* 832 @******************************************************************************* 833 @* 834 835 .global ih264_deblk_luma_vert_bs4_mbaff_a9 836 837 ih264_deblk_luma_vert_bs4_mbaff_a9: 838 839 stmfd sp!, {lr} 840 841 sub r0, r0, #4 @pointer uc_edgePixel-4 842 vpush {d8 - d15} 843 @loading [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] for every row 844 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 845 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 846 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 847 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 848 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 849 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 850 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 851 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 852 853 vuzp.8 d0, d1 @D0->p3, D1->p2 854 vuzp.8 d2, d3 @D2->p1, D3->p0 855 vuzp.8 d4, d5 @D4->q0, D5->q1 856 vuzp.8 d6, d7 @D6->q2, D7->q3 857 858 vmov.i16 q14, #2 859 vaddl.u8 q4, d3, d4 @p0+q0 860 vaddw.u8 q5, q4, d2 @p0+q0+p1 861 vaddl.u8 q6, d1, d5 @p2+q1 862 vmla.u16 q6, q5, q14 @p2 + X2(p1) + X2(p0) + X2(q0) + q1 863 864 vmov.i8 d14, #2 865 vaddw.u8 q4, q5, d1 @p0+q0+p1+p2 866 vdup.i8 d15, r2 @duplicate alpha 867 vrshrn.u16 d10, q4, #2 @(p2 + p1 + p0 + q0 + 2) >> 2) p1' 868 vabd.u8 d11, d3, d4 @ABD(p0-q0) 869 vsra.u8 d14, d15, #2 @alpha >>2 +2 870 vabd.u8 d15, d1, d3 @Ap = ABD(p2-p0) 871 vrshrn.u16 d12, q6, #3 @((p2 + X2(p1) + X2(p0) + X2(q0) + q1 + 4) >> 3) p0' 872 vdup.i8 d13, r3 @beta 873 vcgt.u8 d14, d14, d11 @ABS(p0 - q0) <((Alpha >>2) + 2) 874 vaddl.u8 q8, d3, d5 @p0+q1 875 vcgt.u8 d26, d13, d15 @beta>Ap 876 vaddw.u8 q8, q8, d2 @p0+q1+p1 877 vaddw.u8 q8, q8, d2 @p0+q1+2*p1 878 vand d26, d26, d14 @(Ap < Beta && ABS(p0 - q0) <((Alpha >>2) + 2) 879 vrshrn.u16 d11, q8, #2 @((X2(p1) + p0 + q1 + 2) >> 2) p0" 880 vbif d12, d11, d26 @p0' or p0 " 881 vaddl.u8 q9, d1, d0 @p2+p3 882 vadd.u16 q9, q9, q9 @2*(p2+p3) 883 vadd.u16 q4, q4, q9 @(X2(p3) + X3(p2) + p1 + p0 + q0) 884 vabd.u8 d15, d6, d4 @Aq = abs(q2-q0) 885 vabd.u8 d11, d5, d4 @ABS(q1-q0) 886 vrshrn.u16 d8, q4, #3 @((X2(p3) + X3(p2) + p1 + p0 + q0 + 4) >> 3); p2' 887 vabd.u8 d9, d2, d3 @ABS(p1-p0) 888 vcgt.u8 d15, d13, d15 @Aq < Beta 889 vcge.u8 d11, d11, d13 @ABS(q1 - q0) >= Beta 890 vcge.u8 d9, d9, d13 @ABS(p1 - p0) >= beta 891 vdup.i8 d13, r2 @duplicate alpha 892 vand d15, d15, d14 @(Aq < Beta && ABS(p0 - q0) <((Alpha >>2) + 2)) 893 vabd.u8 d14, d3, d4 @abs(p0-q0) 894 vorr d11, d11, d9 @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta 895 vcge.u8 d14, d14, d13 @ABS(p0 - q0) >= Alpha 896 vaddl.u8 q10, d3, d4 @p0+q0 897 vorr d11, d11, d14 @ABS(p1 - p0) >= Beta || ABS(q1 - q0) >= Beta||ABS(p0 - q0) >= Alpha 898 vaddw.u8 q10, q10, d5 @p0+q0+q1 899 vbic d26, d26, d11 @final condn for p's 900 vmov.i8 d14, #2 901 vbif d3, d12, d11 @final p0 902 vbit d1, d8, d26 @final p2 903 vbif d10, d2, d26 @final p1 904 vaddl.u8 q6, d4, d2 @q0+p1 905 vmlal.u8 q6, d5, d14 @X2(q1) + q0 + p1 906 907 vaddl.u8 q11, d2, d6 @p1+q2 908 vmla.u16 q11, q10, q14 @p1 + X2(p0) + X2(q0) + X2(q1) + q2 909 vrshrn.u16 d12, q6, #2 @(X2(q1) + q0 + p1 + 2) >> 2; q0' 910 vaddw.u8 q10, q10, d6 @p0 + q0 + q1 + q2 911 vrshrn.u16 d8, q11, #3 @(p1 + X2(p0) + X2(q0) + X2(q1) + q2 + 4) >> 3 qo" 912 913 vrshrn.u16 d2, q10, #2 @p0 + q0 + q1 + q2 + 2)>>2 q1' 914 vbit d12, d8, d15 @q0' or q0" 915 vbic d15, d15, d11 @final condn for q's 916 vbit d5, d2, d15 @final q1 917 vaddl.u8 q12, d6, d7 @q2+q3 918 vmla.u16 q10, q12, q14 @X2(q3) + X3(q2) + q1 + q0 + p0 919 vbif d4, d12, d11 @final q0 920 vrshrn.u16 d9, q10, #3 @(X2(q3) + X3(q2) + q1 + q0 + p0 + 4) >> 3; 921 vbit d6, d9, d15 @final q2 922 vand d2, d10, d10 @D0->p3, D1->p2, D2->p1, D3->p0, D4->q0, D5->q1, D6->q2, D7->q3 923 924 vzip.8 d0, d1 @D0,D1 -> [p3:p2] 925 vzip.8 d2, d3 @D2,D3 -> [p1:p0] 926 vzip.8 d4, d5 @D4,D5 -> [q0:q1] 927 vzip.8 d6, d7 @D6,D7 -> [q2:q3] 928 929 sub r0, r0, r1, lsl#3 @restore pointer 930 931 @storing [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] in every row 932 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 933 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 934 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 935 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 936 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 937 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 938 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 939 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 940 vpop {d8 - d15} 941 ldmfd sp!, {pc} 942 943 944 945 @** 946 @******************************************************************************* 947 @* 948 @* @brief 949 @* Performs filtering of a luma block vertical edge for cases where the 950 @* boundary strength is less than 4 on calling twice 951 @* 952 @* @par Description: 953 @* This operation is described in Sec. 8.7.2.4 under the title 954 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 955 @* 956 @* @param[in] r0 - pu1_src 957 @* Pointer to the src sample q0 958 @* 959 @* @param[in] r1 - src_strd 960 @* Source stride 961 @* 962 @* @param[in] r2 - alpha 963 @* Alpha Value for the boundary 964 @* 965 @* @param[in] r3 - beta 966 @* Beta Value for the boundary 967 @* 968 @* @param[in] sp(0) - u4_bs 969 @* Packed Boundary strength array 970 @* 971 @* @param[in] sp(4) - pu1_cliptab 972 @* tc0_table 973 @* 974 @* @returns 975 @* None 976 @* 977 @* @remarks 978 @* None 979 @* 980 @******************************************************************************* 981 @* 982 983 .global ih264_deblk_luma_vert_bslt4_mbaff_a9 984 985 ih264_deblk_luma_vert_bslt4_mbaff_a9: 986 987 stmfd sp!, {r12, lr} 988 989 sub r0, r0, #4 @pointer uc_edgePixel-4 990 ldr r12, [sp, #8] @r12 = ui_Bs 991 ldr r14, [sp, #12] @r14 = pu1_ClipTab 992 vpush {d8 - d15} 993 @loading [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] for every row 994 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 995 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 996 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 997 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 998 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 999 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 1000 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 1001 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 1002 1003 vuzp.8 d0, d1 @D0->p3, D1->p2 1004 vuzp.8 d2, d3 @D2->p1, D3->p0 1005 vuzp.8 d4, d5 @D4->q0, D5->q1 1006 vuzp.8 d6, d7 @D6->q2, D7->q3 1007 1008 rev r12, r12 @reversing ui_bs 1009 vmov.32 d8[0], r12 @D8[0] = ui_Bs 1010 vld1.32 d9[0], [r14] @D9[0] contains cliptab 1011 vmovl.u8 q15, d8 @D30 = ui_Bs in each 16 bt scalar 1012 vtbl.8 d8, {d9}, d30 @puc_ClipTab[ui_Bs] 1013 vsli.16 d8, d8, #8 @D8 = C0 1014 1015 vrhadd.u8 d10, d3, d4 @((p0 + q0 + 1) >> 1) 1016 vmov.i8 d31, #2 1017 vabd.u8 d11, d3, d4 @ABS(p0 - q0) 1018 vaddl.u8 q6, d10, d1 @(p2 + ((p0 + q0 + 1) >> 1) 1019 vmlsl.u8 q6, d2, d31 @(p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) 1020 vdup.8 d14, r2 @alpha 1021 vcle.u8 d11, d14, d11 @ABS(p0 - q0) >= Alpha(Alpha <=ABS(p0 - q0)) 1022 vdup.i8 d14, r3 @beta 1023 vabd.u8 d15, d5, d4 @ABS(q1 - q0) 1024 vqshrn.s16 d12, q6, #1 @((p2 + ((p0 + q0 + 1) >> 1) - (p1 << 1)) >> 1) 1025 vcge.u8 d15, d15, d14 @ABS(q1 - q0) >= Beta 1026 vabd.u8 d13, d2, d3 @ABS(p1 - p0) 1027 vmin.s8 d12, d12, d8 @min(deltap1 ,C0) 1028 vorr d11, d11, d15 @ABS(q1 - q0) >= Beta ||ABS(p0 - q0) >= Alpha 1029 vneg.s8 d15, d8 @-C0 1030 vcge.u8 d13, d13, d14 @ABS(p1 - p0) >= Beta 1031 vmax.s8 d12, d12, d15 @max(deltap1,-C0) 1032 vorr d11, d11, d13 @ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta) 1033 vceq.u16 d13, d30, #0 @ui_bs == 0 1034 vaddl.u8 q14, d10, d6 @q2 + ((p0 + q0 + 1) >> 1) 1035 vsubw.u8 q14, q14, d5 @q2 + ((p0 + q0 + 1) >> 1) - q1 1036 vsubw.u8 q14, q14, d5 @q2 + ((p0 + q0 + 1) >> 1) - 2*q1 1037 vorr d13, d13, d11 @(ABS(p0 - q0) >= Alpha || ABS(q1 - q0) >= Beta || ABS(p1 - p0) >= Beta)) 1038 @|| (ui_bs == 0) 1039 vqshrn.s16 d9, q14, #1 @(q2 + ((p0 + q0 + 1) >> 1) - (q1 << 1)) >> 1 1040 vabd.u8 d11, d1, d3 @Ap = ABS(p2 - p0) 1041 vabd.u8 d10, d6, d4 @Aq= ABS(q2 - q0) 1042 vclt.u8 d11, d11, d14 @Ap < Beta 1043 vmin.s8 d9, d9, d8 @min(deltaq1,C0) 1044 vclt.u8 d10, d10, d14 @Aq < Beta 1045 vmax.s8 d9, d9, d15 @max(deltaq1,-C0) 1046 vsubl.u8 q7, d4, d3 @q0 - p0 1047 vshl.s16 q7, q7, #2 @(q0 - p0) << 2 1048 vsub.u8 d8, d8, d11 @C0 + (Ap < Beta) 1049 vaddw.u8 q7, q7, d2 @((q0 - p0) << 2) + p1 1050 vsubw.u8 q7, q7, d5 @((q0 - p0) << 2) + (p1 - q1) 1051 vbic d11, d11, d13 @final condition for p1 1052 vrshr.s16 q15, q7, #3 @delta = (((q0 - p0) << 2) + (p1 - q1) + 4) >> 3 1053 vsub.u8 d8, d8, d10 @C0 + (Ap < Beta) + (Aq < Beta) 1054 vbic d10, d10, d13 @final condition for q1 1055 vabs.s16 q14, q15 1056 vmovn.i16 d15, q14 @abs(delta) 1057 vand d12, d12, d11 @delatp1 1058 vand d9, d9, d10 @deltaq1 1059 vmin.u8 d15, d15, d8 @min((abs(delta),C) 1060 vadd.i8 d2, d2, d12 @p1+deltap1 1061 vadd.i8 d5, d5, d9 @q1+deltaq1 1062 vbic d15, d15, d13 @abs(delta) of pixels to be changed only 1063 vcge.s16 q14, q15, #0 1064 vmovn.i16 d14, q14 @sign(delta) 1065 vqsub.u8 d11, d3, d15 @clip(p0-delta) 1066 vqadd.u8 d3, d3, d15 @clip(p0+delta) 1067 vqadd.u8 d12, d4, d15 @clip(q0+delta) 1068 vqsub.u8 d4, d4, d15 @clip(q0-delta) 1069 vbif d3, d11, d14 @p0 1070 vbif d4, d12, d14 @q0 1071 1072 sub r0, r0, r1, lsl#3 @restore pointer 1073 @D0->p3, D1->p2, D2->p1, D3->p0, D4->q0, D5->q1, D6->q2, D7->q3 1074 vzip.8 d0, d1 @D0,D1 -> [p3:p2] 1075 vzip.8 d2, d3 @D2,D3 -> [p1:p0] 1076 vzip.8 d4, d5 @D4,D5 -> [q0:q1] 1077 vzip.8 d6, d7 @D6,D7 -> [q2:q3] 1078 1079 @storing [p3:p2],[p1:p0]:[q0:q1]:[q2:q3] in every row 1080 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 1081 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 1082 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 1083 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 1084 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 1085 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 1086 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 1087 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 1088 vpop {d8 - d15} 1089 ldmfd sp!, {r12, pc} 1090 1091 1092 1093