diff options
Diffstat (limited to 'libavfilter/x86/vf_gblur_init.c')
-rw-r--r-- | libavfilter/x86/vf_gblur_init.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavfilter/x86/vf_gblur_init.c b/libavfilter/x86/vf_gblur_init.c index 3e173410c2..b47f6fbffb 100644 --- a/libavfilter/x86/vf_gblur_init.c +++ b/libavfilter/x86/vf_gblur_init.c @@ -24,8 +24,9 @@ #include "libavutil/x86/cpu.h" #include "libavfilter/gblur.h" -void ff_horiz_slice_sse4(float *ptr, int width, int height, int steps, float nu, float bscale); -void ff_horiz_slice_avx2(float *ptr, int width, int height, int steps, float nu, float bscale); +void ff_horiz_slice_sse4(float *ptr, int width, int height, int steps, float nu, float bscale, float *localbuf); +void ff_horiz_slice_avx2(float *ptr, int width, int height, int steps, float nu, float bscale, float *localbuf); +void ff_horiz_slice_avx512(float *ptr, int width, int height, int steps, float nu, float bscale, float *localbuf); void ff_postscale_slice_sse(float *ptr, int length, float postscale, float min, float max); void ff_postscale_slice_avx2(float *ptr, int length, float postscale, float min, float max); @@ -51,12 +52,22 @@ av_cold void ff_gblur_init_x86(GBlurContext *s) s->horiz_slice = ff_horiz_slice_sse4; } if (EXTERNAL_AVX2(cpu_flags)) { - s->horiz_slice = ff_horiz_slice_avx2; s->verti_slice = ff_verti_slice_avx2; } if (EXTERNAL_AVX512(cpu_flags)) { s->postscale_slice = ff_postscale_slice_avx512; s->verti_slice = ff_verti_slice_avx512; } + if (EXTERNAL_AVX2(cpu_flags)) { + s->stride = EXTERNAL_AVX512(cpu_flags) ? 16 : 8; + s->localbuf = av_malloc(s->stride * sizeof(float) * s->planewidth[0] * s->planeheight[0]); + if (!s->localbuf) + return; + + s->horiz_slice = ff_horiz_slice_avx2; + if (EXTERNAL_AVX512(cpu_flags)) { + s->horiz_slice = ff_horiz_slice_avx512; + } + } #endif } |