annotate src/libsndfile-1.0.25/tests/vorbis_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2007-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include "sfconfig.h"
Chris@0 20
Chris@0 21 #include <stdio.h>
Chris@0 22 #include <stdlib.h>
Chris@0 23 #include <string.h>
Chris@0 24 #include <unistd.h>
Chris@0 25
Chris@0 26 #include <math.h>
Chris@0 27
Chris@0 28 #include <sndfile.h>
Chris@0 29
Chris@0 30 #include "utils.h"
Chris@0 31 #include "dft_cmp.h"
Chris@0 32
Chris@0 33 #define SAMPLE_RATE 16000
Chris@0 34 #define DATA_LENGTH (SAMPLE_RATE / 8)
Chris@0 35
Chris@0 36 static float data_out [DATA_LENGTH] ;
Chris@0 37
Chris@0 38 static inline float
Chris@0 39 max_float (float a, float b)
Chris@0 40 { return a > b ? a : b ;
Chris@0 41 } /* max_float */
Chris@0 42
Chris@0 43 static void
Chris@0 44 vorbis_test (void)
Chris@0 45 { static float float_data [DFT_DATA_LENGTH] ;
Chris@0 46 const char * filename = "vorbis_test.oga" ;
Chris@0 47 SNDFILE * file ;
Chris@0 48 SF_INFO sfinfo ;
Chris@0 49 float max_abs = 0.0 ;
Chris@0 50 unsigned k ;
Chris@0 51
Chris@0 52 print_test_name ("vorbis_test", filename) ;
Chris@0 53
Chris@0 54 /* Generate float data. */
Chris@0 55 gen_windowed_sine_float (float_data, ARRAY_LEN (float_data), 1.0) ;
Chris@0 56
Chris@0 57 /* Set up output file type. */
Chris@0 58 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 59 sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
Chris@0 60 sfinfo.channels = 1 ;
Chris@0 61 sfinfo.samplerate = SAMPLE_RATE ;
Chris@0 62
Chris@0 63 /* Write the output file. */
Chris@0 64
Chris@0 65 /* The Vorbis encoder has a bug on PowerPC and X86-64 with sample rates
Chris@0 66 ** <= 22050. Increasing the sample rate to 32000 avoids triggering it.
Chris@0 67 ** See https://trac.xiph.org/ticket/1229
Chris@0 68 */
Chris@0 69 if ((file = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
Chris@0 70 { const char * errstr ;
Chris@0 71
Chris@0 72 errstr = sf_strerror (NULL) ;
Chris@0 73 if (strstr (errstr, "Sample rate chosen is known to trigger a Vorbis") == NULL)
Chris@0 74 { printf ("Line %d: sf_open (SFM_WRITE) failed : %s\n", __LINE__, errstr) ;
Chris@0 75 dump_log_buffer (NULL) ;
Chris@0 76 exit (1) ;
Chris@0 77 } ;
Chris@0 78
Chris@0 79 printf ("\n Sample rate -> 32kHz ") ;
Chris@0 80 sfinfo.samplerate = 32000 ;
Chris@0 81
Chris@0 82 file = test_open_file_or_die (filename, SFM_WRITE, &sfinfo, SF_TRUE, __LINE__) ;
Chris@0 83 } ;
Chris@0 84
Chris@0 85 test_write_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ;
Chris@0 86 sf_close (file) ;
Chris@0 87
Chris@0 88 memset (float_data, 0, sizeof (float_data)) ;
Chris@0 89
Chris@0 90 /* Read the file back in again. */
Chris@0 91 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 92 file = test_open_file_or_die (filename, SFM_READ, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 93 test_read_float_or_die (file, 0, float_data, ARRAY_LEN (float_data), __LINE__) ;
Chris@0 94 sf_close (file) ;
Chris@0 95
Chris@0 96 for (k = 0 ; k < ARRAY_LEN (float_data) ; k ++)
Chris@0 97 max_abs = max_float (max_abs, fabs (float_data [k])) ;
Chris@0 98
Chris@0 99 if (max_abs > 1.021)
Chris@0 100 { printf ("\n\n Error : max_abs %f should be < 1.021.\n\n", max_abs) ;
Chris@0 101 exit (1) ;
Chris@0 102 } ;
Chris@0 103
Chris@0 104 puts ("ok") ;
Chris@0 105 unlink (filename) ;
Chris@0 106 } /* vorbis_test */
Chris@0 107
Chris@0 108 static void
Chris@0 109 vorbis_quality_test (void)
Chris@0 110 { /*
Chris@0 111 ** Encode two files, one at quality 0.3 and one at quality 0.5 and then
Chris@0 112 ** make sure that the quality 0.3 files is the smaller of the two.
Chris@0 113 */
Chris@0 114 const char * q3_fname = "q3_vorbis.oga" ;
Chris@0 115 const char * q5_fname = "q5_vorbis.oga" ;
Chris@0 116
Chris@0 117 SNDFILE *q3_file, *q5_file ;
Chris@0 118 SF_INFO sfinfo ;
Chris@0 119 int q3_size, q5_size ;
Chris@0 120 double quality ;
Chris@0 121 int k ;
Chris@0 122
Chris@0 123 print_test_name (__func__, "q[35]_vorbis.oga") ;
Chris@0 124
Chris@0 125 memset (&sfinfo, 0, sizeof (sfinfo)) ;
Chris@0 126
Chris@0 127 /* Set up output file type. */
Chris@0 128 sfinfo.format = SF_FORMAT_OGG | SF_FORMAT_VORBIS ;
Chris@0 129 sfinfo.channels = 1 ;
Chris@0 130 sfinfo.samplerate = SAMPLE_RATE ;
Chris@0 131
Chris@0 132 /* Write the output file. */
Chris@0 133 q3_file = test_open_file_or_die (q3_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 134 q5_file = test_open_file_or_die (q5_fname, SFM_WRITE, &sfinfo, SF_FALSE, __LINE__) ;
Chris@0 135
Chris@0 136 quality = 0.3 ;
Chris@0 137 sf_command (q3_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ;
Chris@0 138 quality = 0.5 ;
Chris@0 139 sf_command (q5_file, SFC_SET_VBR_ENCODING_QUALITY, &quality, sizeof (quality)) ;
Chris@0 140
Chris@0 141 for (k = 0 ; k < 5 ; k++)
Chris@0 142 { gen_lowpass_noise_float (data_out, ARRAY_LEN (data_out)) ;
Chris@0 143 test_write_float_or_die (q3_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ;
Chris@0 144 test_write_float_or_die (q5_file, 0, data_out, ARRAY_LEN (data_out), __LINE__) ;
Chris@0 145 } ;
Chris@0 146
Chris@0 147 sf_close (q3_file) ;
Chris@0 148 sf_close (q5_file) ;
Chris@0 149
Chris@0 150 q3_size = file_length (q3_fname) ;
Chris@0 151 q5_size = file_length (q5_fname) ;
Chris@0 152
Chris@0 153 if (q3_size >= q5_size)
Chris@0 154 { printf ("\n\nLine %d : q3 size (%d) >= q5 size (%d)\n\n", __LINE__, q3_size, q5_size) ;
Chris@0 155 exit (1) ;
Chris@0 156 } ;
Chris@0 157
Chris@0 158 puts ("ok") ;
Chris@0 159 unlink (q3_fname) ;
Chris@0 160 unlink (q5_fname) ;
Chris@0 161 } /* vorbis_quality_test */
Chris@0 162
Chris@0 163
Chris@0 164
Chris@0 165 int
Chris@0 166 main (void)
Chris@0 167 {
Chris@0 168 if (HAVE_EXTERNAL_LIBS)
Chris@0 169 { vorbis_test () ;
Chris@0 170 vorbis_quality_test () ;
Chris@0 171 }
Chris@0 172 else
Chris@0 173 puts (" No Ogg/Vorbis tests because Ogg/Vorbis support was not compiled in.") ;
Chris@0 174
Chris@0 175 return 0 ;
Chris@0 176 } /* main */