2 Shows the structure of a swf file
4 Part of the swftools package.
6 Copyright (c) 2001 Matthias Kramm <kramm@quiss.org>
8 This file is distributed under the GPL, see file COPYING for details */
12 #ifdef HAVE_SYS_STAT_H
18 #ifdef HAVE_SYS_TYPES_H
19 #include <sys/types.h>
27 #include "../lib/rfxswf.h"
28 #include "../lib/args.h"
32 /* idtab stores the ids which are defined in the file. This allows us
33 to detect errors in the file. (i.e. ids which are defined more than
41 struct options_t options[] =
54 int args_callback_option(char*name,char*val)
56 if(!strcmp(name, "V")) {
57 printf("swfdump - part of %s %s\n", PACKAGE, VERSION);
60 else if(name[0]=='a') {
64 else if(name[0]=='e') {
68 else if(name[0]=='X') {
72 else if(name[0]=='Y') {
76 else if(name[0]=='r') {
81 printf("Unknown option: -%s\n", name);
86 int args_callback_longoption(char*name,char*val)
88 return args_long2shortoption(options, name, val);
90 void args_callback_usage(char*name)
92 printf("Usage: %s [-a] file.swf\n", name);
93 printf("-h , --help\t\t\t Print help and exit\n");
94 printf("-e , --html\t\t\t Create a html embedding the file (simple, but useful)\n");
95 printf("-X , --width\t\t\t Prints out a string of the form \"-X width\"\n");
96 printf("-Y , --height\t\t\t Prints out a string of the form \"-Y height\"\n");
97 printf("-r , --rate\t\t\t Prints out a string of the form \"-r rate\"\n");
98 printf("-a , --action\t\t\t Disassemble action tags\n");
99 printf("-V , --version\t\t\t Print program version and exit\n");
101 int args_callback_command(char*name,char*val)
104 fprintf(stderr, "Only one file allowed. You supplied at least two. (%s and %s)\n",
112 char* testfunc(char*str)
114 printf("%s: %s\n", what, str);
118 void dumpButton2Actions(TAG*tag, char*prefix)
124 oldTagPos = swf_GetTagPos(tag);
126 // scan DefineButton2 Record
128 swf_GetU16(tag); // Character ID
129 swf_GetU8(tag); // Flags;
131 offsetpos = swf_GetTagPos(tag); // first offset
134 while (swf_GetU8(tag)) // state -> parse ButtonRecord
135 { swf_GetU16(tag); // id
136 swf_GetU16(tag); // layer
137 swf_GetMatrix(tag,NULL); // matrix
138 swf_GetCXForm(tag,NULL,0); // matrix
145 offsetpos = swf_GetU16(tag);
146 condition = swf_GetU16(tag); // condition
148 actions = swf_GetActions(tag);
149 printf("%s condition %04x\n", prefix, condition);
150 swf_DumpActions(actions, prefix);
153 swf_SetTagPos(tag,oldTagPos);
157 void dumpButtonActions(TAG*tag, char*prefix)
160 swf_GetU16(tag); // id
161 while (swf_GetU8(tag)) // state -> parse ButtonRecord
162 { swf_GetU16(tag); // id
163 swf_GetU16(tag); // layer
164 swf_GetMatrix(tag,NULL); // matrix
166 actions = swf_GetActions(tag);
167 swf_DumpActions(actions, prefix);
170 int main (int argc,char ** argv)
181 memset(idtab,0,65536);
183 processargs(argc, argv);
187 fprintf(stderr, "You must supply a filename.\n");
191 f = open(filename,O_RDONLY);
195 perror("Couldn't open file: ");
198 if FAILED(swf_ReadSWF(f,&swf))
200 fprintf(stderr, "%s is not a valid SWF file or contains errors.\n",filename);
207 if(statbuf.st_size != swf.FileSize)
208 fprintf(stderr, "Error: Real Filesize (%d) doesn't match header Filesize (%d)",
209 statbuf.st_size, swf.FileSize);
214 xsize = (swf.movieSize.xmax-swf.movieSize.xmin)/20;
215 ysize = (swf.movieSize.ymax-swf.movieSize.ymin)/20;
219 printf("-X %d", xsize);
225 printf("-Y %d", ysize);
231 printf("-r %d", swf.frameRate*100/256);
238 printf("<OBJECT CLASSID=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n"
241 " CODEBASE=\"http://active.macromedia.com/flash5/cabs/swflash.cab#version=%d,0,0,0\">\n"
242 " <PARAM NAME=\"MOVIE\" VALUE=\"%s\">\n"
243 " <PARAM NAME=\"PLAY\" VALUE=\"true\">\n"
244 " <PARAM NAME=\"LOOP\" VALUE=\"true\">\n"
245 " <PARAM NAME=\"QUALITY\" VALUE=\"high\">\n"
246 " <EMBED SRC=\"%s\" WIDTH=\"%d\" HEIGHT=\"%d\"\n"
247 " PLAY=\"true\" LOOP=\"true\" QUALITY=\"high\"\n"
248 " PLUGINSPAGE=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\">\n"
250 "</OBJECT>\n", xsize, ysize, swf.fileVersion, filename, filename, xsize, ysize);
253 printf("[HEADER] File version: %d\n", swf.fileVersion);
254 printf("[HEADER] File size: %ld\n", swf.fileSize);
255 printf("[HEADER] Frame rate: %f\n",swf.frameRate/256.0);
256 printf("[HEADER] Frame count: %d\n",swf.frameCount);
257 printf("[HEADER] Movie width: %.3f\n",(swf.movieSize.xmax-swf.movieSize.xmin)/20.0);
258 printf("[HEADER] Movie height: %.3f\n",(swf.movieSize.ymax-swf.movieSize.ymin)/20.0);
263 char*name = swf_TagGetName(tag);
266 fprintf(stderr, "Error: Unknown tag:0x%03x\n", tag->id);
270 printf("[%03x] %9ld %s%s", tag->id, tag->len, prefix, swf_TagGetName(tag));
272 if(swf_isDefiningTag(tag)) {
273 U16 id = swf_GetDefineID(tag);
274 printf(" defines id %04x", id);
276 fprintf(stderr, "Error: Id %04x is defined more than once.\n", id);
279 else if(tag->id == ST_PLACEOBJECT ||
280 tag->id == ST_PLACEOBJECT2) {
281 printf(" places id %04x at depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
283 printf(" name \"%s\"",swf_GetName(tag));
285 else if(tag->id == ST_REMOVEOBJECT) {
286 printf(" removes id %04x from depth %04x", swf_GetPlaceID(tag), swf_GetDepth(tag));
288 else if(tag->id == ST_REMOVEOBJECT2) {
289 printf(" removes object from depth %04x", swf_GetDepth(tag));
293 sprintf(myprefix, " %s", prefix);
295 if(tag->id == ST_DEFINESPRITE) {
296 sprintf(prefix, " ");
298 else if(tag->id == ST_END) {
301 else if(tag->id == ST_DOACTION && action) {
303 actions = swf_GetActions(tag);
304 swf_DumpActions(actions, myprefix);
306 else if(tag->id == ST_DEFINEBUTTON && action) {
307 dumpButtonActions(tag, myprefix);
309 else if(tag->id == ST_DEFINEBUTTON2 && action) {
310 dumpButton2Actions(tag, myprefix);