18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/********************************************************************
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/                  *
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels *                                                                  *
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: illustrate simple use of chained bitstream and vorbisfile.a
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: chaining_example.c 16243 2009-07-10 02:49:31Z xiphmont $
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h>
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <vorbis/codec.h>
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <vorbis/vorbisfile.h>
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <io.h>
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <fcntl.h>
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsint main(){
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  OggVorbis_File ov;
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  int i;
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#ifdef _WIN32 /* We need to set stdin to binary mode. Damn windows. */
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* Beware the evil ifdef. We avoid these where we can, but this one we
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     cannot. Don't add any more, you'll probably go to hell if you do. */
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  _setmode( _fileno( stdin ), _O_BINARY );
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#endif
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* open the file/pipe on stdin */
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(ov_open_callbacks(stdin,&ov,NULL,-1,OV_CALLBACKS_NOCLOSE)<0){
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("Could not open input as an OggVorbis file.\n\n");
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    exit(1);
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  /* print details about each logical bitstream in the input */
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  if(ov_seekable(&ov)){
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("Input bitstream contained %ld logical bitstream section(s).\n",
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           ov_streams(&ov));
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("Total bitstream samples: %ld\n\n",
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           (long)ov_pcm_total(&ov,-1));
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("Total bitstream playing time: %ld seconds\n\n",
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           (long)ov_time_total(&ov,-1));
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }else{
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("Standard input was not seekable.\n"
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           "First logical bitstream information:\n\n");
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  for(i=0;i<ov_streams(&ov);i++){
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    vorbis_info *vi=ov_info(&ov,i);
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("\tlogical bitstream section %d information:\n",i+1);
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("\t\t%ldHz %d channels bitrate %ldkbps serial number=%ld\n",
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           vi->rate,vi->channels,ov_bitrate(&ov,i)/1000,
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           ov_serialnumber(&ov,i));
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("\t\theader length: %ld bytes\n",(long)
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           (ov.dataoffsets[i]-ov.offsets[i]));
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("\t\tcompressed length: %ld bytes\n",(long)(ov_raw_total(&ov,i)));
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    printf("\t\tplay time: %lds\n",(long)ov_time_total(&ov,i));
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  }
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  ov_clear(&ov);
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  return 0;
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels}
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
73