> James Almer <jamr...@gmail.com> schrieb am Sa, 11.3.2017: >>On 3/11/2017 12:39 PM, Thomas Mundt wrote: >>> James Almer <jamrial at gmail.com> schrieb am Fr, 10.3.2017: >>>> On 3/8/2017 1:58 PM, Thomas Mundt wrote: >>>> Hi, >>>> >>>> attached patch adds a complex (-1 2 6 2 -1) vertcal lowpassfilter to >>>> vf_interlace. This will better retain detail and reduce blurring compared >>>> to the existing (1 2 1) filter. >>>> >>>> Please comment. >>>> diff --git a/libavfilter/interlace.h b/libavfilter/interlace.h >>>> index da073ae..7ad457e 100644 >>>> --- a/libavfilter/interlace.h >>>> +++ b/libavfilter/interlace.h >>>> @@ -51,6 +51,8 @@ typedef struct InterlaceContext { >>>> AVFrame *cur, *next; // the two frames from which the new one is >>>> obtained >>>> void (*lowpass_line)(uint8_t *dstp, ptrdiff_t linesize, const uint8_t >>>> *srcp, >>>> const uint8_t *srcp_above, const uint8_t >>>> *srcp_below); >>>> + void (*lowpass_line_complex)(uint8_t *dstp, ptrdiff_t linesize, >>>> + const uint8_t *srcp, int mref, int pref); >>> >>> Why not keep a single prototype, passing mref and pref for both linear >>> and complex? You can calculate srcp_above and srcp_below for linear like >>> you're doing it for complex in both the c and asm versions. >>> >> >> This would make sense. I just didn´t wanted to change more than necessary in >> one patch and I´m not such an expert in simd programming. >> This is my second attempt ever. >> Also there is the same function in tinterlace filter that also uses this >> asm. So I would also need to change the function in tinterlace. > > Yes, this would need separate patches. One to change the prototype, > c and asm versions of the linear function for both filters, then > another (One per interlace filter or one for both) adding the > complex lowpass filter. > OK, c is fine, but I´m stumbling with asm since I´m a newbie there. I changed in all files: lowpass_line_c(uint8_t *dstp, ptrdiff_t linesize, const uint8_t *srcp, const uint8_t *srcp_above, const uint8_t *srcp_below) to lowpass_line_c(uint8_t *dstp, ptrdiff_t linesize, const uint8_t *srcp, ptrdiff_t mref, ptrdiff_t pref)
But when I change asm to cglobal lowpass_line, 5, 5, 7 add r0, r1 add r2, r1 neg r1 pcmpeqb m6, m6 .loop: mova m0, [r2+r1+r3] mova m1, [r2+r1+r3+mmsize] pavgb m0, [r2+r1+r4] pavgb m1, [r2+r1+r4+mmsize] pxor m0, m6 pxor m1, m6 pxor m2, m6, [r2+r1] pxor m3, m6, [r2+r1+mmsize] pavgb m0, m2 pavgb m1, m3 pxor m0, m6 pxor m1, m6 mova [r0+r1], m0 mova [r0+r1+mmsize], m1 add r1, 2*mmsize jl .loop REP_RET I get error: invalid effective address It works when I use the same scheme as I use in complex asm, but this adds some extra calculations which might not be OK. >> I could do all this as a subsequent patch. Do you have a suggestion how to >> deal with the option name of complex filter in tinterlace? >> There it´s a flag with the names "low_pass_filter" and "vlpf", so I could >> add "complex_low_pass_filter" and "vclpf"? > > With flags you could in theory enable both linear and complex at > the same time, so you'd need to add code to abort in such cases > or default to one of them. > I'd say add a lowpass option similar to vf_interlace's, and leave > the flags as is. I´m not sure how to add an additional lowpass option without breaking the flag. I might need a hint. Simplest to me would be adding the complex flag and when both flags are set using the complex function. Otherwise the user won´t have set it. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel