X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfextract.c;h=a9e60e948e47a54d6bed123df428b5167ee3dc08;hb=b47a5592955b38b9ef6fbf299fcec4dd47cbedb0;hp=99844eb670a96b6b3752b4c327dbf94861d6faee;hpb=1e33565b4a202a89b2aee42a5bdc19e5ad4b47cd;p=swftools.git diff --git a/src/swfextract.c b/src/swfextract.c index 99844eb..a9e60e9 100644 --- a/src/swfextract.c +++ b/src/swfextract.c @@ -12,7 +12,7 @@ #include #include "../lib/rfxswf.h" #include "../lib/args.h" -#include "reloc.h" +#include "../lib/log.h" #ifdef HAVE_ZLIB_H #ifdef HAVE_LIBZ #include "zlib.h" @@ -22,17 +22,20 @@ char * filename = 0; char * destfilename = "output.swf"; -int verbose = 2; +int verbose = 3; char* extractids = 0; char* extractframes = 0; char* extractjpegids = 0; char* extractpngids = 0; +char extractmp3 = 0; char* extractname = 0; char hollow = 0; +int numextracts = 0; + struct options_t options[] = { {"o","output"}, @@ -41,12 +44,14 @@ struct options_t options[] = {"i","id"}, {"j","jpegs"}, {"p","pngs"}, + {"m","mp3"}, {"n","name"}, {"f","frame"}, {"V","version"}, {0,0} }; + int args_callback_option(char*name,char*val) { if(!strcmp(name, "V")) { @@ -59,6 +64,7 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "i")) { extractids = val; + numextracts++; if(extractname) { fprintf(stderr, "You can only supply either name or id\n"); exit(1); @@ -67,6 +73,7 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "n")) { extractname = val; + numextracts++; if(extractids) { fprintf(stderr, "You can only supply either name or id\n"); exit(1); @@ -77,11 +84,17 @@ int args_callback_option(char*name,char*val) verbose ++; return 0; } + else if(!strcmp(name, "m")) { + extractmp3 = 1; + numextracts++; + return 0; + } else if(!strcmp(name, "j")) { if(extractjpegids) { fprintf(stderr, "Only one --jpegs argument is allowed. (Try to use a range, e.g. -j 1,2,3)\n"); exit(1); } + numextracts++; extractjpegids = val; return 1; } @@ -91,11 +104,13 @@ int args_callback_option(char*name,char*val) fprintf(stderr, "Only one --pngs argument is allowed. (Try to use a range, e.g. -p 1,2,3)\n"); exit(1); } + numextracts++; extractpngids = val; return 1; } #endif else if(!strcmp(name, "f")) { + numextracts++; extractframes = val; return 1; } @@ -125,8 +140,10 @@ void args_callback_usage(char*name) #ifdef _ZLIB_INCLUDED_ printf("\t-p , --pngs IDs\t\t\t IDs of the PNG pictures to extract\n"); #endif + printf("\t-m , --mp3\t\t\t Extract main mp3 stream\n"); printf("\t-f , --frame frames\t\t frame numbers to extract\n"); - printf("\t-w , --hollow\t\t\t hollow mode: don't remove empty frames (use with -f)\n"); + printf("\t-w , --hollow\t\t\t hollow mode: don't remove empty frames\n"); + printf("\t \t\t\t (use with -f)\n"); printf("\t-V , --version\t\t\t Print program version and exit\n"); } int args_callback_command(char*name,char*val) @@ -160,7 +177,7 @@ void idcallback(void*data) void enumerateIDs(TAG*tag, void(*callback)(void*)) { - U8*data; +/* U8*data; int len = tag->len; if(tag->len>=64) { len += 6; @@ -178,6 +195,13 @@ void enumerateIDs(TAG*tag, void(*callback)(void*)) memcpy(&data[2], tag->data, tag->len); } map_ids_mem(data, len, callback); + */ + int num = swf_GetNumUsedIDs(tag); + int *ptr = malloc(sizeof(int)*num); + int t; + swf_GetUsedIDs(tag, ptr); + for(t=0;tdata[ptr[t]]); } void extractTag(SWF*swf, char*filename) @@ -648,6 +672,39 @@ void handlelossless(TAG*tag) } #endif +FILE*mp3file; +void handlesoundstream(TAG*tag) +{ + char*filename = "output.mp3"; + if(numextracts==1) { + filename = destfilename; + if(!strcmp(filename,"output.swf")) + filename = "output.mp3"; + } + switch(tag->id) { + case ST_SOUNDSTREAMHEAD: + if((tag->data[1]&0x30) == 0x20) { //mp3 compression + mp3file = fopen(filename, "wb"); + logf(" Writing mp3 data to %s",filename); + } + else + logf(" Soundstream is not mp3"); + break; + case ST_SOUNDSTREAMHEAD2: + if((tag->data[1]&0x30) == 0x20) {//mp3 compression + mp3file = fopen("mainstream.mp3", "wb"); + logf(" Writing mp3 data to %s",filename); + } + else + logf(" Soundstream is not mp3 (2)"); + break; + case ST_SOUNDSTREAMBLOCK: + if(mp3file) + fwrite(&tag->data[4],tag->len-4,1,mp3file); + break; + } +} + int main (int argc,char ** argv) { TAG*tag; @@ -660,7 +717,8 @@ int main (int argc,char ** argv) char listavailable = 0; processargs(argc, argv); - if(!extractframes && !extractids && ! extractname && !extractjpegids && !extractpngids) + if(!extractframes && !extractids && ! extractname && !extractjpegids && !extractpngids + && !extractmp3) listavailable = 1; if(!filename) @@ -733,6 +791,12 @@ int main (int argc,char ** argv) } } + if(tag->id == ST_SOUNDSTREAMHEAD || + tag->id == ST_SOUNDSTREAMHEAD2 || + tag->id == ST_SOUNDSTREAMBLOCK) { + handlesoundstream(tag); + } + if(tag->id == ST_JPEGTABLES) handlejpegtables(tag); @@ -787,6 +851,9 @@ int main (int argc,char ** argv) if (found) extractTag(&swf, destfilename); + if(mp3file) + fclose(mp3file); + swf_FreeTags(&swf); return 0; }