From 4873e7e0b2cd4af9434ba4e49e30af7762786e82 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 25 Mar 2010 04:45:53 +0000 Subject: [PATCH] Test 1 through 8 channels, all quality levels, all main sample rates. This caught another codebook error in the 16kHz books svn path=/trunk/vorbis/; revision=17024 --- test/test.c | 46 ++++++++++--------- test/write_read.c | 129 +++++++++++++++++++++++++++--------------------------- test/write_read.h | 2 +- 3 files changed, 90 insertions(+), 87 deletions(-) diff --git a/test/test.c b/test/test.c index b777e87..a5cfe14 100644 --- a/test/test.c +++ b/test/test.c @@ -38,32 +38,36 @@ main(void){ int sample_rates [] = { 44100, 48000, 32000, 22050, 16000, 96000 } ; unsigned k ; int errors = 0 ; - float q=-.05; + int ch; gen_windowed_sine (data_out, ARRAY_LEN (data_out), 0.95); - while(q<1.){ - for (k = 0 ; k < ARRAY_LEN (sample_rates); k ++) { - char filename [64] ; - snprintf (filename, sizeof (filename), "vorbis_q%.1f_%u.ogg", q*10,sample_rates [k]); - - printf (" %-20s : ", filename); - fflush (stdout); - - /* Set to know value. */ - set_data_in (data_in, ARRAY_LEN (data_in), 3.141); - - write_vorbis_data_or_die (filename, sample_rates [k], q, data_out, ARRAY_LEN (data_out)); - read_vorbis_data_or_die (filename, sample_rates [k], data_in, ARRAY_LEN (data_in)); - - if (check_output (data_in, ARRAY_LEN (data_in), (.15f - .1f*q)) != 0) - errors ++ ; - else { - puts ("ok"); - remove (filename); + for(ch=1;ch<=8;ch++){ + float q=-.05; + printf("\nTesting %d channel%s\n\n",ch,ch==1?"":"s"); + while(q<1.){ + for (k = 0 ; k < ARRAY_LEN (sample_rates); k ++) { + char filename [64] ; + snprintf (filename, sizeof (filename), "vorbis_%dch_q%.1f_%u.ogg", ch,q*10,sample_rates [k]); + + printf (" %-20s : ", filename); + fflush (stdout); + + /* Set to know value. */ + set_data_in (data_in, ARRAY_LEN (data_in), 3.141); + + write_vorbis_data_or_die (filename, sample_rates [k], q, data_out, ARRAY_LEN (data_out),ch); + read_vorbis_data_or_die (filename, sample_rates [k], data_in, ARRAY_LEN (data_in)); + + if (check_output (data_in, ARRAY_LEN (data_in), (.15f - .1f*q)) != 0) + errors ++ ; + else { + puts ("ok"); + remove (filename); + } } + q+=.1; } - q+=.1; } if (errors) diff --git a/test/write_read.c b/test/write_read.c index 4fa5686..e177ae4 100644 --- a/test/write_read.c +++ b/test/write_read.c @@ -29,7 +29,7 @@ /* The following function is basically a hacked version of the code in * examples/encoder_example.c */ void -write_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count) +write_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count, int ch) { FILE * file ; ogg_stream_state os; @@ -51,7 +51,7 @@ write_vorbis_data_or_die (const char *filename, int srate, float q, const float vorbis_info_init (&vi); - ret = vorbis_encode_init_vbr (&vi,1,srate,q); + ret = vorbis_encode_init_vbr (&vi,ch,srate,q); if (ret) { printf ("vorbis_encode_init_vbr return %d\n", ret) ; exit (1) ; @@ -88,8 +88,10 @@ write_vorbis_data_or_die (const char *filename, int srate, float q, const float { /* expose the buffer to submit data */ float **buffer = vorbis_analysis_buffer (&vd,count); + int i; - memcpy (buffer [0], data, count * sizeof (float)) ; + for(i=0;i 0 && read_total < count) { - int bout = samples < count ? samples : count; - bout = read_total + bout > count ? count - read_total : bout; + if (vorbis_synthesis (&vb,&op) == 0) + vorbis_synthesis_blockin(&vd,&vb); + while ((samples = vorbis_synthesis_pcmout (&vd,&pcm)) > 0 && read_total < count) { + int bout = samples < count ? samples : count; + bout = read_total + bout > count ? count - read_total : bout; - memcpy (data + read_total, pcm[0], bout * sizeof (float)) ; + memcpy (data + read_total, pcm[0], bout * sizeof (float)) ; - vorbis_synthesis_read (&vd,bout); - read_total += bout ; + vorbis_synthesis_read (&vd,bout); + read_total += bout ; + } } } - } - if (ogg_page_eos (&og)) eos = 1; + if (ogg_page_eos (&og)) eos = 1; + } } - } if (!eos) { buffer = ogg_sync_buffer (&oy,4096); @@ -287,7 +287,6 @@ read_vorbis_data_or_die (const char *filename, int srate, float * data, int coun vorbis_dsp_clear (&vd); vorbis_comment_clear (&vc); vorbis_info_clear (&vi); - } done_decode: diff --git a/test/write_read.h b/test/write_read.h index 51674ea..98f5bc6 100644 --- a/test/write_read.h +++ b/test/write_read.h @@ -18,7 +18,7 @@ /* Write supplied data to an Ogg/Vorbis file with specified filename at * specified sample rate. Assumes a single channel of audio. */ void write_vorbis_data_or_die (const char *filename, int srate, float q, - const float * data, int count) ; + const float * data, int count, int ch) ; /* Read given Ogg/Vorbis file into data specified data array. This * function is basically the inverse of the one above. Again, assumes -- 2.7.4