]> git.sesse.net Git - x264/blobdiff - common/arm/deblock-a.S
arm: Implement chroma intra deblock
[x264] / common / arm / deblock-a.S
index 9c505f69131ebd22aac6e18169d1a5e08b0825d7..a3def9f6e854467c524432d5efd2e9555ccc27c9 100644 (file)
@@ -1,9 +1,10 @@
 /*****************************************************************************
  * deblock.S: arm deblocking
  *****************************************************************************
- * Copyright (C) 2009-2012 x264 project
+ * Copyright (C) 2009-2015 x264 project
  *
  * Authors: Mans Rullgard <mans@mansr.com>
+ *          Martin Storsjo <martin@martin.st>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +26,6 @@
 
 #include "asm.S"
 
-.fpu neon
-
 .macro h264_loop_filter_start
     ldr             ip,  [sp]
     ldr             ip,  [ip]
@@ -142,7 +141,7 @@ function x264_deblock_v_luma_neon
 
     align_pop_regs
     bx              lr
-.endfunc
+endfunc
 
 function x264_deblock_h_luma_neon
     h264_loop_filter_start
@@ -194,7 +193,7 @@ function x264_deblock_h_luma_neon
 
     align_pop_regs
     bx              lr
-.endfunc
+endfunc
 
 .macro h264_loop_filter_chroma
     vdup.8          q11, r2         // alpha
@@ -207,11 +206,13 @@ function x264_deblock_h_luma_neon
     vshl.i16        q2,  q2,  #2
     vshl.i16        q3,  q3,  #2
     vabd.u8         q15, q1,  q0    // abs(q1 - q0)
+    vmovl.u8        q12, d24
     vaddw.u8        q2,  q2,  d18
     vaddw.u8        q3,  q3,  d19
     vclt.u8         q13, q13, q11   // < alpha
     vsubw.u8        q2,  q2,  d2
     vsubw.u8        q3,  q3,  d3
+    vsli.16         q12, q12, #8
     vdup.8          q11, r3         // beta
     vclt.s8         q10, q12, #0
     vrshrn.i16      d4,  q2,  #3
@@ -242,24 +243,183 @@ function x264_deblock_h_luma_neon
 function x264_deblock_v_chroma_neon
     h264_loop_filter_start
 
+    sub             r0,  r0,  r1, lsl #1
+    vld1.8          {d18,d19}, [r0,:128], r1
+    vld1.8          {d16,d17}, [r0,:128], r1
+    vld1.8          {d0, d1},  [r0,:128], r1
+    vld1.8          {d2, d3},  [r0,:128]
+
+    h264_loop_filter_chroma
+
+    sub             r0,  r0,  r1, lsl #1
+    vst1.8          {d16,d17}, [r0,:128], r1
+    vst1.8          {d0, d1},  [r0,:128], r1
+
+    bx              lr
+endfunc
+
+function x264_deblock_h_chroma_neon
+    h264_loop_filter_start
+
+    sub             r0,  r0,  #4
+deblock_h_chroma:
+    vld1.8          {d18}, [r0], r1
+    vld1.8          {d16}, [r0], r1
+    vld1.8          {d0},  [r0], r1
+    vld1.8          {d2},  [r0], r1
+    vld1.8          {d19}, [r0], r1
+    vld1.8          {d17}, [r0], r1
+    vld1.8          {d1},  [r0], r1
+    vld1.8          {d3},  [r0], r1
+
+    TRANSPOSE4x4_16 q9, q8, q0, q1
+
+    h264_loop_filter_chroma
+
+    vtrn.16         q8,  q0
+
+    sub             r0,  r0,  r1, lsl #3
+    add             r0,  r0,  #2
+    vst1.32         {d16[0]}, [r0], r1
+    vst1.32         {d0[0]},  [r0], r1
+    vst1.32         {d16[1]}, [r0], r1
+    vst1.32         {d0[1]},  [r0], r1
+    vst1.32         {d17[0]}, [r0], r1
+    vst1.32         {d1[0]},  [r0], r1
+    vst1.32         {d17[1]}, [r0], r1
+    vst1.32         {d1[1]},  [r0], r1
+
+    bx              lr
+endfunc
+
+function x264_deblock_h_chroma_422_neon
+    h264_loop_filter_start
+    push            {lr}
+    sub             r0,  r0,  #4
+    add             r1,  r1,  r1
+    bl              deblock_h_chroma
+    ldr             ip,  [sp, #4]
+    ldr             ip,  [ip]
+    vdup.32         d24, ip
+    sub             r0,  r0,  r1, lsl #3
+    add             r0,  r0,  r1, lsr #1
+    sub             r0,  r0,  #2
+    pop             {lr}
+    b               deblock_h_chroma
+endfunc
+
+.macro h264_loop_filter_chroma8
+    vdup.8          d22, r2         @ alpha
+    vmovl.u8        q12, d24
+    vabd.u8         d26, d16, d0    @ abs(p0 - q0)
+    vabd.u8         d28, d18, d16   @ abs(p1 - p0)
+    vsubl.u8        q2,  d0,  d16
+    vsli.16         d24, d24, #8
+    vshl.i16        q2,  q2,  #2
+    vabd.u8         d30, d2,  d0    @ abs(q1 - q0)
+    vaddw.u8        q2,  q2,  d18
+    vclt.u8         d26, d26, d22   @ < alpha
+    vsubw.u8        q2,  q2,  d2
+    vdup.8          d22, r3         @ beta
+    vclt.s8         d20, d24, #0
+    vrshrn.i16      d4,  q2,  #3
+    vclt.u8         d28, d28, d22   @ < beta
+    vbic            d26, d26, d20
+    vclt.u8         d30, d30, d22   @ < beta
+    vand            d26, d26, d28
+    vneg.s8         d20, d24
+    vand            d26, d26, d30
+    vmin.s8         d4,  d4,  d24
+    vmovl.u8        q14, d16
+    vand            d4,  d4,  d26
+    vmax.s8         d4,  d4,  d20
+    vmovl.u8        q11, d0
+    vaddw.s8        q14, q14, d4
+    vsubw.s8        q11, q11, d4
+    vqmovun.s16     d16, q14
+    vqmovun.s16     d0,  q11
+.endm
+
+function x264_deblock_h_chroma_mbaff_neon
+    h264_loop_filter_start
+
+    sub             r0,  r0,  #4
+    vld1.8          {d18}, [r0], r1
+    vld1.8          {d16}, [r0], r1
+    vld1.8          {d0},  [r0], r1
+    vld1.8          {d2},  [r0], r1
+
+    TRANSPOSE4x4_16 d18, d16, d0, d2
+
+    h264_loop_filter_chroma8
+
+    vtrn.16         d16, d0
+
+    sub             r0,  r0,  r1, lsl #2
+    add             r0,  r0,  #2
+    vst1.32         {d16[0]}, [r0], r1
+    vst1.32         {d0[0]},  [r0], r1
+    vst1.32         {d16[1]}, [r0], r1
+    vst1.32         {d0[1]},  [r0]
+
+    bx              lr
+endfunc
+
+.macro h264_loop_filter_chroma_intra, width=16
+    vdup.8          q11, r2         @ alpha
+    vabd.u8         q13, q8,  q0    @ abs(p0 - q0)
+    vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
+    vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
+    vclt.u8         q13, q13, q11   @ < alpha
+    vdup.8          q11, r3         @ beta
+    vclt.u8         q14, q14, q11   @ < beta
+    vclt.u8         q15, q15, q11   @ < beta
+    vand            q13, q13, q14
+    vand            q13, q13, q15
+
+    vshll.u8        q14, d18, #1
+    vshll.u8        q2,  d2,  #1
+.ifc \width, 16
+    vshll.u8        q15, d19, #1
+    vshll.u8        q3,  d3,  #1
+    vaddl.u8        q12, d17, d3
+    vaddl.u8        q10, d1,  d19
+.endif
+    vaddl.u8        q11, d16, d2
+    vaddl.u8        q1,  d18, d0    @ or vaddw q2, to not clobber q1
+    vadd.u16        q14, q14, q11
+    vadd.u16        q2,  q2,  q1
+.ifc \width, 16
+    vadd.u16        q15, q15, q12
+    vadd.u16        q3,  q3,  q10
+.endif
+    vqrshrn.u16     d28, q14, #2
+    vqrshrn.u16     d4,  q2, #2
+.ifc \width, 16
+    vqrshrn.u16     d29, q15, #2
+    vqrshrn.u16     d5,  q3, #2
+.endif
+    vbit            q8,  q14, q13
+    vbit            q0,  q2,  q13
+.endm
+
+function x264_deblock_v_chroma_intra_neon
     sub             r0,  r0,  r1, lsl #1
     vld2.8          {d18,d19}, [r0,:128], r1
     vld2.8          {d16,d17}, [r0,:128], r1
     vld2.8          {d0, d1},  [r0,:128], r1
     vld2.8          {d2, d3},  [r0,:128]
 
-    h264_loop_filter_chroma
+    h264_loop_filter_chroma_intra
 
     sub             r0,  r0,  r1, lsl #1
     vst2.8          {d16,d17}, [r0,:128], r1
     vst2.8          {d0, d1},  [r0,:128], r1
 
     bx              lr
-.endfunc
-
-function x264_deblock_h_chroma_neon
-    h264_loop_filter_start
+endfunc
 
+function x264_deblock_h_chroma_intra_neon
     sub             r0,  r0,  #4
     vld1.8          {d18}, [r0], r1
     vld1.8          {d16}, [r0], r1
@@ -270,37 +430,159 @@ function x264_deblock_h_chroma_neon
     vld1.8          {d1},  [r0], r1
     vld1.8          {d3},  [r0], r1
 
-    vuzp.8          d18, d19
-    vuzp.8          d16, d17
-    vuzp.8          d0,  d1
-    vuzp.8          d2,  d3
+    TRANSPOSE4x4_16 q9, q8, q0, q1
 
-    vtrn.16         q9,  q0
-    vtrn.16         q8,  q1
-    vtrn.8          q9,  q8
-    vtrn.8          q0,  q1
+    h264_loop_filter_chroma_intra
 
-    h264_loop_filter_chroma
+    vtrn.16         q8,  q0
 
-    vtrn.16         q9,  q0
-    vtrn.16         q8,  q1
-    vtrn.8          q9,  q8
-    vtrn.8          q0,  q1
+    sub             r0,  r0,  r1, lsl #3
+    add             r0,  r0,  #2
+    vst1.32         {d16[0]}, [r0], r1
+    vst1.32         {d0[0]},  [r0], r1
+    vst1.32         {d16[1]}, [r0], r1
+    vst1.32         {d0[1]},  [r0], r1
+    vst1.32         {d17[0]}, [r0], r1
+    vst1.32         {d1[0]},  [r0], r1
+    vst1.32         {d17[1]}, [r0], r1
+    vst1.32         {d1[1]},  [r0], r1
 
-    vzip.8          d18, d19
-    vzip.8          d16, d17
-    vzip.8          d0,  d1
-    vzip.8          d2,  d3
+    bx              lr
+endfunc
 
-    sub             r0,  r0,  r1, lsl #3
-    vst1.8          {d18}, [r0], r1
-    vst1.8          {d16}, [r0], r1
-    vst1.8          {d0},  [r0], r1
-    vst1.8          {d2},  [r0], r1
-    vst1.8          {d19}, [r0], r1
-    vst1.8          {d17}, [r0], r1
-    vst1.8          {d1},  [r0], r1
-    vst1.8          {d3},  [r0], r1
+function x264_deblock_h_chroma_422_intra_neon
+    push            {lr}
+    bl              X(x264_deblock_h_chroma_intra_neon)
+    add             r0, r0,  #2
+    pop             {lr}
+    b               X(x264_deblock_h_chroma_intra_neon)
+endfunc
 
+function x264_deblock_h_chroma_intra_mbaff_neon
+    sub             r0,  r0,  #4
+    vld1.8          {d18}, [r0], r1
+    vld1.8          {d16}, [r0], r1
+    vld1.8          {d0},  [r0], r1
+    vld1.8          {d2},  [r0], r1
+
+    TRANSPOSE4x4_16 d18, d16, d0, d2
+
+    h264_loop_filter_chroma_intra width=8
+
+    vtrn.16         d16, d0
+
+    sub             r0,  r0,  r1, lsl #2
+    add             r0,  r0,  #2
+    vst1.32         {d16[0]}, [r0], r1
+    vst1.32         {d0[0]},  [r0], r1
+    vst1.32         {d16[1]}, [r0], r1
+    vst1.32         {d0[1]},  [r0]
+
+    bx              lr
+endfunc
+
+function x264_deblock_strength_neon
+    ldr             ip,  [sp]
+    vmov.i8         q8,  #0
+    lsl             ip,  ip,  #8
+    add             r3,  r3,  #32
+    sub             ip,  ip,  #(1<<8)-3
+    vmov.i8         q9,  #0
+    vdup.16         q10, ip
+    ldr             ip,  [sp, #4]
+
+lists:
+    @ load bytes ref
+    vld1.8          {d31}, [r1]!
+    add             r2,  r2,  #16
+    vld1.8          {q1},  [r1]!
+    vmov.i8         q0,  #0
+    vld1.8          {q2},  [r1]!
+    vext.8          q3,  q0,  q1,  #15
+    vext.8          q0,  q0,  q2,  #15
+    vuzp.32         q1,  q2
+    vuzp.32         q3,  q0
+    vext.8          q1,  q15, q2,  #12
+
+    veor            q0,  q0,  q2
+    veor            q1,  q1,  q2
+    vorr            q8,  q8,  q0
+    vorr            q9,  q9,  q1
+
+    vld1.16         {q11}, [r2,:128]!   @ mv + 0x10
+    vld1.16         {q3},  [r2,:128]!   @ mv + 0x20
+    vld1.16         {q12}, [r2,:128]!   @ mv + 0x30
+    vld1.16         {q2},  [r2,:128]!   @ mv + 0x40
+    vld1.16         {q13}, [r2,:128]!   @ mv + 0x50
+    vext.8          q3,  q3,  q12, #12
+    vext.8          q2,  q2,  q13, #12
+    vabd.s16        q0,  q12, q3
+    vld1.16         {q3},  [r2,:128]!   @ mv + 0x60
+    vabd.s16        q1,  q13, q2
+    vld1.16         {q14}, [r2,:128]!   @ mv + 0x70
+    vqmovn.u16      d0,  q0
+    vld1.16         {q2},  [r2,:128]!   @ mv + 0x80
+    vld1.16         {q15}, [r2,:128]!   @ mv + 0x90
+    vqmovn.u16      d1,  q1
+    vext.8          q3,  q3,  q14, #12
+    vext.8          q2,  q2,  q15, #12
+    vabd.s16        q3,  q14, q3
+    vabd.s16        q2,  q15, q2
+    vqmovn.u16      d2,  q3
+    vqmovn.u16      d3,  q2
+
+    vqsub.u8        q0,  q0,  q10
+    vqsub.u8        q1,  q1,  q10
+    vqmovn.u16      d0,  q0
+    vqmovn.u16      d1,  q1
+
+    vabd.s16        q1,  q12, q13
+    vorr            q8,  q8,  q0
+
+    vabd.s16        q0,  q11, q12
+    vabd.s16        q2,  q13, q14
+    vabd.s16        q3,  q14, q15
+    vqmovn.u16      d0,  q0
+    vqmovn.u16      d1,  q1
+    vqmovn.u16      d2,  q2
+    vqmovn.u16      d3,  q3
+
+    vqsub.u8        q0,  q0,  q10
+    vqsub.u8        q1,  q1,  q10
+    vqmovn.u16      d0,  q0
+    vqmovn.u16      d1,  q1
+    subs            ip,  ip,  #1
+    vorr            q9,  q9,  q0
+    beq             lists
+
+    mov             ip,  #-32
+    @ load bytes nnz
+    vld1.8          {d31}, [r0]!
+    vld1.8          {q1},  [r0]!
+    vmov.i8         q0,  #0
+    vld1.8          {q2},  [r0]
+    vext.8          q3,  q0,  q1,  #15
+    vext.8          q0,  q0,  q2,  #15
+    vuzp.32         q1,  q2
+    vuzp.32         q3,  q0
+    vext.8          q1,  q15, q2,  #12
+
+    vorr            q0,  q0,  q2
+    vorr            q1,  q1,  q2
+    vmov.u8         q10, #1
+    vmin.u8         q0,  q0,  q10
+    vmin.u8         q1,  q1,  q10
+    vmin.u8         q8,  q8,  q10       @ mv ? 1 : 0
+    vmin.u8         q9,  q9,  q10
+    vadd.u8         q0,  q0,  q0        @ nnz ? 2 : 0
+    vadd.u8         q1,  q1,  q1
+    vmax.u8         q8,  q8,  q0
+    vmax.u8         q9,  q9,  q1
+    vzip.16         d16, d17
+    vst1.8          {q9}, [r3,:128], ip @ bs[1]
+    vtrn.8          d16, d17
+    vtrn.32         d16, d17
+
+    vst1.8          {q8}, [r3,:128]     @ bs[0]
     bx              lr
-.endfunc
+endfunc