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_chroma_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_chroma_vert_bs4_bp_a9() */ 29 @/* ih264_deblk_chroma_vert_bslt4_bp_a9() */ 30 @/* ih264_deblk_chroma_horz_bs4_bp_a9() */ 31 @/* ih264_deblk_chroma_horz_bslt4_bp_a9() */ 32 @/* ih264_deblk_chroma_vert_bs4_mbaff_bp_a9() */ 33 @/* ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9() */ 34 @/* ih264_deblk_chroma_vert_bs4_a9() */ 35 @/* ih264_deblk_chroma_vert_bslt4_a9() */ 36 @/* ih264_deblk_chroma_horz_bs4_a9() */ 37 @/* ih264_deblk_chroma_horz_bslt4_a9() */ 38 @/* ih264_deblk_chroma_vert_bs4_mbaff_a9() */ 39 @/* ih264_deblk_chroma_vert_bslt4_mbaff_a9() */ 40 @/* */ 41 @/* Issues / Problems : None */ 42 @/* */ 43 @/* Revision History : */ 44 @/* */ 45 @/* DD MM YYYY Author(s) Changes (Describe the changes made) */ 46 @/* 28 11 2013 Ittiam Draft */ 47 @/* 05 01 2015 Kaushik Added double-call functions for */ 48 @/* Senthoor vertical deblocking, and high */ 49 @/* profile functions. */ 50 @/* */ 51 @/*****************************************************************************/ 52 53 54 .text 55 .p2align 2 56 57 @** 58 @******************************************************************************* 59 @* 60 @* @brief 61 @* Performs filtering of a chroma block horizontal edge when the 62 @* boundary strength is set to 4 63 @* 64 @* @par Description: 65 @* This operation is described in Sec. 8.7.2.4 under the title 66 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 67 @* 68 @* @param[in] r0 - pu1_src 69 @* Pointer to the src sample q0 70 @* 71 @* @param[in] r1 - src_strd 72 @* Source stride 73 @* 74 @* @param[in] r2 - alpha 75 @* Alpha Value for the boundary 76 @* 77 @* @param[in] r3 - beta 78 @* Beta Value for the boundary 79 @* 80 @* @returns 81 @* None 82 @* 83 @* @remarks 84 @* None 85 @* 86 @******************************************************************************* 87 @* 88 89 .global ih264_deblk_chroma_horz_bs4_bp_a9 90 91 ih264_deblk_chroma_horz_bs4_bp_a9: 92 93 stmfd sp!, {r4, lr} @ 94 vpush {d8 - d15} 95 sub r0, r0, r1, lsl #1 @R0 = uc_edgePixel pointing to p1 of chroma 96 vld2.8 {d6, d7}, [r0], r1 @D6 = p1u , D7 = p1v 97 mov r4, r0 @Keeping a backup of the pointer p0 of chroma 98 vld2.8 {d4, d5}, [r0], r1 @D4 = p0u , D5 = p0v 99 vdup.8 q10, r2 @Q10 contains alpha 100 vld2.8 {d0, d1}, [r0], r1 @D0 = q0u , D1 = q0v 101 vaddl.u8 q4, d6, d0 @ 102 vaddl.u8 q5, d7, d1 @Q4,Q5 = q0 + p1 103 vmov.i8 d31, #2 @ 104 vld2.8 {d2, d3}, [r0] @D2 = q1u , D3 = q1v 105 vabd.u8 q13, q3, q2 @Q13 = ABS(p1 - p0) 106 vmlal.u8 q4, d2, d31 @ 107 vmlal.u8 q5, d3, d31 @Q5,Q4 = (X2(q1U) + q0U + p1U) 108 vabd.u8 q11, q2, q0 @Q11 = ABS(p0 - q0) 109 vabd.u8 q12, q1, q0 @Q12 = ABS(q1 - q0) 110 vaddl.u8 q7, d4, d2 @ 111 vaddl.u8 q14, d5, d3 @Q14,Q7 = P0 + Q1 112 vdup.8 q8, r3 @Q8 contains beta 113 vmlal.u8 q7, d6, d31 @ 114 vmlal.u8 q14, d7, d31 @Q14,Q7 = (X2(p1U) + p0U + q1U) 115 vcge.u8 q9, q11, q10 @Q9 = ( ABS(p0 - q0) >= Alpha ) 116 vcge.u8 q12, q12, q8 @Q12= ( ABS(q1 - q0) >= Beta ) 117 vcge.u8 q13, q13, q8 @Q13= ( ABS(p1 - p0) >= Beta ) 118 vrshrn.u16 d8, q4, #2 @ 119 vrshrn.u16 d9, q5, #2 @Q4 = (X2(q1U) + q0U + p1U + 2) >> 2 120 vorr q9, q9, q12 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) 121 vrshrn.u16 d10, q7, #2 @ 122 vrshrn.u16 d11, q14, #2 @Q5 = (X2(p1U) + p0U + q1U + 2) >> 2 123 vorr q9, q9, q13 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta ) 124 vbit q5, q2, q9 @ 125 vbit q4, q0, q9 @ 126 vst2.8 {d10, d11}, [r4], r1 @ 127 vst2.8 {d8, d9}, [r4] @ 128 vpop {d8 - d15} 129 ldmfd sp!, {r4, pc} @ 130 131 132 133 @** 134 @******************************************************************************* 135 @* 136 @* @brief 137 @* Performs filtering of a chroma block vertical edge when the 138 @* boundary strength is set to 4 139 @* 140 @* @par Description: 141 @* This operation is described in Sec. 8.7.2.4 under the title 142 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 143 @* 144 @* @param[in] r0 - pu1_src 145 @* Pointer to the src sample q0 146 @* 147 @* @param[in] r1 - src_strd 148 @* Source stride 149 @* 150 @* @param[in] r2 - alpha 151 @* Alpha Value for the boundary 152 @* 153 @* @param[in] r3 - beta 154 @* Beta Value for the boundary 155 @* 156 @* @returns 157 @* None 158 @* 159 @* @remarks 160 @* None 161 @* 162 @******************************************************************************* 163 @* 164 165 .global ih264_deblk_chroma_vert_bs4_bp_a9 166 167 ih264_deblk_chroma_vert_bs4_bp_a9: 168 169 stmfd sp!, {r12, r14} 170 vpush {d8 - d15} 171 sub r0, r0, #4 @point r0 to p1u of row0. 172 mov r12, r0 @keep a back up of r0 for buffer write 173 174 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 175 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 176 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 177 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 178 179 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 180 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 181 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 182 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 183 184 vdup.8 q11, r2 @Q4 = alpha 185 vdup.8 q12, r3 @Q5 = beta 186 vmov.i8 d31, #2 187 188 vabd.u8 q4, q1, q2 @|p0-q0| 189 vabd.u8 q5, q3, q2 @|q1-q0| 190 vabd.u8 q6, q0, q1 @|p1-p0| 191 vaddl.u8 q7, d2, d6 192 vaddl.u8 q8, d3, d7 @(p0 + q1) 193 vclt.u8 q4, q4, q11 @|p0-q0| < alpha ? 194 vclt.u8 q5, q5, q12 @|q1-q0| < beta ? 195 vclt.u8 q6, q6, q12 @|p1-p0| < beta ? 196 vmlal.u8 q7, d0, d31 197 vmlal.u8 q8, d1, d31 @2*p1 + (p0 + q1) 198 vaddl.u8 q9, d0, d4 199 vaddl.u8 q10, d1, d5 @(p1 + q0) 200 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta 201 vmlal.u8 q9, d6, d31 202 vmlal.u8 q10, d7, d31 @2*q1 + (p1 + q0) 203 204 vrshrn.i16 d14, q7, #2 205 vrshrn.i16 d15, q8, #2 @(2*p1 + (p0 + q1) + 2) >> 2 206 vand.u8 q4, q4, q6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 207 vrshrn.i16 d18, q9, #2 208 vrshrn.i16 d19, q10, #2 @(2*q1 + (p1 + q0) + 2) >> 2 209 210 vbit q1, q7, q4 211 vbit q2, q9, q4 212 213 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r12], r1 214 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r12], r1 215 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r12], r1 216 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r12], r1 217 218 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r12], r1 219 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r12], r1 220 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r12], r1 221 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r12], r1 222 vpop {d8 - d15} 223 ldmfd sp!, {r12, pc} 224 225 226 227 @** 228 @******************************************************************************* 229 @* 230 @* @brief 231 @* Performs filtering of a chroma block horizontal edge for cases where the 232 @* boundary strength is less than 4 233 @* 234 @* @par Description: 235 @* This operation is described in Sec. 8.7.2.4 under the title 236 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 237 @* 238 @* @param[in] r0 - pu1_src 239 @* Pointer to the src sample q0 240 @* 241 @* @param[in] r1 - src_strd 242 @* Source stride 243 @* 244 @* @param[in] r2 - alpha 245 @* Alpha Value for the boundary 246 @* 247 @* @param[in] r3 - beta 248 @* Beta Value for the boundary 249 @* 250 @* @param[in] sp(0) - u4_bs 251 @* Packed Boundary strength array 252 @* 253 @* @param[in] sp(4) - pu1_cliptab 254 @* tc0_table 255 @* 256 @* @returns 257 @* None 258 @* 259 @* @remarks 260 @* None 261 @* 262 @******************************************************************************* 263 @* 264 265 .global ih264_deblk_chroma_horz_bslt4_bp_a9 266 267 ih264_deblk_chroma_horz_bslt4_bp_a9: 268 269 stmfd sp!, {r4-r6, lr} @ 270 271 ldrd r4, r5, [sp, #0x10] @r4 = u4_bs , r5 = pu1_cliptab 272 vpush {d8 - d15} 273 sub r0, r0, r1, lsl #1 @R0 = uc_edgePixelU pointing to p2 of chroma U 274 rev r4, r4 @ 275 vmov.32 d12[0], r4 @d12[0] = ui_Bs 276 vld1.32 d16[0], [r5] @D16[0] contains cliptab 277 vld2.8 {d6, d7}, [r0], r1 @Q3=p1 278 vtbl.8 d14, {d16}, d12 @ 279 vmovl.u8 q6, d12 @q6 = uc_Bs in each 16 bit scalar 280 mov r6, r0 @Keeping a backup of the pointer to chroma U P0 281 vld2.8 {d4, d5}, [r0], r1 @Q2=p0 282 vmov.i8 d30, #1 @ 283 vdup.8 q10, r2 @Q10 contains alpha 284 vld2.8 {d0, d1}, [r0], r1 @Q0=q0 285 vmovl.u8 q7, d14 @ 286 vld2.8 {d2, d3}, [r0] @Q1=q1 287 vsubl.u8 q5, d1, d5 @ 288 vsubl.u8 q4, d0, d4 @Q5,Q4 = (q0 - p0) 289 vabd.u8 q13, q3, q2 @Q13 = ABS(p1 - p0) 290 vshl.i16 q5, q5, #2 @Q5 = (q0 - p0)<<2 291 vabd.u8 q11, q2, q0 @Q11 = ABS(p0 - q0) 292 vshl.i16 q4, q4, #2 @Q4 = (q0 - p0)<<2 293 vsli.16 q7, q7, #8 @ 294 vabd.u8 q12, q1, q0 @Q12 = ABS(q1 - q0) 295 vcge.u8 q9, q11, q10 @Q9 = ( ABS(p0 - q0) >= Alpha ) 296 vsubl.u8 q10, d6, d2 @Q10 = (p1 - q1)L 297 vsubl.u8 q3, d7, d3 @Q3 = (p1 - q1)H 298 vdup.8 q8, r3 @Q8 contains beta 299 vadd.i16 q4, q4, q10 @ 300 vadd.i16 q5, q5, q3 @Q5,Q4 = [ (q0 - p0)<<2 ] + (p1 - q1) 301 vcge.u8 q12, q12, q8 @Q12= ( ABS(q1 - q0) >= Beta ) 302 vcgt.s16 d12, d12, #0 @Q6 = (us_Bs > 0) 303 vqrshrn.s16 d8, q4, #3 @ 304 vqrshrn.s16 d9, q5, #3 @Q4 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3 305 vadd.i8 d14, d14, d30 @Q7 = C = C0+1 306 vcge.u8 q13, q13, q8 @Q13= ( ABS(p1 - p0) >= Beta ) 307 vorr q9, q9, q12 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) 308 vabs.s8 q3, q4 @Q4 = ABS (i_macro) 309 vmov.i8 d15, d14 @ 310 vmov.i8 d13, d12 @ 311 vorr q9, q9, q13 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta ) 312 vmin.u8 q7, q3, q7 @Q7 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro) 313 vbic q6, q6, q9 @final condition 314 vcge.s8 q4, q4, #0 @Q4 = (i_macro >= 0) 315 vand q7, q7, q6 @Making delta zero in places where values shouldn be filterd 316 vqadd.u8 q8, q2, q7 @Q8 = p0 + delta 317 vqsub.u8 q2, q2, q7 @Q2 = p0 - delta 318 vqadd.u8 q9, q0, q7 @Q9 = q0 + delta 319 vqsub.u8 q0, q0, q7 @Q0 = q0 - delta 320 vbif q8, q2, q4 @Q8 = (i_macro >= 0 ) ? (p0+delta) : (p0-delta) 321 vbif q0, q9, q4 @Q0 = (i_macro >= 0 ) ? (q0-delta) : (q0+delta) 322 vst2.8 {d16, d17}, [r6], r1 @ 323 vst2.8 {d0, d1}, [r6] @ 324 vpop {d8 - d15} 325 ldmfd sp!, {r4-r6, pc} @ 326 327 328 329 @** 330 @******************************************************************************* 331 @* 332 @* @brief 333 @* Performs filtering of a chroma block vertical edge for cases where the 334 @* boundary strength is less than 4 335 @* 336 @* @par Description: 337 @* This operation is described in Sec. 8.7.2.4 under the title 338 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 339 @* 340 @* @param[in] r0 - pu1_src 341 @* Pointer to the src sample q0 342 @* 343 @* @param[in] r1 - src_strd 344 @* Source stride 345 @* 346 @* @param[in] r2 - alpha 347 @* Alpha Value for the boundary 348 @* 349 @* @param[in] r3 - beta 350 @* Beta Value for the boundary 351 @* 352 @* @param[in] sp(0) - u4_bs 353 @* Packed Boundary strength array 354 @* 355 @* @param[in] sp(4) - pu1_cliptab 356 @* tc0_table 357 @* 358 @* @returns 359 @* None 360 @* 361 @* @remarks 362 @* None 363 @* 364 @******************************************************************************* 365 @* 366 367 .global ih264_deblk_chroma_vert_bslt4_bp_a9 368 369 ih264_deblk_chroma_vert_bslt4_bp_a9: 370 371 stmfd sp!, {r10-r12, r14} 372 373 sub r0, r0, #4 @point r0 to p1u of row0. 374 ldr r11, [sp, #16] @r12 = ui_Bs 375 376 ldr r10, [sp, #20] @r14 = puc_ClipTab 377 mov r12, r0 @keep a back up of r0 for buffer write 378 vpush {d8 - d15} 379 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 380 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 381 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 382 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 383 384 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 385 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 386 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 387 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 388 389 390 vdup.8 q11, r2 @Q4 = alpha 391 vabd.u8 q4, q1, q2 @|p0-q0| 392 vdup.8 q12, r3 @Q5 = beta 393 vabd.u8 q5, q3, q2 @|q1-q0| 394 vabd.u8 q6, q0, q1 @|p1-p0| 395 vclt.u8 q4, q4, q11 @|p0-q0| < alpha ? 396 vsubl.u8 q7, d0, d6 397 vclt.u8 q5, q5, q12 @|q1-q0| < beta ? 398 vsubl.u8 q8, d1, d7 @(p1 - q1) 399 vclt.u8 q6, q6, q12 @|p1-p0| < beta ? 400 vsubl.u8 q9, d4, d2 401 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta 402 vsubl.u8 q10, d5, d3 @(q0 - p0) 403 vmov.u16 q14, #4 404 vld1.32 {d24[0]}, [r10] @Load ClipTable 405 rev r11, r11 @Blocking strengths 406 vand.u8 q4, q4, q6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 407 408 vmov.32 d10[0], r11 409 410 vmla.s16 q7, q9, q14 411 vmla.s16 q8, q10, q14 @4*(q0 - p0) + (p1 - q1) 412 413 vmovl.u8 q5, d10 414 415 416 vsli.u16 d10, d10, #8 417 vmovl.u16 q5, d10 418 vsli.u32 q5, q5, #16 419 vtbl.8 d12, {d24}, d10 420 vtbl.8 d13, {d24}, d11 @tC0 421 vmov.u8 q12, #1 422 vadd.u8 q6, q6, q12 @tC0 + 1 423 vcge.u8 q5, q5, q12 @u4_bS > 0 ? 424 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0 425 426 @ Q0 - Q3(inputs), 427 @ Q4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0), 428 @ Q6 (tC) 429 430 vrshr.s16 q7, q7, #3 431 vrshr.s16 q8, q8, #3 @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) 432 433 vcgt.s16 q9, q7, #0 434 vcgt.s16 q10, q8, #0 435 vmovn.i16 d18, q9 436 vmovn.i16 d19, q10 @Q9 = sign(delta) 437 vabs.s16 q7, q7 438 vabs.s16 q8, q8 439 vmovn.u16 d14, q7 440 vmovn.u16 d15, q8 441 vmin.u8 q7, q7, q6 @Q7 = |delta| 442 443 vqadd.u8 q10, q1, q7 @p0+|delta| 444 vqadd.u8 q11, q2, q7 @q0+|delta| 445 vqsub.u8 q12, q1, q7 @p0-|delta| 446 vqsub.u8 q13, q2, q7 @q0-|delta| 447 448 vbit q12, q10, q9 @p0 + delta 449 vbit q11, q13, q9 @q0 - delta 450 451 vbit q1, q12, q4 452 vbit q2, q11, q4 453 454 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r12], r1 455 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r12], r1 456 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r12], r1 457 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r12], r1 458 459 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r12], r1 460 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r12], r1 461 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r12], r1 462 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r12], r1 463 vpop {d8 - d15} 464 ldmfd sp!, {r10-r12, pc} 465 466 467 468 @** 469 @******************************************************************************* 470 @* 471 @* @brief 472 @* Performs filtering of a chroma block vertical edge when the 473 @* boundary strength is set to 4 on calling twice 474 @* 475 @* @par Description: 476 @* This operation is described in Sec. 8.7.2.4 under the title 477 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 478 @* 479 @* @param[in] r0 - pu1_src 480 @* Pointer to the src sample q0 481 @* 482 @* @param[in] r1 - src_strd 483 @* Source stride 484 @* 485 @* @param[in] r2 - alpha 486 @* Alpha Value for the boundary 487 @* 488 @* @param[in] r3 - beta 489 @* Beta Value for the boundary 490 @* 491 @* @returns 492 @* None 493 @* 494 @* @remarks 495 @* None 496 @* 497 @******************************************************************************* 498 @* 499 500 .global ih264_deblk_chroma_vert_bs4_mbaff_bp_a9 501 502 ih264_deblk_chroma_vert_bs4_mbaff_bp_a9: 503 504 stmfd sp!, {r12, r14} 505 vpush {d8 - d15} 506 sub r0, r0, #4 @point r0 to p1u of row0. 507 mov r12, r0 @keep a back up of r0 for buffer write 508 509 vld4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0], r1 510 vld4.16 {d0[1], d1[1], d2[1], d3[1]}, [r0], r1 511 vld4.16 {d0[2], d1[2], d2[2], d3[2]}, [r0], r1 512 vld4.16 {d0[3], d1[3], d2[3], d3[3]}, [r0], r1 513 514 vdup.8 d11, r2 @D11 = alpha 515 vdup.8 d12, r3 @D12 = beta 516 vmov.i8 d31, #2 517 518 vabd.u8 d4, d1, d2 @|p0-q0| 519 vabd.u8 d5, d3, d2 @|q1-q0| 520 vabd.u8 d6, d0, d1 @|p1-p0| 521 vaddl.u8 q14, d1, d3 @(p0 + q1) 522 vclt.u8 d4, d4, d11 @|p0-q0| < alpha ? 523 vclt.u8 d5, d5, d12 @|q1-q0| < beta ? 524 vclt.u8 d6, d6, d12 @|p1-p0| < beta ? 525 vmlal.u8 q14, d0, d31 @2*p1 + (p0 + q1) 526 vaddl.u8 q13, d0, d2 @(p1 + q0) 527 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta 528 vmlal.u8 q13, d3, d31 @2*q1 + (p1 + q0) 529 530 vrshrn.i16 d7, q14, #2 @(2*p1 + (p0 + q1) + 2) >> 2 531 vand.u8 d4, d4, d6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 532 vrshrn.i16 d9, q13, #2 @(2*q1 + (p1 + q0) + 2) >> 2 533 534 vbit d1, d7, d4 535 vbit d2, d9, d4 536 537 vst4.16 {d0[0], d1[0], d2[0], d3[0]}, [r12], r1 538 vst4.16 {d0[1], d1[1], d2[1], d3[1]}, [r12], r1 539 vst4.16 {d0[2], d1[2], d2[2], d3[2]}, [r12], r1 540 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r12], r1 541 vpop {d8 - d15} 542 ldmfd sp!, {r12, pc} 543 544 545 546 @** 547 @******************************************************************************* 548 @* 549 @* @brief 550 @* Performs filtering of a chroma block vertical edge for cases where the 551 @* boundary strength is less than 4 on calling twice 552 @* 553 @* @par Description: 554 @* This operation is described in Sec. 8.7.2.4 under the title 555 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 556 @* 557 @* @param[in] r0 - pu1_src 558 @* Pointer to the src sample q0 559 @* 560 @* @param[in] r1 - src_strd 561 @* Source stride 562 @* 563 @* @param[in] r2 - alpha 564 @* Alpha Value for the boundary 565 @* 566 @* @param[in] r3 - beta 567 @* Beta Value for the boundary 568 @* 569 @* @param[in] sp(0) - u4_bs 570 @* Packed Boundary strength array 571 @* 572 @* @param[in] sp(4) - pu1_cliptab 573 @* tc0_table 574 @* 575 @* @returns 576 @* None 577 @* 578 @* @remarks 579 @* None 580 @* 581 @******************************************************************************* 582 @* 583 584 .global ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9 585 586 ih264_deblk_chroma_vert_bslt4_mbaff_bp_a9: 587 588 stmfd sp!, {r10-r12, r14} 589 590 sub r0, r0, #4 @point r0 to p1u of row0. 591 ldr r11, [sp, #16] @r11 = ui_Bs 592 593 ldr r10, [sp, #20] @r10 = puc_ClipTab 594 mov r12, r0 @keep a back up of r0 for buffer write 595 vpush {d8 - d15} 596 vld4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0], r1 597 vld4.16 {d0[1], d1[1], d2[1], d3[1]}, [r0], r1 598 vld4.16 {d0[2], d1[2], d2[2], d3[2]}, [r0], r1 599 vld4.16 {d0[3], d1[3], d2[3], d3[3]}, [r0], r1 600 601 vdup.8 d11, r2 @D11 = alpha 602 vabd.u8 d4, d1, d2 @|p0-q0| 603 vdup.8 d12, r3 @D12 = beta 604 vabd.u8 d5, d3, d2 @|q1-q0| 605 vabd.u8 d6, d0, d1 @|p1-p0| 606 vclt.u8 d4, d4, d11 @|p0-q0| < alpha ? 607 vclt.u8 d5, d5, d12 @|q1-q0| < beta ? 608 vsubl.u8 q14, d0, d3 @(p1 - q1) 609 vclt.u8 d6, d6, d12 @|p1-p0| < beta ? 610 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta 611 vsubl.u8 q12, d2, d1 @(q0 - p0) 612 vmov.u16 q10, #4 613 614 vld1.32 {d31[0]}, [r10] @Load ClipTable 615 rev r11, r11 @Blocking strengths 616 vand.u8 d4, d4, d6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 617 vmov.32 d22[0], r11 618 vmla.s16 q14, q12, q10 @4*(q0 - p0) + (p1 - q1) 619 vmovl.u8 q11, d22 620 vsli.u16 d22, d22, #8 621 vtbl.8 d6, {d31}, d22 @tC0 622 vmov.u8 d12, #1 623 vadd.u8 d6, d6, d12 @tC0 + 1 624 vcge.u8 d5, d22, d12 @u4_bS > 0 ? 625 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0 626 627 @ D0 - D3(inputs), 628 @ D4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0), 629 @ D6 (tC) 630 631 vrshr.s16 q14, q14, #3 @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) 632 633 vcgt.s16 q13, q14, #0 634 vmovn.i16 d9, q13 @D9 = sign(delta) 635 vabs.s16 q14, q14 636 vmovn.u16 d7, q14 637 vmin.u8 d7, d7, d6 @D7 = |delta| 638 639 vqadd.u8 d10, d1, d7 @p0+|delta| 640 vqadd.u8 d11, d2, d7 @q0+|delta| 641 vqsub.u8 d12, d1, d7 @p0-|delta| 642 vqsub.u8 d13, d2, d7 @q0-|delta| 643 644 vbit d12, d10, d9 @p0 + delta 645 vbit d11, d13, d9 @q0 - delta 646 647 vbit d1, d12, d4 648 vbit d2, d11, d4 649 650 vst4.16 {d0[0], d1[0], d2[0], d3[0]}, [r12], r1 651 vst4.16 {d0[1], d1[1], d2[1], d3[1]}, [r12], r1 652 vst4.16 {d0[2], d1[2], d2[2], d3[2]}, [r12], r1 653 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r12], r1 654 vpop {d8 - d15} 655 ldmfd sp!, {r10-r12, pc} 656 657 658 659 @** 660 @******************************************************************************* 661 @* 662 @* @brief 663 @* Performs filtering of a chroma block horizontal edge when the 664 @* boundary strength is set to 4 in high profile 665 @* 666 @* @par Description: 667 @* This operation is described in Sec. 8.7.2.4 under the title 668 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 669 @* 670 @* @param[in] r0 - pu1_src 671 @* Pointer to the src sample q0 672 @* 673 @* @param[in] r1 - src_strd 674 @* Source stride 675 @* 676 @* @param[in] r2 - alpha_cb 677 @* Alpha Value for the boundary in U 678 @* 679 @* @param[in] r3 - beta_cb 680 @* Beta Value for the boundary in U 681 @* 682 @* @param[in] sp(0) - alpha_cr 683 @* Alpha Value for the boundary in V 684 @* 685 @* @param[in] sp(4) - beta_cr 686 @* Beta Value for the boundary in V 687 @* 688 @* @returns 689 @* None 690 @* 691 @* @remarks 692 @* None 693 @* 694 @******************************************************************************* 695 @* 696 697 .global ih264_deblk_chroma_horz_bs4_a9 698 699 ih264_deblk_chroma_horz_bs4_a9: 700 701 stmfd sp!, {r4-r6, lr} @ 702 703 ldr r5, [sp, #16] @R5 = alpha_cr 704 ldr r6, [sp, #20] @R6 = beta_cr 705 vpush {d8 - d15} 706 sub r0, r0, r1, lsl #1 @R0 = uc_edgePixel pointing to p1 of chroma 707 vld2.8 {d6, d7}, [r0], r1 @D6 = p1u , D7 = p1v 708 mov r4, r0 @Keeping a backup of the pointer p0 of chroma 709 vld2.8 {d4, d5}, [r0], r1 @D4 = p0u , D5 = p0v 710 vdup.8 d20, r2 @D20 contains alpha_cb 711 vdup.8 d21, r5 @D21 contains alpha_cr 712 vld2.8 {d0, d1}, [r0], r1 @D0 = q0u , D1 = q0v 713 vaddl.u8 q4, d6, d0 @ 714 vaddl.u8 q5, d7, d1 @Q4,Q5 = q0 + p1 715 vmov.i8 d31, #2 @ 716 vld2.8 {d2, d3}, [r0] @D2 = q1u , D3 = q1v 717 vabd.u8 q13, q3, q2 @Q13 = ABS(p1 - p0) 718 vmlal.u8 q4, d2, d31 @ 719 vmlal.u8 q5, d3, d31 @Q5,Q4 = (X2(q1U) + q0U + p1U) 720 vabd.u8 q11, q2, q0 @Q11 = ABS(p0 - q0) 721 vabd.u8 q12, q1, q0 @Q12 = ABS(q1 - q0) 722 vaddl.u8 q7, d4, d2 @ 723 vaddl.u8 q14, d5, d3 @Q14,Q7 = P0 + Q1 724 vdup.8 d16, r3 @D16 contains beta_cb 725 vdup.8 d17, r6 @D17 contains beta_cr 726 vmlal.u8 q7, d6, d31 @ 727 vmlal.u8 q14, d7, d31 @Q14,Q7 = (X2(p1U) + p0U + q1U) 728 vcge.u8 q9, q11, q10 @Q9 = ( ABS(p0 - q0) >= Alpha ) 729 vcge.u8 q12, q12, q8 @Q12= ( ABS(q1 - q0) >= Beta ) 730 vcge.u8 q13, q13, q8 @Q13= ( ABS(p1 - p0) >= Beta ) 731 vrshrn.u16 d8, q4, #2 @ 732 vrshrn.u16 d9, q5, #2 @Q4 = (X2(q1U) + q0U + p1U + 2) >> 2 733 vorr q9, q9, q12 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) 734 vrshrn.u16 d10, q7, #2 @ 735 vrshrn.u16 d11, q14, #2 @Q5 = (X2(p1U) + p0U + q1U + 2) >> 2 736 vorr q9, q9, q13 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta ) 737 vbit q5, q2, q9 @ 738 vbit q4, q0, q9 @ 739 vst2.8 {d10, d11}, [r4], r1 @ 740 vst2.8 {d8, d9}, [r4] @ 741 vpop {d8 - d15} 742 ldmfd sp!, {r4-r6, pc} @ 743 744 745 746 @** 747 @******************************************************************************* 748 @* 749 @* @brief 750 @* Performs filtering of a chroma block vertical edge when the 751 @* boundary strength is set to 4 in high profile 752 @* 753 @* @par Description: 754 @* This operation is described in Sec. 8.7.2.4 under the title 755 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 756 @* 757 @* @param[in] r0 - pu1_src 758 @* Pointer to the src sample q0 759 @* 760 @* @param[in] r1 - src_strd 761 @* Source stride 762 @* 763 @* @param[in] r2 - alpha_cb 764 @* Alpha Value for the boundary in U 765 @* 766 @* @param[in] r3 - beta_cb 767 @* Beta Value for the boundary in U 768 @* 769 @* @param[in] sp(0) - alpha_cr 770 @* Alpha Value for the boundary in V 771 @* 772 @* @param[in] sp(4) - beta_cr 773 @* Beta Value for the boundary in V 774 @* 775 @* @returns 776 @* None 777 @* 778 @* @remarks 779 @* None 780 @* 781 @******************************************************************************* 782 @* 783 784 .global ih264_deblk_chroma_vert_bs4_a9 785 786 ih264_deblk_chroma_vert_bs4_a9: 787 788 stmfd sp!, {r4, r5, r12, r14} 789 790 sub r0, r0, #4 @point r0 to p1u of row0. 791 mov r12, r0 @keep a back up of r0 for buffer write 792 793 ldr r4, [sp, #16] @r4 = alpha_cr 794 ldr r5, [sp, #20] @r5 = beta_cr 795 add r2, r2, r4, lsl #8 @r2 = (alpha_cr,alpha_cb) 796 add r3, r3, r5, lsl #8 @r3 = (beta_cr,beta_cb) 797 vpush {d8 - d15} 798 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 799 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 800 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 801 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 802 803 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 804 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 805 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 806 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 807 808 vdup.16 q11, r2 @Q11 = alpha 809 vdup.16 q12, r3 @Q12 = beta 810 vmov.i8 d31, #2 811 812 vabd.u8 q4, q1, q2 @|p0-q0| 813 vabd.u8 q5, q3, q2 @|q1-q0| 814 vabd.u8 q6, q0, q1 @|p1-p0| 815 vaddl.u8 q7, d2, d6 816 vaddl.u8 q8, d3, d7 @(p0 + q1) 817 vclt.u8 q4, q4, q11 @|p0-q0| < alpha ? 818 vclt.u8 q5, q5, q12 @|q1-q0| < beta ? 819 vclt.u8 q6, q6, q12 @|p1-p0| < beta ? 820 vmlal.u8 q7, d0, d31 821 vmlal.u8 q8, d1, d31 @2*p1 + (p0 + q1) 822 vaddl.u8 q9, d0, d4 823 vaddl.u8 q10, d1, d5 @(p1 + q0) 824 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta 825 vmlal.u8 q9, d6, d31 826 vmlal.u8 q10, d7, d31 @2*q1 + (p1 + q0) 827 828 vrshrn.i16 d14, q7, #2 829 vrshrn.i16 d15, q8, #2 @(2*p1 + (p0 + q1) + 2) >> 2 830 vand.u8 q4, q4, q6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 831 vrshrn.i16 d18, q9, #2 832 vrshrn.i16 d19, q10, #2 @(2*q1 + (p1 + q0) + 2) >> 2 833 834 vbit q1, q7, q4 835 vbit q2, q9, q4 836 837 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r12], r1 838 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r12], r1 839 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r12], r1 840 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r12], r1 841 842 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r12], r1 843 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r12], r1 844 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r12], r1 845 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r12], r1 846 vpop {d8 - d15} 847 ldmfd sp!, {r4, r5, r12, pc} 848 849 850 851 @** 852 @******************************************************************************* 853 @* 854 @* @brief 855 @* Performs filtering of a chroma block horizontal edge for cases where the 856 @* boundary strength is less than 4 in high profile 857 @* 858 @* @par Description: 859 @* This operation is described in Sec. 8.7.2.4 under the title 860 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 861 @* 862 @* @param[in] r0 - pu1_src 863 @* Pointer to the src sample q0 864 @* 865 @* @param[in] r1 - src_strd 866 @* Source stride 867 @* 868 @* @param[in] r2 - alpha_cb 869 @* Alpha Value for the boundary in U 870 @* 871 @* @param[in] r3 - beta_cb 872 @* Beta Value for the boundary in U 873 @* 874 @* @param[in] sp(0) - alpha_cr 875 @* Alpha Value for the boundary in V 876 @* 877 @* @param[in] sp(4) - beta_cr 878 @* Beta Value for the boundary in V 879 @* 880 @* @param[in] sp(8) - u4_bs 881 @* Packed Boundary strength array 882 @* 883 @* @param[in] sp(12) - pu1_cliptab_cb 884 @* tc0_table for U 885 @* 886 @* @param[in] sp(16) - pu1_cliptab_cr 887 @* tc0_table for V 888 @* 889 @* @returns 890 @* None 891 @* 892 @* @remarks 893 @* None 894 @* 895 @******************************************************************************* 896 @* 897 898 .global ih264_deblk_chroma_horz_bslt4_a9 899 900 ih264_deblk_chroma_horz_bslt4_a9: 901 902 stmfd sp!, {r4-r9, lr} @ 903 904 ldrd r4, r5, [sp, #28] @R4 = alpha_cr , R5 = beta_cr 905 ldr r7, [sp, #36] @R7 = u4_bs 906 ldrd r8, r9, [sp, #40] @R8 = pu1_cliptab_cb , R9 = pu1_cliptab_cr 907 sub r0, r0, r1, lsl #1 @R0 = uc_edgePixelU pointing to p1 of chroma U 908 vpush {d8 - d15} 909 rev r7, r7 @ 910 vmov.32 d12[0], r7 @D12[0] = ui_Bs 911 912 vld1.32 d16[0], [r8] @D16[0] contains cliptab_cb 913 vld1.32 d17[0], [r9] @D17[0] contains cliptab_cr 914 vld2.8 {d6, d7}, [r0], r1 @Q3=p1 915 vtbl.8 d14, {d16}, d12 @Retreiving cliptab values for U 916 vtbl.8 d28, {d17}, d12 @Retrieving cliptab values for V 917 vmovl.u8 q6, d12 @Q6 = uc_Bs in each 16 bit scalar 918 mov r6, r0 @Keeping a backup of the pointer to chroma U P0 919 vld2.8 {d4, d5}, [r0], r1 @Q2=p0 920 vmov.i8 d30, #1 @ 921 vdup.8 d20, r2 @D20 contains alpha_cb 922 vdup.8 d21, r4 @D21 contains alpha_cr 923 vld2.8 {d0, d1}, [r0], r1 @Q0=q0 924 vmovl.u8 q7, d14 @ 925 vmovl.u8 q14, d28 @ 926 vmov.i16 d15, d28 @D14 has cliptab values for U, D15 for V 927 vld2.8 {d2, d3}, [r0] @Q1=q1 928 vsubl.u8 q5, d1, d5 @ 929 vsubl.u8 q4, d0, d4 @Q5,Q4 = (q0 - p0) 930 vabd.u8 q13, q3, q2 @Q13 = ABS(p1 - p0) 931 vshl.i16 q5, q5, #2 @Q5 = (q0 - p0)<<2 932 vabd.u8 q11, q2, q0 @Q11 = ABS(p0 - q0) 933 vshl.i16 q4, q4, #2 @Q4 = (q0 - p0)<<2 934 vsli.16 q7, q7, #8 @ 935 vabd.u8 q12, q1, q0 @Q12 = ABS(q1 - q0) 936 vcge.u8 q9, q11, q10 @Q9 = ( ABS(p0 - q0) >= Alpha ) 937 vsubl.u8 q10, d6, d2 @Q10 = (p1 - q1)L 938 vsubl.u8 q3, d7, d3 @Q3 = (p1 - q1)H 939 vdup.8 d16, r3 @Q8 contains beta_cb 940 vdup.8 d17, r5 @Q8 contains beta_cr 941 vadd.i16 q4, q4, q10 @ 942 vadd.i16 q5, q5, q3 @Q5,Q4 = [ (q0 - p0)<<2 ] + (p1 - q1) 943 vcge.u8 q12, q12, q8 @Q12= ( ABS(q1 - q0) >= Beta ) 944 vcgt.s16 d12, d12, #0 @Q6 = (us_Bs > 0) 945 vqrshrn.s16 d8, q4, #3 @ 946 vqrshrn.s16 d9, q5, #3 @Q4 = i_macro = (((q0 - p0)<<2) + (p1 - q1) + 4)>>3 947 vadd.i8 d14, d14, d30 @D14 = C = C0+1 for U 948 vcge.u8 q13, q13, q8 @Q13= ( ABS(p1 - p0) >= Beta ) 949 vorr q9, q9, q12 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) 950 vabs.s8 q3, q4 @Q4 = ABS (i_macro) 951 vadd.i8 d15, d15, d30 @D15 = C = C0+1 for V 952 vmov.i8 d13, d12 @ 953 vorr q9, q9, q13 @Q9 = ( ABS(p0 - q0) >= Alpha ) | ( ABS(q1 - q0) >= Beta ) | ( ABS(p1 - p0) >= Beta ) 954 vmin.u8 q7, q3, q7 @Q7 = delta = (ABS(i_macro) > C) ? C : ABS(i_macro) 955 vbic q6, q6, q9 @final condition 956 vcge.s8 q4, q4, #0 @Q4 = (i_macro >= 0) 957 vand q7, q7, q6 @Making delta zero in places where values shouldn be filterd 958 vqadd.u8 q8, q2, q7 @Q8 = p0 + delta 959 vqsub.u8 q2, q2, q7 @Q2 = p0 - delta 960 vqadd.u8 q9, q0, q7 @Q9 = q0 + delta 961 vqsub.u8 q0, q0, q7 @Q0 = q0 - delta 962 vbif q8, q2, q4 @Q8 = (i_macro >= 0 ) ? (p0+delta) : (p0-delta) 963 vbif q0, q9, q4 @Q0 = (i_macro >= 0 ) ? (q0-delta) : (q0+delta) 964 vst2.8 {d16, d17}, [r6], r1 @ 965 vst2.8 {d0, d1}, [r6] @ 966 vpop {d8 - d15} 967 ldmfd sp!, {r4-r9, pc} @ 968 969 970 971 @** 972 @******************************************************************************* 973 @* 974 @* @brief 975 @* Performs filtering of a chroma block vertical edge for cases where the 976 @* boundary strength is less than 4 in high profile 977 @* 978 @* @par Description: 979 @* This operation is described in Sec. 8.7.2.4 under the title 980 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 981 @* 982 @* @param[in] r0 - pu1_src 983 @* Pointer to the src sample q0 984 @* 985 @* @param[in] r1 - src_strd 986 @* Source stride 987 @* 988 @* @param[in] r2 - alpha_cb 989 @* Alpha Value for the boundary in U 990 @* 991 @* @param[in] r3 - beta_cb 992 @* Beta Value for the boundary in U 993 @* 994 @* @param[in] sp(0) - alpha_cr 995 @* Alpha Value for the boundary in V 996 @* 997 @* @param[in] sp(4) - beta_cr 998 @* Beta Value for the boundary in V 999 @* 1000 @* @param[in] sp(8) - u4_bs 1001 @* Packed Boundary strength array 1002 @* 1003 @* @param[in] sp(12) - pu1_cliptab_cb 1004 @* tc0_table for U 1005 @* 1006 @* @param[in] sp(16) - pu1_cliptab_cr 1007 @* tc0_table for V 1008 @* 1009 @* @returns 1010 @* None 1011 @* 1012 @* @remarks 1013 @* None 1014 @* 1015 @******************************************************************************* 1016 @* 1017 1018 .global ih264_deblk_chroma_vert_bslt4_a9 1019 1020 ih264_deblk_chroma_vert_bslt4_a9: 1021 1022 stmfd sp!, {r4-r7, r10-r12, r14} 1023 1024 sub r0, r0, #4 @point r0 to p1u of row0. 1025 ldrd r4, r5, [sp, #32] @R4 = alpha_cr , R5 = beta_cr 1026 add r2, r2, r4, lsl #8 1027 add r3, r3, r5, lsl #8 1028 ldr r6, [sp, #40] @R6 = u4_bs 1029 ldrd r10, r11, [sp, #44] @R10 = pu1_cliptab_cb , R11 = pu1_cliptab_cr 1030 vpush {d8 - d15} 1031 mov r12, r0 @keep a back up of R0 for buffer write 1032 1033 vld4.16 {d0[0], d2[0], d4[0], d6[0]}, [r0], r1 1034 vld4.16 {d0[1], d2[1], d4[1], d6[1]}, [r0], r1 1035 vld4.16 {d0[2], d2[2], d4[2], d6[2]}, [r0], r1 1036 vld4.16 {d0[3], d2[3], d4[3], d6[3]}, [r0], r1 1037 1038 vld4.16 {d1[0], d3[0], d5[0], d7[0]}, [r0], r1 1039 vld4.16 {d1[1], d3[1], d5[1], d7[1]}, [r0], r1 1040 vld4.16 {d1[2], d3[2], d5[2], d7[2]}, [r0], r1 1041 vld4.16 {d1[3], d3[3], d5[3], d7[3]}, [r0], r1 1042 1043 1044 vdup.16 q11, r2 @Q11 = alpha 1045 vabd.u8 q4, q1, q2 @|p0-q0| 1046 vdup.16 q12, r3 @Q12 = beta 1047 vabd.u8 q5, q3, q2 @|q1-q0| 1048 vabd.u8 q6, q0, q1 @|p1-p0| 1049 vclt.u8 q4, q4, q11 @|p0-q0| < alpha ? 1050 vsubl.u8 q7, d0, d6 1051 vclt.u8 q5, q5, q12 @|q1-q0| < beta ? 1052 vsubl.u8 q8, d1, d7 @(p1 - q1) 1053 vclt.u8 q6, q6, q12 @|p1-p0| < beta ? 1054 vsubl.u8 q9, d4, d2 1055 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta 1056 vsubl.u8 q10, d5, d3 @(q0 - p0) 1057 vmov.u16 q14, #4 1058 vld1.32 {d24[0]}, [r10] @Load ClipTable for U 1059 vld1.32 {d25[0]}, [r11] @Load ClipTable for V 1060 rev r6, r6 @Blocking strengths 1061 vand.u8 q4, q4, q6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 1062 1063 vmov.32 d10[0], r6 1064 1065 vmla.s16 q7, q9, q14 1066 vmla.s16 q8, q10, q14 @4*(q0 - p0) + (p1 - q1) 1067 1068 vmovl.u8 q5, d10 1069 vsli.u16 d10, d10, #8 1070 vtbl.8 d12, {d24}, d10 @tC0 for U 1071 vtbl.8 d13, {d25}, d10 @tC0 for V 1072 vzip.8 d12, d13 1073 vmovl.u16 q5, d10 1074 vsli.u32 q5, q5, #16 1075 vmov.u8 q12, #1 1076 vadd.u8 q6, q6, q12 @tC0 + 1 1077 vcge.u8 q5, q5, q12 @u4_bS > 0 ? 1078 vand.u8 q4, q4, q5 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0 1079 1080 @ Q0 - Q3(inputs), 1081 @ Q4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0), 1082 @ Q6 (tC) 1083 1084 vrshr.s16 q7, q7, #3 1085 vrshr.s16 q8, q8, #3 @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) 1086 1087 vcgt.s16 q9, q7, #0 1088 vcgt.s16 q10, q8, #0 1089 vmovn.i16 d18, q9 1090 vmovn.i16 d19, q10 @Q9 = sign(delta) 1091 vabs.s16 q7, q7 1092 vabs.s16 q8, q8 1093 vmovn.u16 d14, q7 1094 vmovn.u16 d15, q8 1095 vmin.u8 q7, q7, q6 @Q7 = |delta| 1096 1097 vqadd.u8 q10, q1, q7 @p0+|delta| 1098 vqadd.u8 q11, q2, q7 @q0+|delta| 1099 vqsub.u8 q12, q1, q7 @p0-|delta| 1100 vqsub.u8 q13, q2, q7 @q0-|delta| 1101 1102 vbit q12, q10, q9 @p0 + delta 1103 vbit q11, q13, q9 @q0 - delta 1104 1105 vbit q1, q12, q4 1106 vbit q2, q11, q4 1107 1108 vst4.16 {d0[0], d2[0], d4[0], d6[0]}, [r12], r1 1109 vst4.16 {d0[1], d2[1], d4[1], d6[1]}, [r12], r1 1110 vst4.16 {d0[2], d2[2], d4[2], d6[2]}, [r12], r1 1111 vst4.16 {d0[3], d2[3], d4[3], d6[3]}, [r12], r1 1112 1113 vst4.16 {d1[0], d3[0], d5[0], d7[0]}, [r12], r1 1114 vst4.16 {d1[1], d3[1], d5[1], d7[1]}, [r12], r1 1115 vst4.16 {d1[2], d3[2], d5[2], d7[2]}, [r12], r1 1116 vst4.16 {d1[3], d3[3], d5[3], d7[3]}, [r12], r1 1117 vpop {d8 - d15} 1118 ldmfd sp!, {r4-r7, r10-r12, pc} 1119 1120 1121 1122 @** 1123 @******************************************************************************* 1124 @* 1125 @* @brief 1126 @* Performs filtering of a chroma block vertical edge when the 1127 @* boundary strength is set to 4 on calling twice in high profile 1128 @* 1129 @* @par Description: 1130 @* This operation is described in Sec. 8.7.2.4 under the title 1131 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 1132 @* 1133 @* @param[in] r0 - pu1_src 1134 @* Pointer to the src sample q0 1135 @* 1136 @* @param[in] r1 - src_strd 1137 @* Source stride 1138 @* 1139 @* @param[in] r2 - alpha_cb 1140 @* Alpha Value for the boundary in U 1141 @* 1142 @* @param[in] r3 - beta_cb 1143 @* Beta Value for the boundary in U 1144 @* 1145 @* @param[in] sp(0) - alpha_cr 1146 @* Alpha Value for the boundary in V 1147 @* 1148 @* @param[in] sp(4) - beta_cr 1149 @* Beta Value for the boundary in V 1150 @* 1151 @* @returns 1152 @* None 1153 @* 1154 @* @remarks 1155 @* None 1156 @* 1157 @******************************************************************************* 1158 @* 1159 1160 .global ih264_deblk_chroma_vert_bs4_mbaff_a9 1161 1162 ih264_deblk_chroma_vert_bs4_mbaff_a9: 1163 1164 stmfd sp!, {r4, r5, r12, r14} 1165 1166 sub r0, r0, #4 @point r0 to p1u of row0. 1167 mov r12, r0 @keep a back up of r0 for buffer write 1168 ldrd r4, r5, [sp, #16] @R4 = alpha_cr , R5 = beta_cr 1169 add r2, r2, r4, lsl #8 1170 add r3, r3, r5, lsl #8 1171 vpush {d8 - d15} 1172 vld4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0], r1 1173 vld4.16 {d0[1], d1[1], d2[1], d3[1]}, [r0], r1 1174 vld4.16 {d0[2], d1[2], d2[2], d3[2]}, [r0], r1 1175 vld4.16 {d0[3], d1[3], d2[3], d3[3]}, [r0], r1 1176 1177 vdup.16 d11, r2 @D11 = alpha 1178 vdup.16 d12, r3 @D12 = beta 1179 vmov.i8 d31, #2 1180 1181 vabd.u8 d4, d1, d2 @|p0-q0| 1182 vabd.u8 d5, d3, d2 @|q1-q0| 1183 vabd.u8 d6, d0, d1 @|p1-p0| 1184 vaddl.u8 q14, d1, d3 @(p0 + q1) 1185 vclt.u8 d4, d4, d11 @|p0-q0| < alpha ? 1186 vclt.u8 d5, d5, d12 @|q1-q0| < beta ? 1187 vclt.u8 d6, d6, d12 @|p1-p0| < beta ? 1188 vmlal.u8 q14, d0, d31 @2*p1 + (p0 + q1) 1189 vaddl.u8 q13, d0, d2 @(p1 + q0) 1190 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta 1191 vmlal.u8 q13, d3, d31 @2*q1 + (p1 + q0) 1192 1193 vrshrn.i16 d7, q14, #2 @(2*p1 + (p0 + q1) + 2) >> 2 1194 vand.u8 d4, d4, d6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 1195 vrshrn.i16 d9, q13, #2 @(2*q1 + (p1 + q0) + 2) >> 2 1196 1197 vbit d1, d7, d4 1198 vbit d2, d9, d4 1199 1200 vst4.16 {d0[0], d1[0], d2[0], d3[0]}, [r12], r1 1201 vst4.16 {d0[1], d1[1], d2[1], d3[1]}, [r12], r1 1202 vst4.16 {d0[2], d1[2], d2[2], d3[2]}, [r12], r1 1203 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r12], r1 1204 vpop {d8 - d15} 1205 ldmfd sp!, {r4, r5, r12, pc} 1206 1207 1208 1209 @** 1210 @******************************************************************************* 1211 @* 1212 @* @brief 1213 @* Performs filtering of a chroma block vertical edge for cases where the 1214 @* boundary strength is less than 4 on calling twice in high profile 1215 @* 1216 @* @par Description: 1217 @* This operation is described in Sec. 8.7.2.4 under the title 1218 @* "Filtering process for edges for bS equal to 4" in ITU T Rec H.264. 1219 @* 1220 @* @param[in] r0 - pu1_src 1221 @* Pointer to the src sample q0 1222 @* 1223 @* @param[in] r1 - src_strd 1224 @* Source stride 1225 @* 1226 @* @param[in] r2 - alpha_cb 1227 @* Alpha Value for the boundary in U 1228 @* 1229 @* @param[in] r3 - beta_cb 1230 @* Beta Value for the boundary in U 1231 @* 1232 @* @param[in] sp(0) - alpha_cr 1233 @* Alpha Value for the boundary in V 1234 @* 1235 @* @param[in] sp(4) - beta_cr 1236 @* Beta Value for the boundary in V 1237 @* 1238 @* @param[in] sp(8) - u4_bs 1239 @* Packed Boundary strength array 1240 @* 1241 @* @param[in] sp(12) - pu1_cliptab_cb 1242 @* tc0_table for U 1243 @* 1244 @* @param[in] sp(16) - pu1_cliptab_cr 1245 @* tc0_table for V 1246 @* 1247 @* @returns 1248 @* None 1249 @* 1250 @* @remarks 1251 @* None 1252 @* 1253 @******************************************************************************* 1254 @* 1255 1256 .global ih264_deblk_chroma_vert_bslt4_mbaff_a9 1257 1258 ih264_deblk_chroma_vert_bslt4_mbaff_a9: 1259 1260 stmfd sp!, {r4-r6, r10-r12, r14} 1261 1262 sub r0, r0, #4 @point r0 to p1u of row0. 1263 mov r12, r0 @keep a back up of r0 for buffer write 1264 1265 ldrd r4, r5, [sp, #28] @R4 = alpha_cr , R5 = beta_cr 1266 add r2, r2, r4, lsl #8 1267 add r3, r3, r5, lsl #8 1268 ldr r6, [sp, #36] @R6 = u4_bs 1269 ldrd r10, r11, [sp, #40] @R10 = pu1_cliptab_cb , R11 = pu1_cliptab_cr 1270 vpush {d8 - d15} 1271 vld4.16 {d0[0], d1[0], d2[0], d3[0]}, [r0], r1 1272 vld4.16 {d0[1], d1[1], d2[1], d3[1]}, [r0], r1 1273 vld4.16 {d0[2], d1[2], d2[2], d3[2]}, [r0], r1 1274 vld4.16 {d0[3], d1[3], d2[3], d3[3]}, [r0], r1 1275 1276 vdup.16 d11, r2 @D11 = alpha 1277 vabd.u8 d4, d1, d2 @|p0-q0| 1278 vdup.16 d12, r3 @D12 = beta 1279 vabd.u8 d5, d3, d2 @|q1-q0| 1280 vabd.u8 d6, d0, d1 @|p1-p0| 1281 vclt.u8 d4, d4, d11 @|p0-q0| < alpha ? 1282 vclt.u8 d5, d5, d12 @|q1-q0| < beta ? 1283 vsubl.u8 q14, d0, d3 @(p1 - q1) 1284 vclt.u8 d6, d6, d12 @|p1-p0| < beta ? 1285 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta 1286 vsubl.u8 q12, d2, d1 @(q0 - p0) 1287 vmov.u16 q10, #4 1288 1289 vld1.32 {d31[1]}, [r10] @Load ClipTable for U 1290 vld1.32 {d31[0]}, [r11] @Load ClipTable for V 1291 rev r6, r6 @Blocking strengths 1292 vand.u8 d4, d4, d6 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta 1293 vmov.32 d22[0], r6 1294 vmla.s16 q14, q12, q10 @4*(q0 - p0) + (p1 - q1) 1295 vmovl.u8 q11, d22 1296 vsli.u16 d22, d22, #8 1297 vmov.u16 d13, #4 1298 vadd.u8 d22, d22, d13 1299 vtbl.8 d6, {d31}, d22 @tC0 1300 vmov.u8 d12, #1 1301 vsub.u8 d22, d22, d13 1302 vadd.u8 d6, d6, d12 @tC0 + 1 1303 vcge.u8 d5, d22, d12 @u4_bS > 0 ? 1304 vand.u8 d4, d4, d5 @|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0 1305 1306 @ D0 - D3(inputs), 1307 @ D4 (|p0-q0| < alpha && |q1-q0| < beta && |p1-p0| < beta && u4_bs != 0), 1308 @ D6 (tC) 1309 1310 vrshr.s16 q14, q14, #3 @(((q0 - p0) << 2) + (p1 - q1) + 4) >> 3) 1311 1312 vcgt.s16 q13, q14, #0 1313 vmovn.i16 d9, q13 @D9 = sign(delta) 1314 vabs.s16 q14, q14 1315 vmovn.u16 d7, q14 1316 vmin.u8 d7, d7, d6 @D7 = |delta| 1317 1318 vqadd.u8 d10, d1, d7 @p0+|delta| 1319 vqadd.u8 d11, d2, d7 @q0+|delta| 1320 vqsub.u8 d12, d1, d7 @p0-|delta| 1321 vqsub.u8 d13, d2, d7 @q0-|delta| 1322 1323 vbit d12, d10, d9 @p0 + delta 1324 vbit d11, d13, d9 @q0 - delta 1325 1326 vbit d1, d12, d4 1327 vbit d2, d11, d4 1328 1329 vst4.16 {d0[0], d1[0], d2[0], d3[0]}, [r12], r1 1330 vst4.16 {d0[1], d1[1], d2[1], d3[1]}, [r12], r1 1331 vst4.16 {d0[2], d1[2], d2[2], d3[2]}, [r12], r1 1332 vst4.16 {d0[3], d1[3], d2[3], d3[3]}, [r12], r1 1333 vpop {d8 - d15} 1334 ldmfd sp!, {r4-r6, r10-r12, pc} 1335 1336 1337 1338