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