summaryrefslogtreecommitdiff
path: root/examples/encoder_example.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/encoder_example.c')
-rw-r--r--examples/encoder_example.c140
1 files changed, 115 insertions, 25 deletions
diff --git a/examples/encoder_example.c b/examples/encoder_example.c
index ffd6550e..cddb8002 100644
--- a/examples/encoder_example.c
+++ b/examples/encoder_example.c
@@ -13,7 +13,19 @@
function: simple example encoder
last mod: $Id: encoder_example.c,v 1.50 2002/07/16 09:26:07 xiphmont Exp $
- ********************************************************************/
+ ********************************************************************
+ modified by AOYUMI
+ //- delete
+ //+ add
+ //+~, //~+ add range
+ // /[asterisk]-~, [asterisk]/ delete range
+
+ support only 16bit PCM .WAV file
+
+ 2004/04/26
+ In order to enable it to compile by Linux, a patch is applied to
+ a this code. This patch is offer from Frederik Himpe.
+ *********************************************************************/
/* takes a stereo 16bit 44.1kHz WAV file from stdin and encodes it into
a Vorbis bitstream */
@@ -24,6 +36,8 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
+#include <sys/types.h> //+
+#include <sys/stat.h> //+
#include <math.h>
#include <vorbis/vorbisenc.h>
@@ -37,9 +51,12 @@
#endif
#define READ 1024
+#define DEF_Q 0 /* Default Quality Setting */ //+
+
signed char readbuffer[READ*4+44]; /* out of the data segment, not the stack */
-int main(){
+//- 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 */
@@ -55,6 +72,27 @@ int main(){
int eos=0,ret;
int i, founddata;
+//+~
+ float qnum = DEF_Q;
+ int qx = 1;
+ if(argc < 2){
+ puts("usage: encoder_example -q4 filename.wav");
+ exit(1);
+ }
+ if( !strncmp(argv[1], "-q", 2) ){
+ if( strlen(argv[1]) > 2 ){
+ qnum = atof(argv[1]+2);
+ }
+ if( !((qnum >= -2) && (qnum <= 10)) ) qnum = DEF_Q;
+ qx++;
+ }
+ FILE *FP;
+ if( !(FP = fopen(argv[qx], "rb")) ){
+ puts("source file not found");
+ exit(1);
+ }
+//~+
+
#if defined(macintosh) && defined(__MWERKS__)
int argc = 0;
char **argv = NULL;
@@ -80,18 +118,38 @@ int main(){
verify that it matches 16bit/stereo/44.1kHz. This is just an
example, after all. */
+ unsigned long footer = 0; //+
+ unsigned long sa_rate = 44100; //+
+ unsigned long channel; //+
+ struct stat sbuf; //+
+ stat(argv[qx], &sbuf); //+
+
readbuffer[0] = '\0';
- for (i=0, founddata=0; i<30 && ! feof(stdin) && ! ferror(stdin); i++)
+//- for (i=0, founddata=0; i<30 && ! feof(stdin) && ! ferror(stdin); i++)
+ for (i=0, founddata=0; i<30 && ! feof(FP) && ! ferror(FP); i++) //+
{
- fread(readbuffer,1,2,stdin);
-
- if ( ! strncmp((char*)readbuffer, "da", 2) )
+//- fread(readbuffer,1,2,stdin);
+ fread(readbuffer,1,2,FP); //+
+//+~
+ if ( ! memcmp(readbuffer, "fm", 2) ){
+ fread(readbuffer,1,8,FP); //+
+ fread(&channel,1,2,FP); //+
+ fread(&sa_rate,1,4,FP); //+
+ }
+//~+
+//- if ( ! strncmp((char*)readbuffer, "da", 2) )
+ if ( ! memcmp(readbuffer, "da", 2) ) //+
{
founddata = 1;
- fread(readbuffer,1,6,stdin);
+//- fread(readbuffer,1,6,stdin);
+ fread(readbuffer,1,6,FP); //+
+ memcpy(&footer, readbuffer+2, 4); //+
+ footer += ftell(FP); //+
break;
}
}
+ footer = sbuf.st_size - footer; //+
+ printf("\n%dHz\n", sa_rate); //+
/********** Encode setup ************/
@@ -126,14 +184,29 @@ int main(){
*********************************************************************/
- ret=vorbis_encode_init_vbr(&vi,2,44100,.5);
-
+//- ret=vorbis_encode_init_vbr(&vi,2,44100,.4);
+ ret=vorbis_encode_init_vbr(&vi,channel,sa_rate, qnum/10); //+
/* do not continue if setup failed; this can happen if we ask for a
mode that libVorbis does not support (eg, too low a bitrate, etc,
will return 'OV_EIMPL') */
- if(ret)exit(1);
-
+//- if(ret)exit(1);
+//+~
+ if(ret){
+ puts("encode init error");
+ exit(1);
+ }
+ char wfile[1024];
+ strcpy(wfile, argv[qx]);
+ strcat(wfile, ".ogg");
+ FILE *FP2;
+ if( !(FP2 = fopen(wfile, "wb")) ){
+ puts("file open error");
+ exit(1);
+ }
+
+ printf("Quality %f\n Encoding...", qnum);
+//~+
/* add a comment */
vorbis_comment_init(&vc);
vorbis_comment_add_tag(&vc,"ENCODER","encoder_example.c");
@@ -172,22 +245,26 @@ 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,stdout);
+ fwrite(og.header,1,og.header_len,FP2); //+
+//- fwrite(og.body,1,og.body_len,stdout);
+ fwrite(og.body,1,og.body_len,FP2); //+
}
}
-
+
while(!eos){
long i;
- long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
-
+//- long bytes=fread(readbuffer,1,READ*4,stdin); /* stereo hardwired here */
+ long bytes=fread(readbuffer,1,READ*(channel*2),FP); //+
+ if(bytes < (READ*(channel*2))) bytes -= footer; //+
+ if(bytes < 0) bytes = 0; //+
if(bytes==0){
- /* end of file. this can be done implicitly in the mainline,
- but it's easier to see here in non-clever fashion.
- Tell the library we're at end of stream so that it can handle
- the last frame and mark end of stream in the output properly */
- vorbis_analysis_wrote(&vd,0);
+ /* end of file. this can be done implicitly in the mainline,
+ but it's easier to see here in non-clever fashion.
+ Tell the library we're at end of stream so that it can handle
+ the last frame and mark end of stream in the output properly */
+ vorbis_analysis_wrote(&vd,0);
}else{
/* data to encode */
@@ -196,13 +273,23 @@ int main(){
float **buffer=vorbis_analysis_buffer(&vd,READ);
/* uninterleave samples */
+/*-~
for(i=0;i<bytes/4;i++){
buffer[0][i]=((readbuffer[i*4+1]<<8)|
(0x00ff&(int)readbuffer[i*4]))/32768.f;
buffer[1][i]=((readbuffer[i*4+3]<<8)|
(0x00ff&(int)readbuffer[i*4+2]))/32768.f;
}
-
+*/
+//+~
+ for(i=0;i<bytes/(channel*2);i++){
+ buffer[0][i]=((readbuffer[i*(channel*2)+1]<<8)|
+ (0x00ff&(int)readbuffer[i*(channel*2)]))/32768.f;
+ if(channel == 2)
+ buffer[1][i]=((readbuffer[i*(channel*2)+3]<<8)|
+ (0x00ff&(int)readbuffer[i*(channel*2)+2]))/32768.f;
+ }
+//~+
/* tell the library how much we actually submitted */
vorbis_analysis_wrote(&vd,i);
}
@@ -225,8 +312,10 @@ 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,stdout);
+ fwrite(og.header,1,og.header_len,FP2); //+
+//- fwrite(og.body,1,og.body_len,stdout);
+ fwrite(og.body,1,og.body_len,FP2); //+
/* this could be set above, but for illustrative purposes, I do
it here (to show that vorbis does know where the stream ends) */
@@ -247,7 +336,8 @@ int main(){
/* ogg_page and ogg_packet structs always point to storage in
libvorbis. They're never freed or manipulated directly */
-
+ fclose(FP); //+
+ fclose(FP2); //+
fprintf(stderr,"Done.\n");
return(0);
}