FFmpeg
tests
checkasm
idctdsp.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2022 Ben Avison
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 <string.h>
22
23
#include "
checkasm.h
"
24
25
#include "
libavcodec/avcodec.h
"
26
#include "
libavcodec/idctdsp.h
"
27
28
#include "
libavutil/common.h
"
29
#include "
libavutil/internal.h
"
30
#include "
libavutil/intreadwrite.h
"
31
#include "
libavutil/mem_internal.h
"
32
33
#define IDCTDSP_TEST(func) { #func, offsetof(IDCTDSPContext, func) },
34
35
typedef
struct
{
36
const
char
*
name
;
37
size_t
offset
;
38
}
test
;
39
40
#define RANDOMIZE_BUFFER16(name, size) \
41
do { \
42
int i; \
43
for (i = 0; i < size; ++i) { \
44
uint16_t r = rnd() % 0x201 - 0x100; \
45
AV_WN16A(name##0 + i, r); \
46
AV_WN16A(name##1 + i, r); \
47
} \
48
} while (0)
49
50
#define RANDOMIZE_BUFFER8(name, size) \
51
do { \
52
int i; \
53
for (i = 0; i < size; ++i) { \
54
uint8_t r = rnd(); \
55
name##0[i] = r; \
56
name##1[i] = r; \
57
} \
58
} while (0)
59
60
static
void
check_add_put_clamped
(
void
)
61
{
62
/* Source buffers are only as big as needed, since any over-read won't affect results */
63
LOCAL_ALIGNED_16
(int16_t,
src0
, [64]);
64
LOCAL_ALIGNED_16
(int16_t,
src1
, [64]);
65
/* Destination buffers have borders of one row above/below and 8 columns left/right to catch overflows */
66
LOCAL_ALIGNED_8
(uint8_t, dst0, [10 * 24]);
67
LOCAL_ALIGNED_8
(uint8_t, dst1, [10 * 24]);
68
69
AVCodecContext
avctx = { 0 };
70
IDCTDSPContext
h
;
71
72
const
test
tests
[] = {
73
IDCTDSP_TEST
(add_pixels_clamped)
74
IDCTDSP_TEST
(put_pixels_clamped)
75
IDCTDSP_TEST
(put_signed_pixels_clamped)
76
};
77
78
ff_idctdsp_init
(&
h
, &avctx);
79
80
for
(
size_t
t = 0; t <
FF_ARRAY_ELEMS
(
tests
); ++t) {
81
void (*
func
)(
const
int16_t *, uint8_t * ptrdiff_t) = *(
void
**)((intptr_t) &
h
+
tests
[t].
offset
);
82
if
(
check_func
(
func
,
"idctdsp.%s"
,
tests
[t].
name
)) {
83
declare_func
(
void
,
const
int16_t *, uint8_t *, ptrdiff_t);
84
RANDOMIZE_BUFFER16
(
src
, 64);
85
RANDOMIZE_BUFFER8
(dst, 10 * 24);
86
call_ref
(
src0
, dst0 + 24 + 8, 24);
87
call_new
(
src1
, dst1 + 24 + 8, 24);
88
if
(memcmp(dst0, dst1, 10 * 24))
89
fail
();
90
bench_new
(
src1
, dst1 + 24 + 8, 24);
91
}
92
}
93
}
94
95
void
checkasm_check_idctdsp
(
void
)
96
{
97
check_add_put_clamped
();
98
report
(
"idctdsp"
);
99
}
func
int(* func)(AVBPrint *dst, const char *in, const char *arg)
Definition:
jacosubdec.c:68
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition:
writing_filters.txt:88
mem_internal.h
src1
const pixel * src1
Definition:
h264pred_template.c:421
check_func
#define check_func(func,...)
Definition:
checkasm.h:129
test
Definition:
idctdsp.c:35
call_ref
#define call_ref(...)
Definition:
checkasm.h:144
ff_idctdsp_init
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition:
idctdsp.c:228
fail
#define fail()
Definition:
checkasm.h:138
checkasm.h
check_add_put_clamped
static void check_add_put_clamped(void)
Definition:
idctdsp.c:60
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition:
sinewin_tablegen.c:29
intreadwrite.h
LOCAL_ALIGNED_16
#define LOCAL_ALIGNED_16(t, v,...)
Definition:
mem_internal.h:129
LOCAL_ALIGNED_8
#define LOCAL_ALIGNED_8(t, v,...)
Definition:
mem_internal.h:123
call_new
#define call_new(...)
Definition:
checkasm.h:226
test::name
const char * name
Definition:
idctdsp.c:36
RANDOMIZE_BUFFER16
#define RANDOMIZE_BUFFER16(name, size)
Definition:
idctdsp.c:40
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition:
writing_filters.txt:86
IDCTDSP_TEST
#define IDCTDSP_TEST(func)
Definition:
idctdsp.c:33
tests
const TestCase tests[]
Definition:
fifo_muxer.c:242
report
#define report
Definition:
checkasm.h:141
bench_new
#define bench_new(...)
Definition:
checkasm.h:291
internal.h
test::offset
size_t offset
Definition:
idctdsp.c:37
common.h
idctdsp.h
avcodec.h
checkasm_check_idctdsp
void checkasm_check_idctdsp(void)
Definition:
idctdsp.c:95
IDCTDSPContext
Definition:
idctdsp.h:45
AVCodecContext
main external API structure.
Definition:
avcodec.h:441
test
static void test(const char *pattern, const char *host)
Definition:
noproxy.c:23
src0
const pixel *const src0
Definition:
h264pred_template.c:420
declare_func
#define declare_func(ret,...)
Definition:
checkasm.h:133
src
INIT_CLIP pixel * src
Definition:
h264pred_template.c:418
h
h
Definition:
vp9dsp_template.c:2038
RANDOMIZE_BUFFER8
#define RANDOMIZE_BUFFER8(name, size)
Definition:
idctdsp.c:50
Generated on Thu Apr 18 2024 22:41:52 for FFmpeg by
1.8.17