Skip to content

Commit cbc7327

Browse files
committed
Add 24-bit and float32 support to qext_compare
1 parent 5ddaee4 commit cbc7327

File tree

1 file changed

+64
-14
lines changed

1 file changed

+64
-14
lines changed

src/qext_compare.c

Lines changed: 64 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,18 @@ static void *opus_realloc(void *_ptr,size_t _size){
5151
return check_alloc(realloc(_ptr,_size));
5252
}
5353

54-
static size_t read_pcm16(float **_samples,FILE *_fin,int _nchannels){
54+
#define FORMAT_S16_LE 0
55+
#define FORMAT_S24_LE 1
56+
#define FORMAT_F32_LE 2
57+
58+
static const int format_size[3] = {2, 3, 4};
59+
typedef union {
60+
int i;
61+
float f;
62+
} float_bits;
63+
64+
65+
static size_t read_pcm(float **_samples,FILE *_fin,int _nchannels, int format){
5566
unsigned char buf[1024];
5667
float *samples;
5768
size_t nsamples;
@@ -60,24 +71,49 @@ static size_t read_pcm16(float **_samples,FILE *_fin,int _nchannels){
6071
size_t nread;
6172
samples=NULL;
6273
nsamples=csamples=0;
74+
int size = format_size[format];
75+
6376
for(;;){
64-
nread=fread(buf,2*_nchannels,1024/(2*_nchannels),_fin);
77+
nread=fread(buf,size*_nchannels,1024/(size*_nchannels),_fin);
6578
if(nread<=0)break;
6679
if(nsamples+nread>csamples){
6780
do csamples=csamples<<1|1;
6881
while(nsamples+nread>csamples);
6982
samples=(float *)opus_realloc(samples,
7083
_nchannels*csamples*sizeof(*samples));
7184
}
72-
for(xi=0;xi<nread;xi++){
73-
int ci;
74-
for(ci=0;ci<_nchannels;ci++){
75-
int s;
76-
s=buf[2*(xi*_nchannels+ci)+1]<<8|buf[2*(xi*_nchannels+ci)];
77-
s=((s&0xFFFF)^0x8000)-0x8000;
78-
samples[(nsamples+xi)*_nchannels+ci]=s;
85+
if (format==FORMAT_S16_LE) {
86+
for(xi=0;xi<nread;xi++){
87+
int ci;
88+
for(ci=0;ci<_nchannels;ci++){
89+
int s;
90+
s=buf[2*(xi*_nchannels+ci)+1]<<8|buf[2*(xi*_nchannels+ci)];
91+
s=((s&0xFFFF)^0x8000)-0x8000;
92+
samples[(nsamples+xi)*_nchannels+ci]=s;
93+
}
94+
}
95+
} else if (format==FORMAT_S24_LE) {
96+
for(xi=0;xi<nread;xi++){
97+
int ci;
98+
for(ci=0;ci<_nchannels;ci++){
99+
int s;
100+
s=buf[3*(xi*_nchannels+ci)+2]<<16|buf[3*(xi*_nchannels+ci)+1]<<8|buf[3*(xi*_nchannels+ci)];
101+
s=((s&0xFFFFFF)^0x800000)-0x800000;
102+
samples[(nsamples+xi)*_nchannels+ci]=(1.f/256.f)*s;
103+
}
104+
}
105+
} else if (format==FORMAT_F32_LE) {
106+
for(xi=0;xi<nread;xi++){
107+
int ci;
108+
for(ci=0;ci<_nchannels;ci++){
109+
float_bits s;
110+
s.i=(unsigned)buf[4*(xi*_nchannels+ci)+3]<<24|buf[4*(xi*_nchannels+ci)+2]<<16|buf[4*(xi*_nchannels+ci)+1]<<8|buf[4*(xi*_nchannels+ci)];
111+
samples[(nsamples+xi)*_nchannels+ci] = s.f*32768;
112+
}
113+
}
114+
} else {
115+
exit(1);
79116
}
80-
}
81117
nsamples+=nread;
82118
}
83119
*_samples=(float *)opus_realloc(samples,
@@ -163,7 +199,7 @@ static const int BANDS[NBANDS+1]={
163199
#define TEST_WIN_STEP (120*2)
164200

165201
void usage(const char *_argv0) {
166-
fprintf(stderr,"Usage: %s [-s] [-48] [-r rate2] <file1.sw> <file2.sw>\n",
202+
fprintf(stderr,"Usage: %s [-s] [-48k] [-s16|-s24|-f32] [-r rate2] <file1.sw> <file2.sw>\n",
167203
_argv0);
168204
}
169205

@@ -195,6 +231,7 @@ int main(int _argc,const char **_argv){
195231
size_t test_win_size;
196232
size_t test_win_step;
197233
int max_compare;
234+
int format;
198235
const char *argv0 = _argv[0];
199236
if(_argc<3){
200237
usage(argv0);
@@ -208,15 +245,28 @@ int main(int _argc,const char **_argv){
208245
test_win_size=TEST_WIN_SIZE;
209246
test_win_step=TEST_WIN_STEP;
210247
downsample=1;
248+
format=FORMAT_S16_LE;
211249
while (_argc > 3) {
212250
if(strcmp(_argv[1],"-s")==0){
213251
nchannels=2;
214252
_argv++;
215253
_argc--;
216-
} else if(strcmp(_argv[1],"-48")==0){
254+
} else if(strcmp(_argv[1],"-48k")==0){
217255
base_rate=48000;
218256
_argv++;
219257
_argc--;
258+
} else if(strcmp(_argv[1],"-s16")==0){
259+
format=FORMAT_S16_LE;
260+
_argv++;
261+
_argc--;
262+
} else if(strcmp(_argv[1],"-s24")==0){
263+
format=FORMAT_S24_LE;
264+
_argv++;
265+
_argc--;
266+
} else if(strcmp(_argv[1],"-f32")==0){
267+
format=FORMAT_F32_LE;
268+
_argv++;
269+
_argc--;
220270
} else if(strcmp(_argv[1],"-r")==0){
221271
rate=atoi(_argv[2]);
222272
if(rate!=8000&&rate!=12000&&rate!=16000&&rate!=24000&&rate!=48000&&rate!=96000){
@@ -267,12 +317,12 @@ int main(int _argc,const char **_argv){
267317
return EXIT_FAILURE;
268318
}
269319
/*Read in the data and allocate scratch space.*/
270-
xlength=read_pcm16(&x,fin1,2);
320+
xlength=read_pcm(&x,fin1,2,format);
271321
if(nchannels==1){
272322
for(xi=0;xi<xlength;xi++)x[xi]=.5*(x[2*xi]+x[2*xi+1]);
273323
}
274324
fclose(fin1);
275-
ylength=read_pcm16(&y,fin2,nchannels);
325+
ylength=read_pcm(&y,fin2,nchannels,format);
276326
fclose(fin2);
277327
if(xlength!=ylength*downsample){
278328
fprintf(stderr,"Sample counts do not match (%lu!=%lu).\n",

0 commit comments

Comments
 (0)