annotate src/libvorbis-1.3.3/test/write_read.c @ 86:98c1576536ae

Bring in flac, ogg, vorbis
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 19 Mar 2013 17:37:49 +0000
parents
children
rev   line source
cannam@86 1 /********************************************************************
cannam@86 2 * *
cannam@86 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
cannam@86 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
cannam@86 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
cannam@86 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
cannam@86 7 * *
cannam@86 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 *
cannam@86 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
cannam@86 10 * *
cannam@86 11 ********************************************************************
cannam@86 12
cannam@86 13 function: utility functions for vorbis codec test suite.
cannam@86 14 last mod: $Id: util.c 13293 2007-07-24 00:09:47Z erikd $
cannam@86 15
cannam@86 16 ********************************************************************/
cannam@86 17
cannam@86 18 #include <stdio.h>
cannam@86 19 #include <stdlib.h>
cannam@86 20 #include <math.h>
cannam@86 21 #include <string.h>
cannam@86 22 #include <errno.h>
cannam@86 23
cannam@86 24 #include <vorbis/codec.h>
cannam@86 25 #include <vorbis/vorbisenc.h>
cannam@86 26
cannam@86 27 #include "write_read.h"
cannam@86 28
cannam@86 29 /* The following function is basically a hacked version of the code in
cannam@86 30 * examples/encoder_example.c */
cannam@86 31 void
cannam@86 32 write_vorbis_data_or_die (const char *filename, int srate, float q, const float * data, int count, int ch)
cannam@86 33 {
cannam@86 34 FILE * file ;
cannam@86 35 ogg_stream_state os;
cannam@86 36 ogg_page og;
cannam@86 37 ogg_packet op;
cannam@86 38 vorbis_info vi;
cannam@86 39 vorbis_comment vc;
cannam@86 40 vorbis_dsp_state vd;
cannam@86 41 vorbis_block vb;
cannam@86 42
cannam@86 43 int eos = 0, ret;
cannam@86 44
cannam@86 45 if ((file = fopen (filename, "wb")) == NULL) {
cannam@86 46 printf("\n\nError : fopen failed : %s\n", strerror (errno)) ;
cannam@86 47 exit (1) ;
cannam@86 48 }
cannam@86 49
cannam@86 50 /********** Encode setup ************/
cannam@86 51
cannam@86 52 vorbis_info_init (&vi);
cannam@86 53
cannam@86 54 ret = vorbis_encode_init_vbr (&vi,ch,srate,q);
cannam@86 55 if (ret) {
cannam@86 56 printf ("vorbis_encode_init_vbr return %d\n", ret) ;
cannam@86 57 exit (1) ;
cannam@86 58 }
cannam@86 59
cannam@86 60 vorbis_comment_init (&vc);
cannam@86 61 vorbis_comment_add_tag (&vc,"ENCODER","test/util.c");
cannam@86 62 vorbis_analysis_init (&vd,&vi);
cannam@86 63 vorbis_block_init (&vd,&vb);
cannam@86 64
cannam@86 65 ogg_stream_init (&os,12345678);
cannam@86 66
cannam@86 67 {
cannam@86 68 ogg_packet header;
cannam@86 69 ogg_packet header_comm;
cannam@86 70 ogg_packet header_code;
cannam@86 71
cannam@86 72 vorbis_analysis_headerout (&vd,&vc,&header,&header_comm,&header_code);
cannam@86 73 ogg_stream_packetin (&os,&header);
cannam@86 74 ogg_stream_packetin (&os,&header_comm);
cannam@86 75 ogg_stream_packetin (&os,&header_code);
cannam@86 76
cannam@86 77 /* Ensures the audio data will start on a new page. */
cannam@86 78 while (!eos){
cannam@86 79 int result = ogg_stream_flush (&os,&og);
cannam@86 80 if (result == 0)
cannam@86 81 break;
cannam@86 82 fwrite (og.header,1,og.header_len,file);
cannam@86 83 fwrite (og.body,1,og.body_len,file);
cannam@86 84 }
cannam@86 85
cannam@86 86 }
cannam@86 87
cannam@86 88 {
cannam@86 89 /* expose the buffer to submit data */
cannam@86 90 float **buffer = vorbis_analysis_buffer (&vd,count);
cannam@86 91 int i;
cannam@86 92
cannam@86 93 for(i=0;i<ch;i++)
cannam@86 94 memcpy (buffer [i], data, count * sizeof (float)) ;
cannam@86 95
cannam@86 96 /* tell the library how much we actually submitted */
cannam@86 97 vorbis_analysis_wrote (&vd,count);
cannam@86 98 vorbis_analysis_wrote (&vd,0);
cannam@86 99 }
cannam@86 100
cannam@86 101 while (vorbis_analysis_blockout (&vd,&vb) == 1) {
cannam@86 102 vorbis_analysis (&vb,NULL);
cannam@86 103 vorbis_bitrate_addblock (&vb);
cannam@86 104
cannam@86 105 while (vorbis_bitrate_flushpacket (&vd,&op)) {
cannam@86 106 ogg_stream_packetin (&os,&op);
cannam@86 107
cannam@86 108 while (!eos) {
cannam@86 109 int result = ogg_stream_pageout (&os,&og);
cannam@86 110 if (result == 0)
cannam@86 111 break;
cannam@86 112 fwrite (og.header,1,og.header_len,file);
cannam@86 113 fwrite (og.body,1,og.body_len,file);
cannam@86 114
cannam@86 115 if (ogg_page_eos (&og))
cannam@86 116 eos = 1;
cannam@86 117 }
cannam@86 118 }
cannam@86 119 }
cannam@86 120
cannam@86 121 ogg_stream_clear (&os);
cannam@86 122 vorbis_block_clear (&vb);
cannam@86 123 vorbis_dsp_clear (&vd);
cannam@86 124 vorbis_comment_clear (&vc);
cannam@86 125 vorbis_info_clear (&vi);
cannam@86 126
cannam@86 127 fclose (file) ;
cannam@86 128 }
cannam@86 129
cannam@86 130 /* The following function is basically a hacked version of the code in
cannam@86 131 * examples/decoder_example.c */
cannam@86 132 void
cannam@86 133 read_vorbis_data_or_die (const char *filename, int srate, float * data, int count)
cannam@86 134 {
cannam@86 135 ogg_sync_state oy;
cannam@86 136 ogg_stream_state os;
cannam@86 137 ogg_page og;
cannam@86 138 ogg_packet op;
cannam@86 139
cannam@86 140 vorbis_info vi;
cannam@86 141 vorbis_comment vc;
cannam@86 142 vorbis_dsp_state vd;
cannam@86 143 vorbis_block vb;
cannam@86 144
cannam@86 145 FILE *file;
cannam@86 146 char *buffer;
cannam@86 147 int bytes;
cannam@86 148 int eos = 0;
cannam@86 149 int i;
cannam@86 150 int read_total = 0 ;
cannam@86 151
cannam@86 152 if ((file = fopen (filename, "rb")) == NULL) {
cannam@86 153 printf("\n\nError : fopen failed : %s\n", strerror (errno)) ;
cannam@86 154 exit (1) ;
cannam@86 155 }
cannam@86 156
cannam@86 157 ogg_sync_init (&oy);
cannam@86 158
cannam@86 159 {
cannam@86 160 /* fragile! Assumes all of our headers will fit in the first 8kB,
cannam@86 161 which currently they will */
cannam@86 162 buffer = ogg_sync_buffer (&oy,8192);
cannam@86 163 bytes = fread (buffer,1,8192,file);
cannam@86 164 ogg_sync_wrote (&oy,bytes);
cannam@86 165
cannam@86 166 if(ogg_sync_pageout (&oy,&og) != 1) {
cannam@86 167 if(bytes < 8192) {
cannam@86 168 printf ("Out of data.\n") ;
cannam@86 169 goto done_decode ;
cannam@86 170 }
cannam@86 171
cannam@86 172 fprintf (stderr,"Input does not appear to be an Ogg bitstream.\n");
cannam@86 173 exit (1);
cannam@86 174 }
cannam@86 175
cannam@86 176 ogg_stream_init (&os,ogg_page_serialno(&og));
cannam@86 177
cannam@86 178 vorbis_info_init (&vi);
cannam@86 179 vorbis_comment_init (&vc);
cannam@86 180 if (ogg_stream_pagein (&os,&og) < 0) {
cannam@86 181 fprintf (stderr,"Error reading first page of Ogg bitstream data.\n");
cannam@86 182 exit (1);
cannam@86 183 }
cannam@86 184
cannam@86 185 if (ogg_stream_packetout(&os,&op) != 1) {
cannam@86 186 fprintf (stderr,"Error reading initial header packet.\n");
cannam@86 187 exit (1);
cannam@86 188 }
cannam@86 189
cannam@86 190 if (vorbis_synthesis_headerin (&vi,&vc,&op) < 0) {
cannam@86 191 fprintf (stderr,"This Ogg bitstream does not contain Vorbis "
cannam@86 192 "audio data.\n");
cannam@86 193 exit (1);
cannam@86 194 }
cannam@86 195
cannam@86 196 i = 0;
cannam@86 197 while ( i < 2) {
cannam@86 198 while (i < 2) {
cannam@86 199
cannam@86 200 int result = ogg_sync_pageout (&oy,&og);
cannam@86 201 if(result == 0)
cannam@86 202 break;
cannam@86 203 if(result==1) {
cannam@86 204 ogg_stream_pagein(&os,&og);
cannam@86 205
cannam@86 206 while (i < 2) {
cannam@86 207 result = ogg_stream_packetout (&os,&op);
cannam@86 208 if (result == 0) break;
cannam@86 209 if (result < 0) {
cannam@86 210 fprintf (stderr,"Corrupt secondary header. Exiting.\n");
cannam@86 211 exit(1);
cannam@86 212 }
cannam@86 213 vorbis_synthesis_headerin (&vi,&vc,&op);
cannam@86 214 i++;
cannam@86 215 }
cannam@86 216 }
cannam@86 217 }
cannam@86 218
cannam@86 219 buffer = ogg_sync_buffer (&oy,4096);
cannam@86 220 bytes = fread (buffer,1,4096,file);
cannam@86 221 if (bytes == 0 && i < 2) {
cannam@86 222 fprintf (stderr,"End of file before finding all Vorbis headers!\n");
cannam@86 223 exit (1);
cannam@86 224 }
cannam@86 225
cannam@86 226 ogg_sync_wrote (&oy,bytes);
cannam@86 227 }
cannam@86 228
cannam@86 229 if (vi.rate != srate) {
cannam@86 230 printf ("\n\nError : File '%s' has sample rate of %ld when it should be %d.\n\n", filename, vi.rate, srate);
cannam@86 231 exit (1) ;
cannam@86 232 }
cannam@86 233
cannam@86 234 vorbis_synthesis_init (&vd,&vi);
cannam@86 235 vorbis_block_init (&vd,&vb);
cannam@86 236
cannam@86 237 while(!eos) {
cannam@86 238 while (!eos) {
cannam@86 239 int result = ogg_sync_pageout (&oy,&og);
cannam@86 240 if (result == 0)
cannam@86 241 break;
cannam@86 242 if (result < 0) {
cannam@86 243 fprintf (stderr,"Corrupt or missing data in bitstream; "
cannam@86 244 "continuing...\n");
cannam@86 245 } else {
cannam@86 246 ogg_stream_pagein (&os,&og);
cannam@86 247 while (1) {
cannam@86 248 result = ogg_stream_packetout (&os,&op);
cannam@86 249
cannam@86 250 if (result == 0)
cannam@86 251 break;
cannam@86 252 if (result < 0) {
cannam@86 253 /* no reason to complain; already complained above */
cannam@86 254 } else {
cannam@86 255 float **pcm;
cannam@86 256 int samples;
cannam@86 257
cannam@86 258 if (vorbis_synthesis (&vb,&op) == 0)
cannam@86 259 vorbis_synthesis_blockin(&vd,&vb);
cannam@86 260 while ((samples = vorbis_synthesis_pcmout (&vd,&pcm)) > 0 && read_total < count) {
cannam@86 261 int bout = samples < count ? samples : count;
cannam@86 262 bout = read_total + bout > count ? count - read_total : bout;
cannam@86 263
cannam@86 264 memcpy (data + read_total, pcm[0], bout * sizeof (float)) ;
cannam@86 265
cannam@86 266 vorbis_synthesis_read (&vd,bout);
cannam@86 267 read_total += bout ;
cannam@86 268 }
cannam@86 269 }
cannam@86 270 }
cannam@86 271
cannam@86 272 if (ogg_page_eos (&og)) eos = 1;
cannam@86 273 }
cannam@86 274 }
cannam@86 275
cannam@86 276 if (!eos) {
cannam@86 277 buffer = ogg_sync_buffer (&oy,4096);
cannam@86 278 bytes = fread (buffer,1,4096,file);
cannam@86 279 ogg_sync_wrote (&oy,bytes);
cannam@86 280 if (bytes == 0) eos = 1;
cannam@86 281 }
cannam@86 282 }
cannam@86 283
cannam@86 284 ogg_stream_clear (&os);
cannam@86 285
cannam@86 286 vorbis_block_clear (&vb);
cannam@86 287 vorbis_dsp_clear (&vd);
cannam@86 288 vorbis_comment_clear (&vc);
cannam@86 289 vorbis_info_clear (&vi);
cannam@86 290 }
cannam@86 291 done_decode:
cannam@86 292
cannam@86 293 /* OK, clean up the framer */
cannam@86 294 ogg_sync_clear (&oy);
cannam@86 295
cannam@86 296 fclose (file) ;
cannam@86 297 }
cannam@86 298