FFmpeg
fixed_dsp.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 James Almer
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with FFmpeg; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #include "checkasm.h"
22 #include "libavutil/common.h"
23 #include "libavutil/fixed_dsp.h"
24 #include "libavutil/internal.h"
25 #include "libavutil/mem.h"
26 
27 #define BUF_SIZE 256
28 
29 #define randomize_buffers() \
30  do { \
31  int i; \
32  for (i = 0; i < BUF_SIZE; i++) { \
33  src0[i] = sign_extend(rnd(), 24); \
34  src1[i] = sign_extend(rnd(), 24); \
35  src2[i] = sign_extend(rnd(), 24); \
36  } \
37  } while (0)
38 
39 static void check_vector_fmul(const int *src0, const int *src1)
40 {
41  LOCAL_ALIGNED_32(int, ref, [BUF_SIZE]);
42  LOCAL_ALIGNED_32(int, new, [BUF_SIZE]);
43 
44  declare_func(void, int *dst, const int *src0, const int *src1, int len);
45 
46  call_ref(ref, src0, src1, BUF_SIZE);
47  call_new(new, src0, src1, BUF_SIZE);
48  if (memcmp(ref, new, BUF_SIZE * sizeof(int)))
49  fail();
50  bench_new(new, src0, src1, BUF_SIZE);
51 }
52 
53 static void check_vector_fmul_add(const int *src0, const int *src1, const int *src2)
54 {
55  LOCAL_ALIGNED_32(int, ref, [BUF_SIZE]);
56  LOCAL_ALIGNED_32(int, new, [BUF_SIZE]);
57 
58  declare_func(void, int *dst, const int *src0, const int *src1, const int *src2, int len);
59 
60  call_ref(ref, src0, src1, src2, BUF_SIZE);
61  call_new(new, src0, src1, src2, BUF_SIZE);
62  if (memcmp(ref, new, BUF_SIZE * sizeof(int)))
63  fail();
64  bench_new(new, src0, src1, src2, BUF_SIZE);
65 }
66 
67 static void check_vector_fmul_window(const int32_t *src0, const int32_t *src1, const int32_t *win)
68 {
71 
72  declare_func(void, int32_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len);
73 
74  call_ref(ref, src0, src1, win, BUF_SIZE / 2);
75  call_new(new, src0, src1, win, BUF_SIZE / 2);
76  if (memcmp(ref, new, BUF_SIZE * sizeof(int32_t)))
77  fail();
78  bench_new(new, src0, src1, win, BUF_SIZE / 2);
79 }
80 
81 static void check_vector_fmul_window_scaled(const int32_t *src0, const int32_t *src1, const int32_t *win)
82 {
83  LOCAL_ALIGNED_16(int16_t, ref, [BUF_SIZE]);
84  LOCAL_ALIGNED_16(int16_t, new, [BUF_SIZE]);
85 
86  declare_func(void, int16_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len, uint8_t bits);
87 
88  call_ref(ref, src0, src1, win, BUF_SIZE / 2, 2);
89  call_new(new, src0, src1, win, BUF_SIZE / 2, 2);
90  if (memcmp(ref, new, BUF_SIZE * sizeof(int16_t)))
91  fail();
92  bench_new(new, src0, src1, win, BUF_SIZE / 2, 2);
93 }
94 
95 static void check_butterflies(const int *src0, const int *src1)
96 {
97  LOCAL_ALIGNED_16(int, ref0, [BUF_SIZE]);
98  LOCAL_ALIGNED_16(int, ref1, [BUF_SIZE]);
99  LOCAL_ALIGNED_16(int, new0, [BUF_SIZE]);
100  LOCAL_ALIGNED_16(int, new1, [BUF_SIZE]);
101 
102  declare_func(void, int *av_restrict src0, int *av_restrict src1, int len);
103 
104  memcpy(ref0, src0, BUF_SIZE * sizeof(*src0));
105  memcpy(ref1, src1, BUF_SIZE * sizeof(*src1));
106  memcpy(new0, src0, BUF_SIZE * sizeof(*src0));
107  memcpy(new1, src1, BUF_SIZE * sizeof(*src1));
108 
109  call_ref(ref0, ref1, BUF_SIZE);
110  call_new(new0, new1, BUF_SIZE);
111  if (memcmp(ref0, new0, BUF_SIZE * sizeof(*ref0)) ||
112  memcmp(ref1, new1, BUF_SIZE * sizeof(*ref1)))
113  fail();
114  memcpy(new0, src0, BUF_SIZE * sizeof(*src0));
115  memcpy(new1, src1, BUF_SIZE * sizeof(*src1));
116  bench_new(new0, new1, BUF_SIZE);
117 }
118 
119 static void check_scalarproduct_fixed(const int *src0, const int *src1)
120 {
121  int ref, new;
122 
123  declare_func(int, const int *src0, const int *src1, int len);
124 
125  ref = call_ref(src0, src1, BUF_SIZE);
126  new = call_new(src0, src1, BUF_SIZE);
127  if (ref != new)
128  fail();
129  bench_new(src0, src1, BUF_SIZE);
130 }
131 
133 {
138 
140  if (check_func(fdsp->vector_fmul, "vector_fmul_fixed"))
142  if (check_func(fdsp->vector_fmul_add, "vector_fmul_add_fixed"))
144  if (check_func(fdsp->vector_fmul_reverse, "vector_fmul_reverse_fixed"))
146  if (check_func(fdsp->vector_fmul_window, "vector_fmul_window_fixed"))
148  if (check_func(fdsp->vector_fmul_window_scaled, "vector_fmul_window_scaled_fixed"))
150  report("vector_fmul");
151  if (check_func(fdsp->butterflies_fixed, "butterflies_fixed"))
153  report("butterflies_fixed");
154  if (check_func(fdsp->scalarproduct_fixed, "scalarproduct_fixed"))
156  report("scalarproduct_fixed");
157 
158  av_freep(&fdsp);
159 }
#define BUF_SIZE
Definition: fixed_dsp.c:27
Memory handling functions.
static float win(SuperEqualizerContext *s, float n, int N)
#define report
Definition: checkasm.h:125
void(* vector_fmul_add)(int *dst, const int *src0, const int *src1, const int *src2, int len)
Calculate the entry wise product of two vectors of integers, add a third vector of integers and store...
Definition: fixed_dsp.h:132
uint8_t
void(* vector_fmul_reverse)(int *dst, const int *src0, const int *src1, int len)
Definition: fixed_dsp.h:116
static void check_vector_fmul_add(const int *src0, const int *src1, const int *src2)
Definition: fixed_dsp.c:53
int(* scalarproduct_fixed)(const int *v1, const int *v2, int len)
Calculate the scalar product of two vectors of integers.
Definition: fixed_dsp.h:144
#define declare_func(ret,...)
Definition: checkasm.h:117
static void check_vector_fmul_window(const int32_t *src0, const int32_t *src1, const int32_t *win)
Definition: fixed_dsp.c:67
uint8_t bits
Definition: vp3data.h:202
#define fail()
Definition: checkasm.h:122
common internal API header
void(* butterflies_fixed)(int *av_restrict v1, int *av_restrict v2, int len)
Calculate the sum and difference of two vectors of integers.
Definition: fixed_dsp.h:153
void checkasm_check_fixed_dsp(void)
Definition: fixed_dsp.c:132
static void check_scalarproduct_fixed(const int *src0, const int *src1)
Definition: fixed_dsp.c:119
int32_t
void(* vector_fmul_window)(int32_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len)
Overlap/add with window function.
Definition: fixed_dsp.h:98
#define call_ref(...)
Definition: checkasm.h:128
#define src1
Definition: h264pred.c:139
void(* vector_fmul)(int *dst, const int *src0, const int *src1, int len)
Fixed-point multiplication that calculates the entry wise product of two vectors of integers and stor...
Definition: fixed_dsp.h:113
#define check_func(func,...)
Definition: checkasm.h:113
#define src0
Definition: h264pred.c:138
static void check_butterflies(const int *src0, const int *src1)
Definition: fixed_dsp.c:95
AVFixedDSPContext * avpriv_alloc_fixed_dsp(int bit_exact)
Allocate and initialize a fixed DSP context.
Definition: fixed_dsp.c:148
#define LOCAL_ALIGNED_32(t, v,...)
Definition: internal.h:137
common internal and external API header
static int ref[MAX_W *MAX_W]
Definition: jpeg2000dwt.c:107
#define randomize_buffers()
Definition: fixed_dsp.c:29
static void check_vector_fmul(const int *src0, const int *src1)
Definition: fixed_dsp.c:39
static void check_vector_fmul_window_scaled(const int32_t *src0, const int32_t *src1, const int32_t *win)
Definition: fixed_dsp.c:81
int len
#define bench_new(...)
Definition: checkasm.h:255
#define LOCAL_ALIGNED_16(t, v,...)
Definition: internal.h:131
#define av_freep(p)
#define call_new(...)
Definition: checkasm.h:195
void(* vector_fmul_window_scaled)(int16_t *dst, const int32_t *src0, const int32_t *src1, const int32_t *win, int len, uint8_t bits)
Overlap/add with window function.
Definition: fixed_dsp.h:80