X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=src%2Fwav2swf.c;h=c5744b74831e945a4ce44c0b8b85f2f1949d4304;hp=d27f172ea28f5b5cc797661e8f128b24868f856b;hb=0f50b9ef526a82c2e86e0a90fc707c0aa43d3e36;hpb=3717652f61a47a4d6f47481f2b1977d9df2d55b5 diff --git a/src/wav2swf.c b/src/wav2swf.c index d27f172..c5744b7 100644 --- a/src/wav2swf.c +++ b/src/wav2swf.c @@ -4,8 +4,20 @@ Part of the swftools package. Copyright (c) 2001 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. - This file is distributed under the GPL, see file COPYING for details */ + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include @@ -17,25 +29,35 @@ char * filename = 0; char * outputname = "output.swf"; int verbose = 2; +int stopframe0 = 0; #define DEFINESOUND_MP3 1 //define sound uses mp3?- undefine for raw sound. -struct options_t options[] = -{ - {"o","output"}, - {"v","verbose"}, - {"d","definesound"}, - {"l","loop"}, - {"r","framerate"}, - {"b","bitrate"}, - {"V","version"}, - {0,0} +static struct options_t options[] = { +{"h", "help"}, +{"V", "version"}, +{"o", "output"}, +{"r", "framerate"}, +{"s", "samplerate"}, +{"b", "bitrate"}, +{"d", "definesound"}, +{"l", "loop"}, +{"C", "cgi"}, +{"S", "stop"}, +{"b", "bitrate"}, +{"v", "verbose"}, +{0,0} }; static int loop = 0; static int definesound = 0; static int framerate = 0; +static int samplerate = 11025; static int bitrate = 32; +static int do_cgi = 0; + +static int mp3_bitrates[] = +{ 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0}; int args_callback_option(char*name,char*val) { @@ -60,23 +82,60 @@ int args_callback_option(char*name,char*val) verbose ++; return 0; } + else if(!strcmp(name, "S")) { + stopframe0 = 1; + return 0; + } + else if(!strcmp(name, "C")) { + do_cgi = 1; + return 0; + } else if(!strcmp(name, "r")) { float f; sscanf(val, "%f", &f); framerate = f*256; return 1; } + else if(!strcmp(name, "s")) { + samplerate = atoi(val); + if(samplerate > 5000 && samplerate < 6000) + samplerate = 5512; + else if(samplerate > 11000 && samplerate < 12000) + samplerate = 11025; + else if(samplerate > 22000 && samplerate < 23000) + samplerate = 22050; + else if(samplerate > 44000 && samplerate < 45000) + samplerate = 44100; + else { + fprintf(stderr, "Invalid samplerate: %d\n", samplerate); + fprintf(stderr, "Allowed values: 11025, 22050, 44100\n", samplerate); + exit(1); + } + return 1; + } else if(!strcmp(name, "b")) { - bitrate = atoi(val); - if(bitrate<=0) { + int t; + int b = atoi(val); + if(b<=0) { fprintf(stderr, "Not a valid bitrate: %s\n", val); exit(1); } - if(bitrate>144) { + if(b>160) { fprintf(stderr, "Bitrate must be <144. (%s)\n", val); exit(1); } - return 1; + for(t=0;mp3_bitrates[t];t++) { + if(b== mp3_bitrates[t]) { + bitrate = b; + return 1; + } + } + fprintf(stderr, "Invalid bitrate. Allowed bitrates are:\n"); + for(t=0;mp3_bitrates[t];t++) { + printf("%d ", mp3_bitrates[t]); + } + printf("\n"); + exit(1); } else { printf("Unknown option: -%s\n", name); @@ -88,16 +147,24 @@ int args_callback_longoption(char*name,char*val) { return args_long2shortoption(options, name, val); } -void args_callback_usage(char*name) +void args_callback_usage(char *name) { + printf("\n"); printf("Usage: %s [-o filename] file.wav\n", name); - printf("\t-v , --verbose\t\t\t Be more verbose\n"); - printf("\t-d , --definesound\t\t Generate a DefineSound tag instead of streaming sound\n"); - printf("\t-l , --loop n\t\t\t Loop sound n times (implies -d)\n"); - printf("\t-r , --framerate fps\t\t Set framerate to fps frames per seond\n"); - printf("\t-b , --bitrate bps\t\t Set mp3 bitrate (default: 32)\n"); - printf("\t-o , --output filename\t\t set output filename (default: output.swf)\n"); - printf("\t-V , --version\t\t\t Print program version and exit\n"); + printf("\n"); + printf("-h , --help Print short help message and exit\n"); + printf("-V , --version Print version info and exit\n"); + printf("-o , --output Explicitly specify output file. (Otherwise, output will go to output.swf)\n"); + printf("-r , --framerate Set file framerate to frames per second.\n"); + printf("-s , --samplerate Set samplerate to frames per second (default: 11025).\n"); + printf("-b , --bitrate bps Set mp3 bitrate to .\n"); + printf("-d , --definesound Generate a DefineSound tag instead of streaming sound.\n"); + printf("-l , --loop n (Only used with -d)\n"); + printf("-C , --cgi For use as CGI- prepend http header, write to stdout.\n"); + printf("-S , --stop Stop the movie at frame 0\n"); + printf("-b , --bitrate Set mp3 bitrate to (default: 32)\n"); + printf("-v , --verbose Be more verbose\n"); + printf("\n"); } int args_callback_command(char*name,char*val) { @@ -110,6 +177,8 @@ int args_callback_command(char*name,char*val) } extern int swf_mp3_bitrate; +extern int swf_mp3_out_samplerate; +extern int swf_mp3_in_samplerate; int main (int argc,char ** argv) { @@ -134,8 +203,9 @@ int main (int argc,char ** argv) processargs(argc, argv); - blocksize = 576; - blockspersecond = 11025.0/blocksize; + blocksize = (samplerate > 22050) ? 1152 : 576; + + blockspersecond = (float)samplerate/blocksize; framespersecond = blockspersecond; if(framerate) @@ -147,17 +217,36 @@ int main (int argc,char ** argv) initLog(0,-1,0,0,-1,verbose); + if(!filename) { + msg(" You must supply a filename"); + exit(1); + } + if(!readWAV(filename, &wav)) { - logf(" Error reading %s", filename); + msg(" Error reading %s", filename); exit(1); } - convertWAV2mono(&wav,&wav2, 44100); + convertWAV2mono(&wav,&wav2, samplerate); //printWAVInfo(&wav); //printWAVInfo(&wav2); samples = (U16*)wav2.data; numsamples = wav2.size/2; + if(numsamples%blocksize != 0) + { + // apply padding, so that block is a multiple of blocksize + int numblocks = (numsamples+blocksize-1)/blocksize; + int numsamples2; + U16* samples2; + numsamples2 = numblocks * blocksize; + samples2 = malloc(sizeof(U16)*numsamples2); + memcpy(samples2, samples, numsamples*sizeof(U16)); + memset(&samples2[numsamples], 0, sizeof(U16)*(numsamples2 - numsamples)); + numsamples = numsamples2; + samples = samples2; + } + memset(&swf,0x00,sizeof(SWF)); swf.fileVersion = 5; @@ -172,8 +261,21 @@ int main (int argc,char ** argv) rgb.g = 0xff; rgb.b = 0xff; swf_SetRGB(tag,&rgb); + + if(stopframe0) { + ActionTAG*action = 0; + tag = swf_InsertTag(tag, ST_DOACTION); + action = action_Stop(action); + action = action_End(action); + swf_ActionSet(tag, action); + swf_ActionFree(action); + + tag = swf_InsertTag(tag, ST_SHOWFRAME); + } swf_mp3_bitrate = bitrate; + swf_mp3_out_samplerate = samplerate; + swf_mp3_in_samplerate = samplerate; if(!definesound) { @@ -181,25 +283,25 @@ int main (int argc,char ** argv) float framesamplepos = 0; float framepos = 0; float samplepos = 0; + ActionTAG* a = 0; U16 v1=0,v2=0; tag = swf_InsertTag(tag, ST_SOUNDSTREAMHEAD); swf_SetSoundStreamHead(tag, samplesperframe); - - logf(" %d blocks", numsamples/(blocksize*4)); - for(t=0;t %d blocks", numsamples/blocksize); + for(t=0;t Starting block %d %d+%d", t, (int)samplepos, (int)blocksize); - block1 = &samples[t*blocksize*4]; + msg(" Starting block %d %d+%d", t, (int)samplepos, (int)blocksize); + block1 = &samples[t*blocksize]; swf_SetSoundStreamBlock(tag, block1, seek, 1); v1 = v2 = GET16(tag->data); } else { - logf(" Adding data...", t); - block1 = &samples[t*blocksize*4]; + msg(" Adding data...", t); + block1 = &samples[t*blocksize]; swf_SetSoundStreamBlock(tag, block1, seek, 0); v1+=v2; PUT16(tag->data, v1); @@ -221,13 +323,14 @@ int main (int argc,char ** argv) tag = swf_InsertTag(tag, ST_DEFINESOUND); swf_SetU16(tag, 24); //id #ifdef DEFINESOUND_MP3 - swf_SetSoundDefine(tag, samples, numsamples); + swf_SetSoundDefine(tag, samples, numsamples); #else - swf_SetU8(tag,(/*compression*/0<<4)|(/*rate*/3<<2)|(/*size*/1<<1)|/*mono*/0); - swf_SetU32(tag, numsamples); // 44100 -> 11025 - swf_SetBlock(tag, wav2.data, numsamples*2); + swf_SetU8(tag,(/*compression*/0<<4)|(/*rate*/3<<2)|(/*size*/1<<1)|/*mono*/0); + swf_SetU32(tag, numsamples); // 44100 -> 11025 + swf_SetBlock(tag, samples, numsamples*2); #endif + tag = swf_InsertTag(tag, ST_STARTSOUND); swf_SetU16(tag, 24); //id memset(&info, 0, sizeof(info)); @@ -237,9 +340,13 @@ int main (int argc,char ** argv) tag = swf_InsertTag(tag, ST_END); } - f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); - if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); - close(f); + if(do_cgi) { + if FAILED(swf_WriteCGI(&swf)) fprintf(stderr,"WriteCGI() failed.\n"); + } else { + f = open(outputname,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); + if FAILED(swf_WriteSWF(f,&swf)) fprintf(stderr,"WriteSWF() failed.\n"); + close(f); + } swf_FreeTags(&swf); return 0;