Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52869 views
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 <string.h>
22
#include "checkasm.h"
23
#include "libavcodec/alacdsp.h"
24
#include "libavcodec/mathops.h"
25
#include "libavutil/common.h"
26
#include "libavutil/internal.h"
27
28
#define BUF_SIZE 256
29
#define MAX_CHANNELS 2
30
31
#define randomize_buffers() \
32
do { \
33
int i; \
34
for (i = 0; i < BUF_SIZE*MAX_CHANNELS; i++) { \
35
int32_t r = sign_extend(rnd(), 24); \
36
ref_buf[i] = r; \
37
new_buf[i] = r; \
38
} \
39
} while (0)
40
41
static void check_decorrelate_stereo(void)
42
{
43
LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS]);
44
LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS]);
45
int32_t *ref[2] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
46
int32_t *new[2] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
47
ALACDSPContext c;
48
49
ff_alacdsp_init(&c);
50
if (check_func(c.decorrelate_stereo, "alac_decorrelate_stereo")) {
51
int len = (rnd() & 0xFF) + 1;
52
int shift = rnd() & 0x1F;
53
int weight = rnd() & 0xFF;
54
declare_func(void, int32_t *buf[2], int len, int shift, int weight);
55
56
randomize_buffers();
57
call_ref(ref, len, shift, weight);
58
call_new(new, len, shift, weight);
59
if (memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
60
memcmp(ref[1], new[1], len * sizeof(int32_t)))
61
fail();
62
bench_new(new, BUF_SIZE, shift, weight);
63
}
64
65
report("decorrelate_stereo");
66
}
67
68
#undef randomize_buffers
69
#define randomize_buffers() \
70
do { \
71
int i, j; \
72
for (i = 0; i < BUF_SIZE; i++) { \
73
for (j = 0; j < ch; j++) { \
74
int32_t r = sign_extend(rnd(), 24); \
75
ref[j][i] = r; \
76
new[j][i] = r; \
77
r = rnd() & 0xFF; \
78
ref_ebb[j][i] = r; \
79
new_ebb[j][i] = r; \
80
} \
81
} \
82
} while (0)
83
84
static void check_append_extra_bits(void)
85
{
86
LOCAL_ALIGNED_16(int32_t, ref_buf, [BUF_SIZE*MAX_CHANNELS*2]);
87
LOCAL_ALIGNED_16(int32_t, new_buf, [BUF_SIZE*MAX_CHANNELS*2]);
88
int32_t *ref[2] = { &ref_buf[BUF_SIZE*0], &ref_buf[BUF_SIZE*1] };
89
int32_t *new[2] = { &new_buf[BUF_SIZE*0], &new_buf[BUF_SIZE*1] };
90
int32_t *ref_ebb[2] = { &ref_buf[BUF_SIZE*2], &ref_buf[BUF_SIZE*3] };
91
int32_t *new_ebb[2] = { &new_buf[BUF_SIZE*2], &new_buf[BUF_SIZE*3] };
92
ALACDSPContext c;
93
static const char * const channels[2] = { "mono", "stereo" };
94
int ch;
95
96
ff_alacdsp_init(&c);
97
for (ch = 1; ch <= 2; ch++) {
98
if (check_func(c.append_extra_bits[ch-1], "alac_append_extra_bits_%s", channels[ch-1])) {
99
int len = (rnd() & 0xFF) + 1;
100
declare_func(void, int32_t *buf[2], int32_t *ebb[2], int ebits, int ch, int len);
101
102
randomize_buffers();
103
call_ref(ref, ref_ebb, 8, ch, len);
104
call_new(new, new_ebb, 8, ch, len);
105
if ( memcmp(ref[0], new[0], len * sizeof(int32_t)) ||
106
(ch == 2 && memcmp(ref[1], new[1], len * sizeof(int32_t))))
107
fail();
108
bench_new(new, new_ebb, 8, ch, BUF_SIZE);
109
}
110
}
111
112
report("append_extra_bits");
113
}
114
115
void checkasm_check_alacdsp(void)
116
{
117
check_decorrelate_stereo();
118
check_append_extra_bits();
119
}
120
121