Add support for named files on the command line, while maintaining
authorcwolf <cwolf@xiph.org>
Sat, 15 Sep 2001 04:47:48 +0000 (04:47 +0000)
committercwolf <cwolf@xiph.org>
Sat, 15 Sep 2001 04:47:48 +0000 (04:47 +0000)
current filter pipeline (stdin/stdout) mode of operation.

svn path=/trunk/vorbis/; revision=2043

examples/chaining_example.c
examples/decoder_example.c
examples/encoder_example.c
examples/seeking_example.c
examples/vorbisfile_example.c

index 664ceee..4632bc8 100644 (file)
@@ -11,7 +11,7 @@
  ********************************************************************
 
  function: illustrate simple use of chained bitstream and vorbisfile.a
- last mod: $Id: chaining_example.c,v 1.11 2001/09/13 23:34:46 cwolf Exp $
+ last mod: $Id: chaining_example.c,v 1.12 2001/09/15 04:47:47 cwolf Exp $
 
  ********************************************************************/
 
 #include <fcntl.h>
 #endif
 
-int main(){
+int main(int argc, char *argv[]){
   OggVorbis_File ov;
+  char msg[256];
+  FILE *fpin=NULL;
   int i;
 
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
@@ -34,8 +36,22 @@ int main(){
   _setmode( _fileno( stdout ), _O_BINARY );
 #endif
 
+  /* If command line args were supplied, open the named file(s)
+     for i/o, else maintain use of stdin/stdout.*/
+  if (argc == 2)
+  {
+    if ((fpin = fopen(argv[1], "rb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open \"%s\" for input", argv[1]);
+      perror(msg);
+      return 1;
+    }
+  }
+  else
+    fpin = stdin;
+
   /* open the file/pipe on stdin */
-  if(ov_open(stdin,&ov,NULL,-1)<0){
+  if(ov_open(fpin,&ov,NULL,-1)<0){
     printf("Could not open input as an OggVorbis file.\n\n");
     exit(1);
   }
@@ -43,40 +59,33 @@ int main(){
   /* print details about each logical bitstream in the input */
   if(ov_seekable(&ov)){
     printf("Input bitstream contained %ld logical bitstream section(s).\n",
-          ov_streams(&ov));
+     ov_streams(&ov));
     printf("Total bitstream playing time: %ld seconds\n\n",
-          (long)ov_time_total(&ov,-1));
+    (long)ov_time_total(&ov,-1));
 
   }else{
     printf("Standard input was not seekable.\n"
-          "First logical bitstream information:\n\n");
+    "First logical bitstream information:\n\n");
   }
 
   for(i=0;i<ov_streams(&ov);i++){
     vorbis_info *vi=ov_info(&ov,i);
     printf("\tlogical bitstream section %d information:\n",i+1);
     printf("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld\n",
-          vi->rate,vi->channels,ov_bitrate(&ov,i)/1000,
-          ov_serialnumber(&ov,i));
+    vi->rate,vi->channels,ov_bitrate(&ov,i)/1000,
+    ov_serialnumber(&ov,i));
     printf("\t\theader length: %ld bytes\n",(long)
-          (ov.dataoffsets[i]-ov.offsets[i]));
+    (ov.dataoffsets[i]-ov.offsets[i]));
     printf("\t\tcompressed length: %ld bytes ",(long)(ov_raw_total(&ov,i)));
     printf(" play time: %lds\n",(long)ov_time_total(&ov,i));
   }
 
   ov_clear(&ov);
-  return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
 
+  if (argc == 2)
+  {
+    (void)fclose(fpin);
+  }
 
+  return 0;
+}
index 2eba003..90460e2 100644 (file)
@@ -11,7 +11,7 @@
  ********************************************************************
 
  function: simple example decoder
- last mod: $Id: decoder_example.c,v 1.20 2001/05/27 20:33:18 xiphmont Exp $
+ last mod: $Id: decoder_example.c,v 1.21 2001/09/15 04:47:48 cwolf Exp $
 
  ********************************************************************/
 
