2 * Copyright (c) 2015 James Almer
4 * This file is part of FFmpeg.
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.
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.
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.
22 #include "libavcodec/jpeg2000dsp.h"
23 #include "libavutil/common.h"
24 #include "libavutil/internal.h"
25 #include "libavutil/intreadwrite.h"
26 #include "libavutil/mem_internal.h"
30 #define randomize_buffers() \
33 for (i = 0; i < BUF_SIZE*3; i++) \
37 #define randomize_buffers_float() \
40 for (i = 0; i < BUF_SIZE*3; i++) \
41 src[i] = (float)rnd() / (UINT_MAX >> 5); \
44 static void check_rct_int(void)
46 LOCAL_ALIGNED_32(int32_t, src
, [BUF_SIZE
*3]);
47 LOCAL_ALIGNED_32(int32_t, ref
, [BUF_SIZE
*3]);
48 LOCAL_ALIGNED_32(int32_t, new, [BUF_SIZE
*3]);
49 int32_t *ref0
= &ref
[BUF_SIZE
*0], *new0
= &new[BUF_SIZE
*0];
50 int32_t *ref1
= &ref
[BUF_SIZE
*1], *new1
= &new[BUF_SIZE
*1];
51 int32_t *ref2
= &ref
[BUF_SIZE
*2], *new2
= &new[BUF_SIZE
*2];
53 declare_func(void, void *src0
, void *src1
, void *src2
, int csize
);
56 memcpy(ref
, src
, BUF_SIZE
* 3 * sizeof(*src
));
57 memcpy(new, src
, BUF_SIZE
* 3 * sizeof(*src
));
58 call_ref(ref0
, ref1
, ref2
, BUF_SIZE
);
59 call_new(new0
, new1
, new2
, BUF_SIZE
);
60 if (memcmp(ref0
, new0
, BUF_SIZE
* sizeof(*src
)) ||
61 memcmp(ref1
, new1
, BUF_SIZE
* sizeof(*src
)) ||
62 memcmp(ref2
, new2
, BUF_SIZE
* sizeof(*src
)))
64 memcpy(new, src
, BUF_SIZE
* 3 * sizeof(*src
));
65 bench_new(new0
, new1
, new2
, BUF_SIZE
);
68 static void check_ict_float(void)
70 LOCAL_ALIGNED_32(float, src
, [BUF_SIZE
*3]);
71 LOCAL_ALIGNED_32(float, ref
, [BUF_SIZE
*3]);
72 LOCAL_ALIGNED_32(float, new, [BUF_SIZE
*3]);
73 float *ref0
= &ref
[BUF_SIZE
*0], *new0
= &new[BUF_SIZE
*0];
74 float *ref1
= &ref
[BUF_SIZE
*1], *new1
= &new[BUF_SIZE
*1];
75 float *ref2
= &ref
[BUF_SIZE
*2], *new2
= &new[BUF_SIZE
*2];
77 declare_func(void, void *src0
, void *src1
, void *src2
, int csize
);
79 randomize_buffers_float();
80 memcpy(ref
, src
, BUF_SIZE
* 3 * sizeof(*src
));
81 memcpy(new, src
, BUF_SIZE
* 3 * sizeof(*src
));
82 call_ref(ref0
, ref1
, ref2
, BUF_SIZE
);
83 call_new(new0
, new1
, new2
, BUF_SIZE
);
84 if (!float_near_abs_eps_array(ref0
, new0
, 1.0e-5, BUF_SIZE
) ||
85 !float_near_abs_eps_array(ref1
, new1
, 1.0e-5, BUF_SIZE
) ||
86 !float_near_abs_eps_array(ref2
, new2
, 1.0e-5, BUF_SIZE
))
88 memcpy(new, src
, BUF_SIZE
* 3 * sizeof(*src
));
89 bench_new(new0
, new1
, new2
, BUF_SIZE
);
92 void checkasm_check_jpeg2000dsp(void)
96 ff_jpeg2000dsp_init(&h
);
98 if (check_func(h
.mct_decode
[FF_DWT53
], "jpeg2000_rct_int"))
100 if (check_func(h
.mct_decode
[FF_DWT97
], "jpeg2000_ict_float"))
103 report("mct_decode");