avfilter/interlace: add support for 10 and 12 bit
[ffmpeg.git] / libavfilter / x86 / vf_interlace.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for interlace filter
3 ;*
4 ;* Copyright (C) 2014 Kieran Kunhya <kierank@obe.tv>
5 ;* Copyright (c) 2014 Michael Niedermayer <michaelni@gmx.at>
6 ;* Copyright (c) 2017 Thomas Mundt <tmundt75@gmail.com>
7 ;*
8 ;* This file is part of FFmpeg.
9 ;*
10 ;* FFmpeg is free software; you can redistribute it and/or modify
11 ;* it under the terms of the GNU General Public License as published by
12 ;* the Free Software Foundation; either version 2 of the License, or
13 ;* (at your option) any later version.
14 ;*
15 ;* FFmpeg is distributed in the hope that it will be useful,
16 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;* GNU General Public License for more details.
19 ;*
20 ;* You should have received a copy of the GNU General Public License along
21 ;* with FFmpeg; if not, write to the Free Software Foundation, Inc.,
22 ;* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 ;******************************************************************************
24
25 %include "libavutil/x86/x86util.asm"
26
27 SECTION_RODATA
28
29 pw_4: times 8 dw 4
30
31 SECTION .text
32
33 %macro LOWPASS 1
34     add dstq, hq
35     add srcq, hq
36     add mrefq, srcq
37     add prefq, srcq
38     neg hq
39
40     pcmpeq%1 m6, m6
41
42 .loop:
43     mova m0, [mrefq+hq]
44     mova m1, [mrefq+hq+mmsize]
45     pavg%1 m0, [prefq+hq]
46     pavg%1 m1, [prefq+hq+mmsize]
47     pxor m0, m6
48     pxor m1, m6
49     pxor m2, m6, [srcq+hq]
50     pxor m3, m6, [srcq+hq+mmsize]
51     pavg%1 m0, m2
52     pavg%1 m1, m3
53     pxor m0, m6
54     pxor m1, m6
55     mova [dstq+hq], m0
56     mova [dstq+hq+mmsize], m1
57
58     add hq, 2*mmsize
59     jl .loop
60 REP_RET
61 %endmacro
62
63 %macro LOWPASS_LINE 0
64 cglobal lowpass_line, 5, 5, 7, dst, h, src, mref, pref
65     LOWPASS b
66
67 cglobal lowpass_line_16, 5, 5, 7, dst, h, src, mref, pref
68     shl hq, 1
69     LOWPASS w
70 %endmacro
71
72 %macro LOWPASS_LINE_COMPLEX 0
73 cglobal lowpass_line_complex, 5, 5, 8, dst, h, src, mref, pref
74     pxor m7, m7
75 .loop:
76     mova m0, [srcq+mrefq]
77     mova m2, [srcq+prefq]
78     mova m1, m0
79     mova m3, m2
80     punpcklbw m0, m7
81     punpcklbw m2, m7
82     punpckhbw m1, m7
83     punpckhbw m3, m7
84     paddw m0, m2
85     paddw m1, m3
86     mova m6, m0
87     mova m5, m1
88     mova m2, [srcq]
89     mova m3, m2
90     punpcklbw m2, m7
91     punpckhbw m3, m7
92     paddw m0, m2
93     paddw m1, m3
94     psllw m2, 1
95     psllw m3, 1
96     paddw m0, m2
97     paddw m1, m3
98     psllw m0, 1
99     psllw m1, 1
100     pcmpgtw m6, m2
101     pcmpgtw m5, m3
102     packsswb m6, m5
103     mova m2, [srcq+mrefq*2]
104     mova m4, [srcq+prefq*2]
105     mova m3, m2
106     mova m5, m4
107     punpcklbw m2, m7
108     punpcklbw m4, m7
109     punpckhbw m3, m7
110     punpckhbw m5, m7
111     paddw m2, m4
112     paddw m3, m5
113     paddw m0, [pw_4]
114     paddw m1, [pw_4]
115     psubusw m0, m2
116     psubusw m1, m3
117     psrlw m0, 3
118     psrlw m1, 3
119     packuswb m0, m1
120     mova m1, m0
121     pmaxub m0, [srcq]
122     pminub m1, [srcq]
123     pand m0, m6
124     pandn m6, m1
125     por m0, m6
126     mova [dstq], m0
127
128     add dstq, mmsize
129     add srcq, mmsize
130     sub hd, mmsize
131     jg .loop
132 REP_RET
133
134 cglobal lowpass_line_complex_12, 5, 5, 8, 16, dst, h, src, mref, pref, clip_max
135     movd m7, DWORD clip_maxm
136     SPLATW m7, m7, 0
137     mova [rsp], m7
138 .loop:
139     mova m0, [srcq+mrefq]
140     mova m1, [srcq+mrefq+mmsize]
141     mova m2, [srcq+prefq]
142     mova m3, [srcq+prefq+mmsize]
143     paddw m0, m2
144     paddw m1, m3
145     mova m6, m0
146     mova m7, m1
147     mova m2, [srcq]
148     mova m3, [srcq+mmsize]
149     paddw m0, m2
150     paddw m1, m3
151     psllw m2, 1
152     psllw m3, 1
153     paddw m0, m2
154     paddw m1, m3
155     psllw m0, 1
156     psllw m1, 1
157     pcmpgtw m6, m2
158     pcmpgtw m7, m3
159     mova m2, [srcq+2*mrefq]
160     mova m3, [srcq+2*mrefq+mmsize]
161     mova m4, [srcq+2*prefq]
162     mova m5, [srcq+2*prefq+mmsize]
163     paddw m2, m4
164     paddw m3, m5
165     paddw m0, [pw_4]
166     paddw m1, [pw_4]
167     psubusw m0, m2
168     psubusw m1, m3
169     psrlw m0, 3
170     psrlw m1, 3
171     pminsw m0, [rsp]
172     pminsw m1, [rsp]
173     mova m2, m0
174     mova m3, m1
175     pmaxsw m0, [srcq]
176     pmaxsw m1, [srcq+mmsize]
177     pminsw m2, [srcq]
178     pminsw m3, [srcq+mmsize]
179     pand m0, m6
180     pand m1, m7
181     pandn m6, m2
182     pandn m7, m3
183     por m0, m6
184     por m1, m7
185     mova [dstq], m0
186     mova [dstq+mmsize], m1
187
188     add dstq, 2*mmsize
189     add srcq, 2*mmsize
190     sub hd, mmsize
191     jg .loop
192 REP_RET
193 %endmacro
194
195 INIT_XMM sse2
196 LOWPASS_LINE
197
198 INIT_XMM avx
199 LOWPASS_LINE
200
201 INIT_XMM sse2
202 LOWPASS_LINE_COMPLEX