deblock-a.S
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * deblock.S: h264 encoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2009 x264 project
  5.  *
  6.  * Authors: Mans Rullgard <mans@mansr.com>
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  21.  *****************************************************************************/
  22. #include "asm.S"
  23. .fpu neon
  24. .macro h264_loop_filter_start
  25.     ldr             ip,  [sp]
  26.     ldr             ip,  [ip]
  27.     vmov.32         d24[0], ip
  28.     and             ip,  ip,  ip, lsl #16
  29.     ands            ip,  ip,  ip, lsl #8
  30.     bxlt            lr
  31. .endm
  32. .macro align_push_regs
  33.     and             ip,  sp,  #15
  34.     add             ip,  ip,  #32
  35.     sub             sp,  sp,  ip
  36.     vst1.64         {d12-d15}, [sp,:128]
  37.     sub             sp,  sp,  #32
  38.     vst1.64         {d8-d11},  [sp,:128]
  39. .endm
  40. .macro align_pop_regs
  41.     vld1.64         {d8-d11},  [sp,:128]!
  42.     vld1.64         {d12-d15}, [sp,:128], ip
  43. .endm
  44. .macro h264_loop_filter_luma
  45.     vdup.8          q11, r2         @ alpha
  46.     vmovl.u8        q12, d24
  47.     vabd.u8         q6,  q8,  q0    @ abs(p0 - q0)
  48.     vmovl.u16       q12, d24
  49.     vabd.u8         q14, q9,  q8    @ abs(p1 - p0)
  50.     vsli.16         q12, q12, #8
  51.     vabd.u8         q15, q1,  q0    @ abs(q1 - q0)
  52.     vsli.32         q12, q12, #16
  53.     vclt.u8         q6,  q6,  q11   @ < alpha
  54.     vdup.8          q11, r3         @ beta
  55.     vclt.s8         q7,  q12, #0
  56.     vclt.u8         q14, q14, q11   @ < beta
  57.     vclt.u8         q15, q15, q11   @ < beta
  58.     vbic            q6,  q6,  q7
  59.     vabd.u8         q4,  q10, q8    @ abs(p2 - p0)
  60.     vand            q6,  q6,  q14
  61.     vabd.u8         q5,  q2,  q0    @ abs(q2 - q0)
  62.     vclt.u8         q4,  q4,  q11   @ < beta
  63.     vand            q6,  q6,  q15
  64.     vclt.u8         q5,  q5,  q11   @ < beta
  65.     vand            q4,  q4,  q6
  66.     vand            q5,  q5,  q6
  67.     vand            q12, q12, q6
  68.     vrhadd.u8       q14, q8,  q0
  69.     vsub.i8         q6,  q12, q4
  70.     vqadd.u8        q7,  q9,  q12
  71.     vhadd.u8        q10, q10, q14
  72.     vsub.i8         q6,  q6,  q5
  73.     vhadd.u8        q14, q2,  q14
  74.     vmin.u8         q7,  q7,  q10
  75.     vqsub.u8        q11, q9,  q12
  76.     vqadd.u8        q2,  q1,  q12
  77.     vmax.u8         q7,  q7,  q11
  78.     vqsub.u8        q11, q1,  q12
  79.     vmin.u8         q14, q2,  q14
  80.     vmovl.u8        q2,  d0
  81.     vmax.u8         q14, q14, q11
  82.     vmovl.u8        q10, d1
  83.     vsubw.u8        q2,  q2,  d16
  84.     vsubw.u8        q10, q10, d17
  85.     vshl.i16        q2,  q2,  #2
  86.     vshl.i16        q10, q10, #2
  87.     vaddw.u8        q2,  q2,  d18
  88.     vaddw.u8        q10, q10, d19
  89.     vsubw.u8        q2,  q2,  d2
  90.     vsubw.u8        q10, q10, d3
  91.     vrshrn.i16      d4,  q2,  #3
  92.     vrshrn.i16      d5,  q10, #3
  93.     vbsl            q4,  q7,  q9
  94.     vbsl            q5,  q14, q1
  95.     vneg.s8         q7,  q6
  96.     vmovl.u8        q14, d16
  97.     vmin.s8         q2,  q2,  q6
  98.     vmovl.u8        q6,  d17
  99.     vmax.s8         q2,  q2,  q7
  100.     vmovl.u8        q11, d0
  101.     vmovl.u8        q12, d1
  102.     vaddw.s8        q14, q14, d4
  103.     vaddw.s8        q6,  q6,  d5
  104.     vsubw.s8        q11, q11, d4
  105.     vsubw.s8        q12, q12, d5
  106.     vqmovun.s16     d16, q14
  107.     vqmovun.s16     d17, q6
  108.     vqmovun.s16     d0,  q11
  109.     vqmovun.s16     d1,  q12
  110. .endm
  111. function x264_deblock_v_luma_neon, export=1
  112.     h264_loop_filter_start
  113.     vld1.64         {d0, d1},  [r0,:128], r1
  114.     vld1.64         {d2, d3},  [r0,:128], r1
  115.     vld1.64         {d4, d5},  [r0,:128], r1
  116.     sub             r0,  r0,  r1, lsl #2
  117.     sub             r0,  r0,  r1, lsl #1
  118.     vld1.64         {d20,d21}, [r0,:128], r1
  119.     vld1.64         {d18,d19}, [r0,:128], r1
  120.     vld1.64         {d16,d17}, [r0,:128], r1
  121.     align_push_regs
  122.     h264_loop_filter_luma
  123.     sub             r0,  r0,  r1, lsl #1
  124.     vst1.64         {d8, d9},  [r0,:128], r1
  125.     vst1.64         {d16,d17}, [r0,:128], r1
  126.     vst1.64         {d0, d1},  [r0,:128], r1
  127.     vst1.64         {d10,d11}, [r0,:128]
  128.     align_pop_regs
  129.     bx              lr
  130. .endfunc
  131. function x264_deblock_h_luma_neon, export=1
  132.     h264_loop_filter_start
  133.     sub             r0,  r0,  #4
  134.     vld1.64         {d6},  [r0], r1
  135.     vld1.64         {d20}, [r0], r1
  136.     vld1.64         {d18}, [r0], r1
  137.     vld1.64         {d16}, [r0], r1
  138.     vld1.64         {d0},  [r0], r1
  139.     vld1.64         {d2},  [r0], r1
  140.     vld1.64         {d4},  [r0], r1
  141.     vld1.64         {d26}, [r0], r1
  142.     vld1.64         {d7},  [r0], r1
  143.     vld1.64         {d21}, [r0], r1
  144.     vld1.64         {d19}, [r0], r1
  145.     vld1.64         {d17}, [r0], r1
  146.     vld1.64         {d1},  [r0], r1
  147.     vld1.64         {d3},  [r0], r1
  148.     vld1.64         {d5},  [r0], r1
  149.     vld1.64         {d27}, [r0], r1
  150.     TRANSPOSE8x8    q3, q10, q9, q8, q0, q1, q2, q13
  151.     align_push_regs
  152.     h264_loop_filter_luma
  153.     TRANSPOSE4x4    q4, q8, q0, q5
  154.     sub             r0,  r0,  r1, lsl #4
  155.     add             r0,  r0,  #2
  156.     vst1.32         {d8[0]},  [r0], r1
  157.     vst1.32         {d16[0]}, [r0], r1
  158.     vst1.32         {d0[0]},  [r0], r1
  159.     vst1.32         {d10[0]}, [r0], r1
  160.     vst1.32         {d8[1]},  [r0], r1
  161.     vst1.32         {d16[1]}, [r0], r1
  162.     vst1.32         {d0[1]},  [r0], r1
  163.     vst1.32         {d10[1]}, [r0], r1
  164.     vst1.32         {d9[0]},  [r0], r1
  165.     vst1.32         {d17[0]}, [r0], r1
  166.     vst1.32         {d1[0]},  [r0], r1
  167.     vst1.32         {d11[0]}, [r0], r1
  168.     vst1.32         {d9[1]},  [r0], r1
  169.     vst1.32         {d17[1]}, [r0], r1
  170.     vst1.32         {d1[1]},  [r0], r1
  171.     vst1.32         {d11[1]}, [r0], r1
  172.     align_pop_regs
  173.     bx              lr
  174. .endfunc
  175. .macro h264_loop_filter_chroma
  176.     vdup.8          d22, r2         // alpha
  177.     vmovl.u8        q12, d24
  178.     vabd.u8         d26, d16, d0    // abs(p0 - q0)
  179.     vmovl.u8        q2,  d0
  180.     vabd.u8         d28, d18, d16   // abs(p1 - p0)
  181.     vsubw.u8        q2,  q2,  d16
  182.     vsli.16         d24, d24, #8
  183.     vshl.i16        q2,  q2,  #2
  184.     vabd.u8         d30, d2,  d0    // abs(q1 - q0)
  185.     vaddw.u8        q2,  q2,  d18
  186.     vclt.u8         d26, d26, d22   // < alpha
  187.     vsubw.u8        q2,  q2,  d2
  188.     vdup.8          d22, r3         // beta
  189.     vclt.s8         d25, d24, #0
  190.     vrshrn.i16      d4,  q2,  #3
  191.     vclt.u8         d28, d28, d22   // < beta
  192.     vbic            d26, d26, d25
  193.     vclt.u8         d30, d30, d22   // < beta
  194.     vand            d26, d26, d28
  195.     vneg.s8         d25, d24
  196.     vand            d26, d26, d30
  197.     vmin.s8         d4,  d4,  d24
  198.     vmovl.u8        q14, d16
  199.     vand            d4,  d4,  d26
  200.     vmax.s8         d4,  d4,  d25
  201.     vmovl.u8        q11, d0
  202.     vaddw.s8        q14, q14, d4
  203.     vsubw.s8        q11, q11, d4
  204.     vqmovun.s16     d16, q14
  205.     vqmovun.s16     d0,  q11
  206. .endm
  207. function x264_deblock_v_chroma_neon, export=1
  208.     h264_loop_filter_start
  209.     sub             r0,  r0,  r1, lsl #1
  210.     vld1.64         {d18}, [r0,:64], r1
  211.     vld1.64         {d16}, [r0,:64], r1
  212.     vld1.64         {d0},  [r0,:64], r1
  213.     vld1.64         {d2},  [r0,:64]
  214.     h264_loop_filter_chroma
  215.     sub             r0,  r0,  r1, lsl #1
  216.     vst1.64         {d16}, [r0,:64], r1
  217.     vst1.64         {d0},  [r0,:64], r1
  218.     bx              lr
  219. .endfunc
  220. function x264_deblock_h_chroma_neon, export=1
  221.     h264_loop_filter_start
  222.     sub             r0,  r0,  #2
  223.     vld1.32         {d18[]},  [r0], r1
  224.     vld1.32         {d16[]},  [r0], r1
  225.     vld1.32         {d0[]},   [r0], r1
  226.     vld1.32         {d2[]},   [r0], r1
  227.     vld1.32         {d18[1]}, [r0], r1
  228.     vld1.32         {d16[1]}, [r0], r1
  229.     vld1.32         {d0[1]},  [r0], r1
  230.     vld1.32         {d2[1]},  [r0], r1
  231.     vtrn.16         d18, d0
  232.     vtrn.16         d16, d2
  233.     vtrn.8          d18, d16
  234.     vtrn.8          d0,  d2
  235.     h264_loop_filter_chroma
  236.     vtrn.16         d18, d0
  237.     vtrn.16         d16, d2
  238.     vtrn.8          d18, d16
  239.     vtrn.8          d0,  d2
  240.     sub             r0,  r0,  r1, lsl #3
  241.     vst1.32         {d18[0]}, [r0], r1
  242.     vst1.32         {d16[0]}, [r0], r1
  243.     vst1.32         {d0[0]},  [r0], r1
  244.     vst1.32         {d2[0]},  [r0], r1
  245.     vst1.32         {d18[1]}, [r0], r1
  246.     vst1.32         {d16[1]}, [r0], r1
  247.     vst1.32         {d0[1]},  [r0], r1
  248.     vst1.32         {d2[1]},  [r0], r1
  249.     bx              lr
  250. .endfunc