@@ -53,6 +53,9 @@ int main(int argc, char **argv){
   
   char *buffer;
   int  bytes;
+  FILE *fpin=NULL;
+  FILE *fpout=NULL;
+  char msg[512];
 
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
   /* Beware the evil ifdef. We avoid these where we can, but this one we 
@@ -67,6 +70,29 @@ int main(int argc, char **argv){
                           /* this also lets the user set stdin and stdout */
 #endif
 
+  /* If command line args were supplied, open the named file(s)
+     for i/o, else maintain use of stdin/stdout.*/
+  if (argc == 3)
+  {
+    if ((fpin = fopen(argv[1], "rb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for reading.", argv[1]);
+      perror(msg);
+      return 1;
+    }
+
+    if ((fpout = fopen(argv[2], "wb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for writing.", argv[2]);
+      perror(msg);
+      return 1;
+    }
+  }
+  else
+  {
+    fpin = stdin;
+    fpout = stdout;
+  }
   /********** Decode setup ************/
 
   ogg_sync_init(&oy); /* Now we can read pages */
@@ -82,7 +108,7 @@ int main(int argc, char **argv){
 
     /* submit a 4k block to libvorbis' Ogg layer */
     buffer=ogg_sync_buffer(&oy,4096);
-    bytes=fread(buffer,1,4096,stdin);
+    bytes=fread(buffer,1,4096,fpin);
     ogg_sync_wrote(&oy,bytes);
     
     /* Get the first page. */
@@ -165,7 +191,7 @@ int main(int argc, char **argv){
       }
       /* no harm in not checking before adding more */
       buffer=ogg_sync_buffer(&oy,4096);
-      bytes=fread(buffer,1,4096,stdin);
+      bytes=fread(buffer,1,4096,fpin);
       if(bytes==0 && i<2){
        fprintf(stderr,"End of file before finding all Vorbis headers!\n");
        exit(1);
@@ -261,7 +287,7 @@ int main(int argc, char **argv){
                  fprintf(stderr,"Clipping in frame %ld\n",(long)(vd.sequence));
                
                
-               fwrite(convbuffer,2*vi.channels,bout,stdout);
+               fwrite(convbuffer,2*vi.channels,bout,fpout);
                
                vorbis_synthesis_read(&vd,bout); /* tell libvorbis how
                                                   many samples we
@@ -274,7 +300,7 @@ int main(int argc, char **argv){
       }
       if(!eos){
        buffer=ogg_sync_buffer(&oy,4096);
-       bytes=fread(buffer,1,4096,stdin);
+       bytes=fread(buffer,1,4096,fpin);
        ogg_sync_wrote(&oy,bytes);
        if(bytes==0)eos=1;
       }
index 9fb65ef..6bdb43a 100644 (file)
@@ -11,7 +11,7 @@
  ********************************************************************
 
  function: simple example encoder
- last mod: $Id: encoder_example.c,v 1.23 2001/08/13 11:40:43 xiphmont Exp $
+ last mod: $Id: encoder_example.c,v 1.24 2001/09/15 04:47:48 cwolf Exp $
 
  ********************************************************************/
 
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <time.h>
 #include <math.h>
+#include <string.h>
 #include <vorbis/vorbisenc.h>
 
 #ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
@@ -38,7 +39,7 @@
 #define READ 1024
 signed char readbuffer[READ*4+44]; /* out of the data segment, not the stack */
 
-int main(){
+int main(int argc, char *argv[]){
   ogg_stream_state os; /* take physical pages, weld into a logical
                          stream of packets */
   ogg_page         og; /* one Ogg bitstream page.  Vorbis packets are inside */
@@ -52,18 +53,18 @@ int main(){
   vorbis_block     vb; /* local working space for packet->PCM decode */
 
   int eos=0;
+  FILE *fpin=NULL;
+  FILE *fpout=NULL;
+  char msg[512];
+  int i, founddata;
 
 #if defined(macintosh) && defined(__MWERKS__)
-  int argc = 0;
-  char **argv = NULL;
-  argc = ccommand(&argv); /* get a "command line" from the Mac user */
-                          /* this also lets the user set stdin and stdout */
+  int ac = 0;
+  char **av = NULL;
+  ac = ccommand(&av); /* get a "command line" from the Mac user */
+                      /* this also lets the user set stdin and stdout */
 #endif
 
-  /* we cheat on the WAV header; we just bypass 44 bytes and never
-     verify that it matches 16bit/stereo/44.1kHz.  This is just an
-     example, after all. */
-
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
   /* Beware the evil ifdef. We avoid these where we can, but this one we 
      cannot. Don't add any more, you'll probably go to hell if you do. */
@@ -71,8 +72,57 @@ int main(){
   _setmode( _fileno( stdout ), _O_BINARY );
 #endif
 
+  /* If command line args were supplied, open the named file(s)
+     for i/o, else maintain use of stdin/stdout.*/
+  if (argc == 3)
+  {
+    if ((fpin = fopen(argv[1], "rb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for reading.", argv[1]);
+      perror(msg);
+      return 1;
+    }
+
+    if ((fpout = fopen(argv[2], "wb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for writing.", argv[2]);
+      perror(msg);
+      return 1;
+    }
+  }
+  else
+  {
+    fpin = stdin;
+    fpout = stdout;
+  }
 
-  fread(readbuffer,1,44,stdin);
+  /* we cheat on the WAV header; we just bypass the header and never
+     verify that it matches 16bit/stereo/44.1kHz.  This is just an
+     example, after all. */
+
+  readbuffer[0] = '\0';
+  for (i=0, founddata=0; i<40 && ! feof(fpin) && ! ferror(fpin); i++)
+  {
+    fread(readbuffer,1,2,fpin);
+
+    if ( ! strncmp(readbuffer, "da", 2) )
+    {
+      founddata = 1;
+      fread(readbuffer,1,6,fpin);
+    }
+  }
+
+  if ( feof(fpin) || ferror(fpin) )
+  {
+    (void)fprintf(stderr, "Error: Input WAV too short, or corrupt.\n");
+    return(1);
+  }
+
+  if ( ! founddata )
+  {
+    (void)fprintf(stderr, "Error: Can't find \"data\" chunk in WAV input.\n");
+    return(1);
+  }
 
   /********** Encode setup ************/
 
@@ -120,15 +170,15 @@ int main(){
        while(!eos){
                int result=ogg_stream_flush(&os,&og);
                if(result==0)break;
-               fwrite(og.header,1,og.header_len,stdout);
-               fwrite(og.body,1,og.body_len,stdout);
+               fwrite(og.header,1,og.header_len,fpout);
+               fwrite(og.body,1,og.body_len,fpout);
        }
 
   }
   
   while(!eos){
     long i;
-    long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
+    long bytes=fread(readbuffer,1,READ*4,fpin); /* stereo hardwired here */
 
     if(bytes==0){
       /* end of file.  this can be done implicitly in the mainline,
@@ -170,8 +220,8 @@ int main(){
       while(!eos){
        int result=ogg_stream_pageout(&os,&og);
        if(result==0)break;
-       fwrite(og.header,1,og.header_len,stdout);
-       fwrite(og.body,1,og.body_len,stdout);
+       fwrite(og.header,1,og.header_len,fpout);
+       fwrite(og.body,1,og.body_len,fpout);
 
        /* this could be set above, but for illustrative purposes, I do
           it here (to show that vorbis does know where the stream ends) */
index 4f2967e..87b29ce 100644 (file)
@@ -11,7 +11,7 @@
  ********************************************************************
 
  function: illustrate seeking, and test it too
- last mod: $Id: seeking_example.c,v 1.8 2001/05/27 06:43:58 xiphmont Exp $
+ last mod: $Id: seeking_example.c,v 1.9 2001/09/15 04:47:48 cwolf Exp $
 
  ********************************************************************/
 
 #include <stdio.h>
 #include "vorbis/codec.h"
 #include "vorbis/vorbisfile.h"
-#include "../lib/misc.h"
+//#include "../lib/misc.h"
 
+#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
+# include <io.h>
+# include <fcntl.h>
+#endif
 
 void _verify(OggVorbis_File *ov,ogg_int64_t pos,
             ogg_int64_t val,ogg_int64_t pcmval,
@@ -56,15 +60,36 @@ void _verify(OggVorbis_File *ov,ogg_int64_t pos,
   }
 }
 
-int main(){
+int main(int argc, char *argv[]){
   OggVorbis_File ov;
   int i,ret;
   ogg_int64_t pcmlength;
   char *bigassbuffer;
   int dummy;
+  char msg[256];
+  FILE *fpin=NULL;
+
+#ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
+  _setmode( _fileno( stdin ), _O_BINARY );
+  _setmode( _fileno( stdout ), _O_BINARY );
+#endif
+
+  /* If command line args were supplied, open the named file(s)
+     for i/o, else maintain use of stdin/stdout.*/
+  if (argc == 2)
+  {
+    if ((fpin = fopen(argv[1], "rb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open \"%s\" for input", argv[1]);
+      perror(msg);
+      return 1;
+    }
+  }
+  else
+    fpin = stdin;
 
   /* open the file/pipe on stdin */
-  if(ov_open(stdin,&ov,NULL,-1)<0){
+  if(ov_open(fpin,&ov,NULL,-1)<0){
     printf("Could not open input as an OggVorbis file.\n\n");
     exit(1);
   }
index 414b060..835fd60 100644 (file)
@@ -11,7 +11,7 @@
  ********************************************************************
 
  function: simple example decoder using vorbisfile
- last mod: $Id: vorbisfile_example.c,v 1.5 2001/02/26 03:50:38 xiphmont Exp $
+ last mod: $Id: vorbisfile_example.c,v 1.6 2001/09/15 04:47:48 cwolf Exp $
 
  ********************************************************************/
 
@@ -36,6 +36,9 @@ int main(int argc, char **argv){
   OggVorbis_File vf;
   int eof=0;
   int current_section;
+  FILE *fpin=NULL;
+  FILE *fpout=NULL;
+  char msg[512];
 
 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
   /* Beware the evil ifdef. We avoid these where we can, but this one we 
@@ -44,7 +47,29 @@ int main(int argc, char **argv){
   _setmode( _fileno( stdout ), _O_BINARY );
 #endif
 
-  if(ov_open(stdin, &vf, NULL, 0) < 0) {
+  if (argc == 3)
+  {
+    if ((fpin = fopen(argv[1], "rb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for reading.", argv[1]);
+      perror(msg);
+      return 1;
+    }
+
+    if ((fpout = fopen(argv[2], "wb")) == (FILE*)NULL)
+    {
+      (void)sprintf(msg, "Can't open %s for writing.", argv[2]);
+      perror(msg);
+      return 1;
+    }
+  }
+  else
+  {
+    fpin = stdin;
+    fpout = stdout;
+  }
+
+  if(ov_open(fpin, &vf, NULL, 0) < 0) {
       fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
       exit(1);
   }
@@ -75,7 +100,7 @@ int main(int argc, char **argv){
     } else {
       /* we don't bother dealing with sample rate changes, etc, but
         you'll have to*/
-      fwrite(pcmout,1,ret,stdout);
+      fwrite(pcmout,1,ret,fpout);
     }
   }