1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or modify 5cabdff1aSopenharmony_ci * it under the terms of the GNU General Public License as published by 6cabdff1aSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or 7cabdff1aSopenharmony_ci * (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12cabdff1aSopenharmony_ci * GNU General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU General Public License along 15cabdff1aSopenharmony_ci * with FFmpeg; if not, write to the Free Software Foundation, Inc., 16cabdff1aSopenharmony_ci * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include <float.h> 20cabdff1aSopenharmony_ci#include <string.h> 21cabdff1aSopenharmony_ci#include "checkasm.h" 22cabdff1aSopenharmony_ci#include "libavfilter/vf_gblur_init.h" 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#define WIDTH 256 25cabdff1aSopenharmony_ci#define HEIGHT 256 26cabdff1aSopenharmony_ci#define PIXELS (WIDTH * HEIGHT) 27cabdff1aSopenharmony_ci#define BUF_SIZE (PIXELS * 4) 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#define randomize_buffers(buf, size) \ 30cabdff1aSopenharmony_ci do { \ 31cabdff1aSopenharmony_ci int j; \ 32cabdff1aSopenharmony_ci float *tmp_buf = (float *)buf; \ 33cabdff1aSopenharmony_ci for (j = 0; j < size; j++) \ 34cabdff1aSopenharmony_ci tmp_buf[j] = (float)(rnd() & 0xFF); \ 35cabdff1aSopenharmony_ci } while (0) 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_cistatic void check_horiz_slice(float *dst_ref, float *dst_new, float *localbuf) 38cabdff1aSopenharmony_ci{ 39cabdff1aSopenharmony_ci int steps = 2; 40cabdff1aSopenharmony_ci float nu = 0.101f; 41cabdff1aSopenharmony_ci float bscale = 1.112f; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci declare_func(void, float *dst, int w, int h, int steps, float nu, float bscale, float *localbuf); 44cabdff1aSopenharmony_ci call_ref(dst_ref, WIDTH, HEIGHT, steps, nu, bscale, localbuf); 45cabdff1aSopenharmony_ci call_new(dst_new, WIDTH, HEIGHT, steps, nu, bscale, localbuf); 46cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst_ref, dst_new, 0.01f, PIXELS)) { 47cabdff1aSopenharmony_ci fail(); 48cabdff1aSopenharmony_ci } 49cabdff1aSopenharmony_ci bench_new(dst_new, WIDTH, HEIGHT, 1, nu, bscale, localbuf); 50cabdff1aSopenharmony_ci} 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_cistatic void check_verti_slice(float *dst_ref, float *dst_new) 53cabdff1aSopenharmony_ci{ 54cabdff1aSopenharmony_ci int steps = 2; 55cabdff1aSopenharmony_ci float nu = 0.101f; 56cabdff1aSopenharmony_ci float bscale = 1.112f; 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci declare_func(void, float *buffer, int width, int height, int column_begin, 59cabdff1aSopenharmony_ci int column_end, int steps, float nu, float bscale); 60cabdff1aSopenharmony_ci call_ref(dst_ref, WIDTH, HEIGHT, 0, WIDTH, steps, nu, bscale); 61cabdff1aSopenharmony_ci call_new(dst_new, WIDTH, HEIGHT, 0, WIDTH, steps, nu, bscale); 62cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst_ref, dst_new, 0.01f, PIXELS)) { 63cabdff1aSopenharmony_ci fail(); 64cabdff1aSopenharmony_ci } 65cabdff1aSopenharmony_ci bench_new(dst_new, WIDTH, HEIGHT, 0, WIDTH, 1, nu, bscale); 66cabdff1aSopenharmony_ci} 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_cistatic void check_postscale_slice(float *dst_ref, float *dst_new) 69cabdff1aSopenharmony_ci{ 70cabdff1aSopenharmony_ci float postscale = 0.0603f; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci declare_func(void, float *dst, int len, float postscale, float min, float max); 73cabdff1aSopenharmony_ci call_ref(dst_ref, PIXELS, postscale, -FLT_MAX, FLT_MAX); 74cabdff1aSopenharmony_ci call_new(dst_new, PIXELS, postscale, -FLT_MAX, FLT_MAX); 75cabdff1aSopenharmony_ci if (!float_near_abs_eps_array(dst_ref, dst_new, FLT_EPSILON, PIXELS)) { 76cabdff1aSopenharmony_ci fail(); 77cabdff1aSopenharmony_ci } 78cabdff1aSopenharmony_ci bench_new(dst_new, PIXELS, postscale, -FLT_MAX, FLT_MAX); 79cabdff1aSopenharmony_ci} 80cabdff1aSopenharmony_ci 81cabdff1aSopenharmony_civoid checkasm_check_vf_gblur(void) 82cabdff1aSopenharmony_ci{ 83cabdff1aSopenharmony_ci float *dst_ref = av_malloc(BUF_SIZE); 84cabdff1aSopenharmony_ci float *dst_new = av_malloc(BUF_SIZE); 85cabdff1aSopenharmony_ci GBlurContext s; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci randomize_buffers(dst_ref, PIXELS); 88cabdff1aSopenharmony_ci memcpy(dst_new, dst_ref, BUF_SIZE); 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci s.planewidth[0] = WIDTH; 91cabdff1aSopenharmony_ci s.planeheight[0] = HEIGHT; 92cabdff1aSopenharmony_ci ff_gblur_init(&s); 93cabdff1aSopenharmony_ci 94cabdff1aSopenharmony_ci if (check_func(s.horiz_slice, "horiz_slice")) { 95cabdff1aSopenharmony_ci check_horiz_slice(dst_ref, dst_new, s.localbuf); 96cabdff1aSopenharmony_ci } 97cabdff1aSopenharmony_ci report("horiz_slice"); 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci randomize_buffers(dst_ref, PIXELS); 100cabdff1aSopenharmony_ci memcpy(dst_new, dst_ref, BUF_SIZE); 101cabdff1aSopenharmony_ci if (check_func(s.postscale_slice, "postscale_slice")) { 102cabdff1aSopenharmony_ci check_postscale_slice(dst_ref, dst_new); 103cabdff1aSopenharmony_ci } 104cabdff1aSopenharmony_ci report("postscale_slice"); 105cabdff1aSopenharmony_ci 106cabdff1aSopenharmony_ci randomize_buffers(dst_ref, PIXELS); 107cabdff1aSopenharmony_ci memcpy(dst_new, dst_ref, BUF_SIZE); 108cabdff1aSopenharmony_ci if (check_func(s.verti_slice, "verti_slice")) { 109cabdff1aSopenharmony_ci check_verti_slice(dst_ref, dst_new); 110cabdff1aSopenharmony_ci } 111cabdff1aSopenharmony_ci report("verti_slice"); 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci if (s.localbuf) 114cabdff1aSopenharmony_ci av_free(s.localbuf); 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_ci av_freep(&dst_ref); 117cabdff1aSopenharmony_ci av_freep(&dst_new); 118cabdff1aSopenharmony_ci} 119