The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;

use SWF::Parser;
use SWF::Element;
use SWF::BinStream;
use SWF::BinStream::File;

my $frame = 0;

if (@ARGV==0) {
    print STDERR <<USAGE;
dumpswf.plx - Parse SWF file and dump it as a perl script.
  perl dumpswf.plx swfname [saveto]

USAGE

    exit(1);
} 

my $count = 0;

if (@ARGV==2) {
    open(F, ">$ARGV[1]") or die "Can't open $ARGV[1]";
    select F;
}

print <<START;
use SWF::Element;
use SWF::File;

die "This script creates '$ARGV[0]' SWF file. A new file name is needed.\\n" unless \$ARGV[0];

START

my $p=SWF::Parser->new('header-callback' => \&header, 'tag-callback' => \&data);
$p->parse_file($ARGV[0]);

print <<END;

\$new->close;
END


sub header {
    my ($self, $signature, $version, $length, $xmin, $ymin, $xmax, $ymax, $rate, $count)=@_;
    print STDERR <<HEADER;
Header:
SIGNATURE = $signature
VERSION = $version
File length = $length
Rect size = ($xmin, $ymin)-($xmax, $ymax)
Frame rate = $rate
Frame count = $count

HEADER
    print <<HEADER2;
\$new = SWF::File->new("\$ARGV[0].swf", Version => $version);

# $ARGV[0]  SWF header

\$new->FrameSize($xmin, $ymin, $xmax, $ymax);
\$new->FrameRate($rate);
#\$new->FrameCount($count);

# $ARGV[0]  SWF tags

HEADER2
}

sub data {
    my ($self, $tag, $length, $stream)=@_;
    my $t = SWF::Element::Tag->new(Tag=>$tag, Length=>$length);
    my ($tagname) = $t->tag_name;
 
    print STDERR <<BLOCK;
Data block:$count
Tag ID = $tag
Tag Name = $tagname
Length = $length
BLOCK
    print "# Tag No.: $count\n";
    $count++;
    eval {
	$t->unpack($stream);
    };
    if ($@) {
	my $mes = $@;
	$t->dumper;
	die $mes;
    }
    $t->dumper;
    print "->pack(\$new);\n";
    if ($tagname eq 'ShowFrame') {
	print "#^------------------------------Frame No. $frame END.\n\n";
	$frame++;
    }
}