Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2.1 of the License, or (at your option) any later version.
  10.  *
  11.  * FFmpeg is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20.  
  21.  
  22. #include "libavutil/arm/asm.S"
  23. #include "neon.S"
  24.  
  25. .macro hevc_loop_filter_chroma_start
  26.         ldr      r12, [r2]
  27.         ldr      r3, [r2, #4]
  28.         add      r2, r3, r12
  29.         cmp      r2, #0
  30.         it       eq
  31.         bxeq     lr
  32. .endm
  33.  
  34. .macro hevc_loop_filter_chroma_body
  35.         vsubl.u8  q3, d4, d2
  36.         vsubl.u8  q11, d18, d19
  37.         vshl.i16  q3, #2
  38.         vadd.i16  q11, q3
  39.         vdup.16   d0, r12
  40.         vdup.16   d1, r3
  41.         vrshr.s16 q11, q11, #3
  42.         vneg.s16  q12, q0
  43.         vmovl.u8  q2, d4
  44.         vmin.s16  q11, q11, q0
  45.         vmax.s16  q11, q11, q12
  46.         vaddw.u8  q1, q11, d2
  47.         vsub.i16  q2, q11
  48.         vqmovun.s16 d2, q1
  49.         vqmovun.s16 d4, q2
  50. .endm
  51.  
  52. .macro hevc_loop_filter_luma_start
  53.         ldr     r12, [r3]
  54.         ldr      r3, [r3, #4]
  55.         lsl      r3, #16
  56.         orr      r3, r12
  57.         cmp      r3, #0
  58.         it       eq
  59.         bxeq     lr
  60.         lsr      r3, #16
  61. .endm
  62.  
  63. .macro hevc_loop_filter_luma_body
  64.         vmovl.u8  q8, d16
  65.         vmovl.u8  q9, d18
  66.         vmovl.u8  q10, d20
  67.         vmovl.u8  q11, d22
  68.         vmovl.u8  q12, d24
  69.         vmovl.u8  q13, d26
  70.         vmovl.u8  q14, d28
  71.         vmovl.u8  q15, d30
  72.  
  73.         vadd.i16   q7, q9, q11
  74.         vadd.i16   q6, q14, q12
  75.         vsub.i16   q7, q10
  76.         vsub.i16   q6, q13
  77.         vabd.s16   q7, q7, q10
  78.         vabd.s16   q6, q6, q13
  79.  
  80.  
  81.         vdup.16    q0, r2
  82.         vmov       q4, q7
  83.         vmov       q5, q6
  84.         vdup.16    d4, r12
  85.         vtrn.16    q7, q4
  86.         vtrn.16    q6, q5
  87.  
  88.         vshl.u64   q7, #32
  89.         vshr.u64   q4, #32
  90.         vshl.u64   q6, #32
  91.         vshr.u64   q5, #32
  92.         vshr.u64   q7, #32
  93.         vshr.u64   q6, #32
  94.         vshl.u64   q5, #32
  95.         vshl.u64   q4, #32
  96.         vorr       q6, q5
  97.         vorr       q7, q4
  98.         vdup.16    d5, r3
  99.         vadd.i16   q5, q7, q6
  100.  
  101.         vmov       q4, q5
  102.         vmov       q3, q5
  103.         vtrn.32    q3, q4
  104.  
  105.         vadd.i16   q4, q3
  106.  
  107.         vshl.s16   q5, q5, #1
  108.         vcgt.s16   q3, q0, q4
  109.  
  110.         vmovn.i16  d6, q3
  111.         vshr.s16   q1, q0, #2
  112.         vmovn.i16  d6, q3
  113.         vcgt.s16   q5, q1, q5
  114.         vmov       r7, s12
  115.         cmp        r7, #0
  116.         beq        bypasswrite
  117.  
  118.         vpadd.i32  d0, d14, d12
  119.         vpadd.i32  d1, d15, d13
  120.         vmov       q4, q2
  121.         vshl.s16   q2, #2
  122.         vshr.s16   q1, q1, #1
  123.         vrhadd.s16 q2, q4
  124.  
  125.         vabd.s16   q7, q8, q11
  126.         vaba.s16   q7, q15, q12
  127.  
  128.         vmovn.i32  d0, q0
  129.         vmov       r5, r6, s0, s1
  130.         vcgt.s16   q6, q1, q7
  131.         vand       q5, q5, q6
  132.         vabd.s16   q7, q11, q12
  133.         vcgt.s16   q6, q2, q7
  134.         vand       q5, q5, q6
  135.  
  136.         vmov       q2, q5
  137.         vtrn.s16   q5, q2
  138.         vshr.u64   q2, #32
  139.         vshl.u64   q5, #32
  140.         vshl.u64   q2, #32
  141.         vshr.u64   q5, #32
  142.         vorr       q5, q2
  143.  
  144.         vmov       q2, q5
  145.         vshl.i16   q7, q4, #1
  146.         vtrn.32    q2, q5
  147.         vand       q5, q2
  148.         vneg.s16   q6, q7
  149.         vmovn.i16  d4, q5
  150.         vmovn.i16  d4, q2
  151.         vmov       r8, s8
  152.  
  153.         and        r9, r8, r7
  154.         cmp        r9, #0
  155.         beq        weakfilter_\@
  156.  
  157.         vadd.i16  q2, q11, q12
  158.         vadd.i16  q4, q9, q8
  159.         vadd.i16  q1, q2, q10
  160.         vdup.16   d10, r9
  161.         vadd.i16  q0, q1, q9
  162.         vshl.i16  q4, #1
  163.         lsr        r9, #16
  164.         vadd.i16  q1, q0
  165.         vrshr.s16 q3, q0, #2
  166.         vadd.i16  q1, q13
  167.         vadd.i16  q4, q0
  168.         vsub.i16  q3, q10
  169.         vrshr.s16 q1, #3
  170.         vrshr.s16 q4, #3
  171.         vmax.s16  q3, q6
  172.         vsub.i16  q1, q11
  173.         vsub.i16  q4, q9
  174.         vmin.s16  q3, q7
  175.         vmax.s16  q4, q6
  176.         vmax.s16  q1, q6
  177.         vadd.i16  q3, q10
  178.         vmin.s16  q4, q7
  179.         vmin.s16  q1, q7
  180.         vdup.16   d11, r9
  181.         vadd.i16  q4, q9
  182.         vadd.i16  q1, q11
  183.         vbit      q9, q4, q5
  184.         vadd.i16  q4, q2, q13
  185.         vbit      q11, q1, q5
  186.         vadd.i16  q0, q4, q14
  187.         vadd.i16  q2, q15, q14
  188.         vadd.i16  q4, q0
  189.  
  190.         vshl.i16  q2, #1
  191.         vadd.i16  q4, q10
  192.         vbit      q10, q3, q5
  193.         vrshr.s16 q4, #3
  194.         vadd.i16  q2, q0
  195.         vrshr.s16 q3, q0, #2
  196.         vsub.i16  q4, q12
  197.         vrshr.s16 q2, #3
  198.         vsub.i16  q3, q13
  199.         vmax.s16  q4, q6
  200.         vsub.i16  q2, q14
  201.         vmax.s16  q3, q6
  202.         vmin.s16  q4, q7
  203.         vmax.s16  q2, q6
  204.         vmin.s16  q3, q7
  205.         vadd.i16  q4, q12
  206.         vmin.s16  q2, q7
  207.         vadd.i16  q3, q13
  208.         vbit      q12, q4, q5
  209.         vadd.i16  q2, q14
  210.         vbit      q13, q3, q5
  211.         vbit      q14, q2, q5
  212.  
  213. weakfilter_\@:
  214.         mvn       r8, r8
  215.         and       r9, r8, r7
  216.         cmp       r9, #0
  217.         beq       ready_\@
  218.  
  219.         vdup.16    q4, r2
  220.  
  221.         vdup.16   d10, r9
  222.         lsr       r9, #16
  223.         vmov       q1, q4
  224.         vdup.16   d11, r9
  225.         vshr.s16   q1, #1
  226.         vsub.i16  q2, q12, q11
  227.         vadd.i16   q4, q1
  228.         vshl.s16  q0, q2, #3
  229.         vshr.s16   q4, #3
  230.         vadd.i16  q2, q0
  231.         vsub.i16  q0, q13, q10
  232.         vsub.i16  q2, q0
  233.         vshl.i16  q0, q0, #1
  234.         vsub.i16  q2, q0
  235.         vshl.s16  q1, q7, 2
  236.         vrshr.s16 q2, q2, #4
  237.         vadd.i16  q1, q7
  238.         vabs.s16  q3, q2
  239.         vshr.s16  q6, q6, #1
  240.         vcgt.s16  q1, q1, q3
  241.         vand      q5, q1
  242.         vshr.s16  q7, q7, #1
  243.         vmax.s16  q2, q2, q6
  244.         vmin.s16  q2, q2, q7
  245.  
  246.         vshr.s16  q7, q7, #1
  247.         vrhadd.s16 q3, q9, q11
  248.         vneg.s16  q6, q7
  249.         vsub.s16  q3, q10
  250.         vdup.16   d2, r5
  251.         vhadd.s16 q3, q2
  252.         vdup.16   d3, r6
  253.         vmax.s16  q3, q3, q6
  254.         vcgt.s16  q1, q4, q1
  255.         vmin.s16  q3, q3, q7
  256.         vand      q1, q5
  257.         vadd.i16  q3, q10
  258.         lsr       r5, #16
  259.         lsr       r6, #16
  260.         vbit      q10, q3, q1
  261.  
  262.         vrhadd.s16 q3, q14, q12
  263.         vdup.16   d2, r5
  264.         vsub.s16  q3, q13
  265.         vdup.16   d3, r6
  266.         vhsub.s16 q3, q2
  267.         vcgt.s16  q1, q4, q1
  268.         vmax.s16  q3, q3, q6
  269.         vand      q1, q5
  270.         vmin.s16  q3, q3, q7
  271.         vadd.i16  q3, q13
  272.         vbit      q13, q3, q1
  273.         vadd.i16  q0, q11, q2
  274.         vsub.i16  q4, q12, q2
  275.         vbit      q11, q0, q5
  276.         vbit      q12, q4, q5
  277.  
  278. ready_\@:
  279.         vqmovun.s16 d16, q8
  280.         vqmovun.s16 d18, q9
  281.         vqmovun.s16 d20, q10
  282.         vqmovun.s16 d22, q11
  283.         vqmovun.s16 d24, q12
  284.         vqmovun.s16 d26, q13
  285.         vqmovun.s16 d28, q14
  286.         vqmovun.s16 d30, q15
  287. .endm
  288.  
  289. function ff_hevc_v_loop_filter_luma_neon, export=1
  290.         hevc_loop_filter_luma_start
  291.         push     {r5-r11}
  292.         vpush    {d8-d15}
  293.         sub      r0, #4
  294.         vld1.8   {d16}, [r0], r1
  295.         vld1.8   {d18}, [r0], r1
  296.         vld1.8   {d20}, [r0], r1
  297.         vld1.8   {d22}, [r0], r1
  298.         vld1.8   {d24}, [r0], r1
  299.         vld1.8   {d26}, [r0], r1
  300.         vld1.8   {d28}, [r0], r1
  301.         vld1.8   {d30}, [r0], r1
  302.         sub      r0, r0, r1, lsl #3
  303.         transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
  304.         hevc_loop_filter_luma_body
  305.         transpose_8x8 d16, d18, d20, d22, d24, d26, d28, d30
  306.         vst1.8   {d16}, [r0], r1
  307.         vst1.8   {d18}, [r0], r1
  308.         vst1.8   {d20}, [r0], r1
  309.         vst1.8   {d22}, [r0], r1
  310.         vst1.8   {d24}, [r0], r1
  311.         vst1.8   {d26}, [r0], r1
  312.         vst1.8   {d28}, [r0], r1
  313.         vst1.8   {d30}, [r0]
  314.         vpop     {d8-d15}
  315.         pop      {r5-r11}
  316.         bx lr
  317. endfunc
  318.  
  319. function ff_hevc_h_loop_filter_luma_neon, export=1
  320.         hevc_loop_filter_luma_start
  321.         push     {r5-r11}
  322.         vpush    {d8-d15}
  323.         sub      r0, r0, r1, lsl #2
  324.         vld1.8  {d16}, [r0], r1
  325.         vld1.8  {d18}, [r0], r1
  326.         vld1.8  {d20}, [r0], r1
  327.         vld1.8  {d22}, [r0], r1
  328.         vld1.8  {d24}, [r0], r1
  329.         vld1.8  {d26}, [r0], r1
  330.         vld1.8  {d28}, [r0], r1
  331.         vld1.8  {d30}, [r0], r1
  332.         sub        r0, r0, r1, lsl #3
  333.         add        r0, r1
  334.         hevc_loop_filter_luma_body
  335.         vst1.8   {d18}, [r0], r1
  336.         vst1.8   {d20}, [r0], r1
  337.         vst1.8   {d22}, [r0], r1
  338.         vst1.8   {d24}, [r0], r1
  339.         vst1.8   {d26}, [r0], r1
  340.         vst1.8   {d28}, [r0]
  341. bypasswrite:
  342.         vpop     {d8-d15}
  343.         pop      {r5-r11}
  344.         bx lr
  345. endfunc
  346.  
  347. function ff_hevc_v_loop_filter_chroma_neon, export=1
  348.         hevc_loop_filter_chroma_start
  349.         sub      r0, #4
  350.         vld1.8   {d16}, [r0], r1
  351.         vld1.8   {d17}, [r0], r1
  352.         vld1.8   {d18}, [r0], r1
  353.         vld1.8   {d2},  [r0], r1
  354.         vld1.8   {d4},  [r0], r1
  355.         vld1.8   {d19}, [r0], r1
  356.         vld1.8   {d20}, [r0], r1
  357.         vld1.8   {d21}, [r0], r1
  358.         sub      r0, r0, r1, lsl #3
  359.         transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
  360.         hevc_loop_filter_chroma_body
  361.         transpose_8x8 d16, d17, d18, d2, d4, d19, d20, d21
  362.         vst1.8   {d16}, [r0], r1
  363.         vst1.8   {d17}, [r0], r1
  364.         vst1.8   {d18}, [r0], r1
  365.         vst1.8   {d2},  [r0], r1
  366.         vst1.8   {d4},  [r0], r1
  367.         vst1.8   {d19}, [r0], r1
  368.         vst1.8   {d20}, [r0], r1
  369.         vst1.8   {d21}, [r0]
  370.         bx       lr
  371. endfunc
  372.  
  373. function ff_hevc_h_loop_filter_chroma_neon, export=1
  374.         hevc_loop_filter_chroma_start
  375.         sub      r0, r0, r1, lsl #1
  376.         vld1.8   {d18}, [r0], r1
  377.         vld1.8   {d2}, [r0], r1
  378.         vld1.8   {d4}, [r0], r1
  379.         vld1.8   {d19}, [r0]
  380.         sub      r0, r0, r1, lsl #1
  381.         hevc_loop_filter_chroma_body
  382.         vst1.8   {d2}, [r0], r1
  383.         vst1.8   {d4}, [r0]
  384.         bx       lr
  385. endfunc
  386.