]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/vf_atadenoise.asm
cbs_h265: Ensure that a predicted RPS doesn't contain too many pictures
[ffmpeg] / libavfilter / x86 / vf_atadenoise.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for atadenoise filter
3 ;*
4 ;* Copyright (C) 2019 Paul B Mahol
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg 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 GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %if ARCH_X86_64
24
25 %include "libavutil/x86/x86util.asm"
26
27 SECTION_RODATA
28 pw_one:  times 8 dw 1
29 pw_ones: times 8 dw 65535
30
31 SECTION .text
32
33 ;------------------------------------------------------------------------------
34 ; void ff_filter_row(const uint8_t *src, uint8_t *dst,
35 ;                    const uint8_t **srcf,
36 ;                    int w, int mid, int size,
37 ;                    int thra, int thrb)
38 ;------------------------------------------------------------------------------
39
40 INIT_XMM sse4
41 cglobal atadenoise_filter_row8, 8,10,13, src, dst, srcf, w, mid, size, i, j, srcfx, x
42     movsxdifnidn    wq, wd
43     movsxdifnidn  midq, midd
44     movsxdifnidn sizeq, sized
45     add           srcq, wq
46     add           dstq, wq
47     mov             xq, wq
48     dec          sizeq
49     neg             xq
50     movd            m4, r6m
51     SPLATW          m4, m4
52     movd            m5, r7m
53     SPLATW          m5, m5
54     pxor            m2, m2
55     mova           m10, [pw_ones]
56
57     .loop:
58         mov         iq, midq
59         mov         jq, midq
60         pxor        m3, m3
61         pxor       m11, m11
62         movu        m0, [srcq + xq]
63         punpcklbw   m0, m2
64         mova        m7, m0
65         mova        m8, [pw_one]
66         mova       m12, [pw_ones]
67
68         .loop0:
69             inc              iq
70             dec              jq
71
72             mov          srcfxq, [srcfq + jq * 8]
73             add          srcfxq, wq
74
75             movu             m1, [srcfxq + xq]
76             punpcklbw        m1, m2
77             mova             m9, m1
78             psubw            m1, m0
79             pabsw            m1, m1
80             paddw           m11, m1
81             pcmpgtw          m1, m4
82             mova             m6, m11
83             pcmpgtw          m6, m5
84             por              m6, m1
85             pxor             m6, m10
86             pand            m12, m6
87             pand             m9, m12
88             paddw            m7, m9
89             mova             m6, m12
90             psrlw            m6, 15
91             paddw            m8, m6
92
93             mov          srcfxq, [srcfq + iq * 8]
94             add          srcfxq, wq
95
96             movu             m1, [srcfxq + xq]
97             punpcklbw        m1, m2
98             mova             m9, m1
99             psubw            m1, m0
100             pabsw            m1, m1
101             paddw            m3, m1
102             pcmpgtw          m1, m4
103             mova             m6, m3
104             pcmpgtw          m6, m5
105             por              m6, m1
106             pxor             m6, m10
107             pand            m12, m6
108             pand             m9, m12
109             paddw            m7, m9
110             mova             m6, m12
111             psrlw            m6, 15
112             paddw            m8, m6
113
114             ptest           m12, m12
115             jz .finish
116
117             cmp              iq, sizeq
118             jl .loop0
119
120     .finish:
121         mova                 m9, m8
122         psrlw                m9, 1
123         paddw                m7, m9
124
125         mova                 m1, m7
126         mova                 m6, m8
127
128         punpcklwd            m7, m2
129         punpcklwd            m8, m2
130         cvtdq2ps             m7, m7
131         cvtdq2ps             m8, m8
132         divps                m7, m8
133         cvttps2dq            m7, m7
134         packssdw             m7, m7
135         packuswb             m7, m7
136
137         movd        [dstq + xq], m7
138
139         punpckhwd            m1, m2
140         punpckhwd            m6, m2
141         cvtdq2ps             m1, m1
142         cvtdq2ps             m6, m6
143         divps                m1, m6
144         cvttps2dq            m1, m1
145         packssdw             m1, m1
146         packuswb             m1, m1
147
148         movd    [dstq + xq + 4], m1
149
150         add                  xq, mmsize/2
151     jl .loop
152     RET
153
154 INIT_XMM sse4
155 cglobal atadenoise_filter_row8_serial, 8,10,13, src, dst, srcf, w, mid, size, i, j, srcfx, x
156     movsxdifnidn    wq, wd
157     movsxdifnidn  midq, midd
158     movsxdifnidn sizeq, sized
159     add           srcq, wq
160     add           dstq, wq
161     mov             xq, wq
162     dec          sizeq
163     neg             xq
164     movd            m4, r6m
165     SPLATW          m4, m4
166     movd            m5, r7m
167     SPLATW          m5, m5
168     pxor            m2, m2
169     mova           m10, [pw_ones]
170
171     .loop:
172         mov         iq, midq
173         mov         jq, midq
174         pxor        m3, m3
175         pxor       m11, m11
176         movu        m0, [srcq + xq]
177         punpcklbw   m0, m2
178         mova        m7, m0
179         mova        m8, [pw_one]
180         mova       m12, [pw_ones]
181
182         .loop0:
183             dec              jq
184
185             mov          srcfxq, [srcfq + jq * 8]
186             add          srcfxq, wq
187
188             movu             m1, [srcfxq + xq]
189             punpcklbw        m1, m2
190             mova             m9, m1
191             psubw            m1, m0
192             pabsw            m1, m1
193             paddw           m11, m1
194             pcmpgtw          m1, m4
195             mova             m6, m11
196             pcmpgtw          m6, m5
197             por              m6, m1
198             pxor             m6, m10
199             pand            m12, m6
200             pand             m9, m12
201             paddw            m7, m9
202             mova             m6, m12
203             psrlw            m6, 15
204             paddw            m8, m6
205
206             ptest           m12, m12
207             jz .end_loop0
208
209             cmp              jq, 0
210             jg .loop0
211
212         .end_loop0:
213             mova       m12, [pw_ones]
214
215         .loop1:
216             inc              iq
217
218             mov          srcfxq, [srcfq + iq * 8]
219             add          srcfxq, wq
220
221             movu             m1, [srcfxq + xq]
222             punpcklbw        m1, m2
223             mova             m9, m1
224             psubw            m1, m0
225             pabsw            m1, m1
226             paddw            m3, m1
227             pcmpgtw          m1, m4
228             mova             m6, m3
229             pcmpgtw          m6, m5
230             por              m6, m1
231             pxor             m6, m10
232             pand            m12, m6
233             pand             m9, m12
234             paddw            m7, m9
235             mova             m6, m12
236             psrlw            m6, 15
237             paddw            m8, m6
238
239             ptest           m12, m12
240             jz .finish
241
242             cmp              iq, sizeq
243             jl .loop1
244
245     .finish:
246         mova                 m9, m8
247         psrlw                m9, 1
248         paddw                m7, m9
249
250         mova                 m1, m7
251         mova                 m6, m8
252
253         punpcklwd            m7, m2
254         punpcklwd            m8, m2
255         cvtdq2ps             m7, m7
256         cvtdq2ps             m8, m8
257         divps                m7, m8
258         cvttps2dq            m7, m7
259         packssdw             m7, m7
260         packuswb             m7, m7
261
262         movd        [dstq + xq], m7
263
264         punpckhwd            m1, m2
265         punpckhwd            m6, m2
266         cvtdq2ps             m1, m1
267         cvtdq2ps             m6, m6
268         divps                m1, m6
269         cvttps2dq            m1, m1
270         packssdw             m1, m1
271         packuswb             m1, m1
272
273         movd    [dstq + xq + 4], m1
274
275         add                  xq, mmsize/2
276     jl .loop
277     RET
278
279 %endif