@@ -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
165201void 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