+ U16 id = swf_GetU16(tag);
+ U16 frames = swf_GetU16(tag);
+ U16 width = swf_GetU16(tag);
+ U16 height = swf_GetU16(tag);
+ U8 flags = swf_GetU8(tag); //5-2(videopacket 01=off 10=on)-1(smoothing 1=on)
+ U8 codec = swf_GetU8(tag);
+ printf(" (%d frames, %dx%d", frames, width, height);
+ if(flags&1)
+ printf(" smoothed");
+ if(codec == 2)
+ printf(" sorenson h.263)");
+ else
+ printf(" codec 0x%02x)", codec);
+}
+void handleVideoFrame(TAG*tag, char*prefix)
+{
+ U32 code, version, reference, sizeflags;
+ U32 width=0, height=0;
+ U8 type;
+ U16 id = swf_GetU16(tag);
+ U16 frame = swf_GetU16(tag);
+ U8 deblock,flags, tmp, bit;
+ U32 quantizer;
+ char*types[] = {"I-frame", "P-frame", "disposable P-frame", "<reserved>"};
+ printf(" (frame %d) ", frame);
+
+ /* video packet follows */
+ code = swf_GetBits(tag, 17);
+ version = swf_GetBits(tag, 5);
+ reference = swf_GetBits(tag, 8);
+
+ sizeflags = swf_GetBits(tag, 3);
+ switch(sizeflags)
+ {
+ case 0: width = swf_GetBits(tag, 8); height = swf_GetBits(tag, 8); break;
+ case 1: width = swf_GetBits(tag, 16); height = swf_GetBits(tag, 16); break;
+ case 2: width = 352; height = 288; break;
+ case 3: width = 176; height = 144; break;
+ case 4: width = 128; height = 96; break;
+ case 5: width = 320; height = 240; break;
+ case 6: width = 160; height = 120; break;
+ case 7: width = -1; height = -1;/*reserved*/ break;
+ }
+ printf("%dx%d ", width, height);
+ type = swf_GetBits(tag, 2);
+ printf("%s", types[type]);
+
+ deblock = swf_GetBits(tag, 1);
+ if(deblock)
+ printf(" deblock ", deblock);
+ quantizer = swf_GetBits(tag, 5);
+ printf(" quant: %d ", quantizer);
+}
+
+void dumpFilter(FILTER*filter)
+{
+ if(filter->type == FILTERTYPE_BLUR) {
+ FILTER_BLUR*f = (FILTER_BLUR*)filter;
+ printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+ printf("passes: %d\n", f->passes);
+ } if(filter->type == FILTERTYPE_GLOW) {
+ FILTER_GLOW*f = (FILTER_GLOW*)filter;
+ printf("color %02x%02x%02x%02x\n", f->rgba.r,f->rgba.g,f->rgba.b,f->rgba.a);
+ printf("blurx: %f blury: %f strength: %f\n", f->blurx, f->blury, f->strength);
+ printf("passes: %d\n", f->passes);
+ printf("flags: %s%s%s\n",
+ f->knockout?"knockout ":"",
+ f->composite?"composite ":"",
+ f->innerglow?"innerglow":"");
+ } if(filter->type == FILTERTYPE_DROPSHADOW) {
+ FILTER_DROPSHADOW*f = (FILTER_DROPSHADOW*)filter;
+ printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+ printf("passes: %d\n", f->passes);
+ printf("angle: %f distance: %f\n", f->angle, f->distance);
+ printf("strength: %f passes: %d\n", f->strength, f->passes);
+ printf("flags: %s%s%s\n",
+ f->knockout?"knockout ":"",
+ f->composite?"composite ":"",
+ f->innershadow?"innershadow ":"");
+ } if(filter->type == FILTERTYPE_BEVEL) {
+ FILTER_BEVEL*f = (FILTER_BEVEL*)filter;
+ printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+ printf("passes: %d\n", f->passes);
+ printf("angle: %f distance: %f\n", f->angle, f->distance);
+ printf("strength: %f passes: %d\n", f->strength, f->passes);
+ printf("flags: %s%s%s%s\n",
+ f->ontop?"ontop":"",
+ f->knockout?"knockout ":"",
+ f->composite?"composite ":"",
+ f->innershadow?"innershadow ":"");
+ } if(filter->type == FILTERTYPE_GRADIENTGLOW) {
+ FILTER_GRADIENTGLOW*f = (FILTER_GRADIENTGLOW*)filter;
+ swf_DumpGradient(stdout, f->gradient);
+ printf("blurx: %f blury: %f\n", f->blurx, f->blury);
+ printf("angle: %f distance: %f\n", f->angle, f->distance);
+ printf("strength: %f passes: %d\n", f->strength, f->passes);
+ printf("flags: %s%s%s%s\n",
+ f->knockout?"knockout ":"",
+ f->ontop?"ontop ":"",
+ f->composite?"composite ":"",
+ f->innershadow?"innershadow ":"");
+ }
+ rfx_free(filter);
+}
+
+void handlePlaceObject23(TAG*tag, char*prefix)
+{
+ U8 flags,flags2=0;
+ MATRIX m;
+ CXFORM cx;
+ char pstr[3][256];
+ int ppos[3] = {0,0,0};
+ swf_SetTagPos(tag, 0);
+ flags = swf_GetU8(tag);
+ if(tag->id == ST_PLACEOBJECT3)
+ flags2 = swf_GetU8(tag);
+ swf_GetU16(tag); //depth
+
+ //flags&1: move