15 |
use Data::Dump qw/dump/; |
use Data::Dump qw/dump/; |
16 |
use Carp qw/confess/; |
use Carp qw/confess/; |
17 |
use File::Path; |
use File::Path; |
18 |
|
use Getopt::Long; |
19 |
|
|
20 |
my $dump = 0; |
my $dump = 0; |
21 |
my $debug = 0; |
my $debug = 0; |
22 |
|
my $dump_dir = '/tmp/dump/'; |
23 |
|
|
24 |
|
GetOptions( |
25 |
|
"dump!" => \$dump, |
26 |
|
"debug!" => \$debug, |
27 |
|
"dump-dir=s" => \$dump_dir, |
28 |
|
); |
29 |
|
|
30 |
my $path = shift @ARGV || die "usage: $0 movie.amv\n"; |
my $path = shift @ARGV || die "usage: $0 movie.amv\n"; |
31 |
|
|
32 |
my $dump_dir = '/tmp/dump/'; |
|
33 |
rmtree $dump_dir if -e $dump_dir; |
rmtree $dump_dir if -e $dump_dir; |
34 |
mkpath $dump_dir || die "can't create $dump_dir: $!"; |
mkpath $dump_dir || die "can't create $dump_dir: $!"; |
35 |
|
|
158 |
confess "no SOI marker in data" if substr($data,0,2) ne "\xFF\xD8"; |
confess "no SOI marker in data" if substr($data,0,2) ne "\xFF\xD8"; |
159 |
$data = substr($data,2); |
$data = substr($data,2); |
160 |
|
|
161 |
|
my $w = $d->{amvh}->{width} || die "no width?"; |
162 |
|
my $h = $d->{amvh}->{height} || confess "no height?"; |
163 |
|
|
164 |
my $header = |
my $header = |
165 |
"\xFF\xD8". # Start of Image (SOI) marker |
"\xFF\xD8". # Start of Image (SOI) marker |
166 |
#------------------------------------------------------------------ |
#------------------------------------------------------------------ |
178 |
pack("ncnncc9", |
pack("ncnncc9", |
179 |
17, # len |
17, # len |
180 |
8, # sample precision in bits |
8, # sample precision in bits |
181 |
120,160, # X,Y size |
$h,$w, # X,Y size |
182 |
3, # number of components |
3, # number of components |
183 |
1,0x21,0, # Component ID, H+V sampling factors, Quantization table number |
1,0x21,0, # Component ID, H+V sampling factors, Quantization table number |
184 |
2,0x11,1, |
2,0x11,1, |
334 |
); |
); |
335 |
#------------------------------------------------------------------ |
#------------------------------------------------------------------ |
336 |
|
|
337 |
my $header = |
$header = |
338 |
# SOI |
# SOI |
339 |
"\xFF\xD8". |
"\xFF\xD8". |
340 |
# JFIF |
# JFIF |
366 |
# Define huffman table (section B.2.4.1) |
# Define huffman table (section B.2.4.1) |
367 |
"\xFF\xC4". # Marker |
"\xFF\xC4". # Marker |
368 |
"\x00\x1F". # Length (31 bytes) |
"\x00\x1F". # Length (31 bytes) |
369 |
"\x00". # DC, table 0 |
"\x00". # DC luminance, table 0 |
370 |
"\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00". |
"\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00". |
371 |
"\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07". |
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B". |
372 |
"\x08\x09\x0A\x0B". |
# Define huffman table (section B.2.4.1) |
373 |
|
"\xFF\xC4". # Marker |
374 |
|
"\x00\x1F". # Length (31 bytes) |
375 |
|
"\x01". # DC chrominance, table 1 |
376 |
|
"\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00". |
377 |
|
"\x00\x00\x00\x00". |
378 |
|
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B". |
379 |
# Define huffman table (section B.2.4.1) |
# Define huffman table (section B.2.4.1) |
380 |
"\xFF\xC4". # Marker |
"\xFF\xC4". # Marker |
381 |
"\x00\xB5". # Length (181 bytes) |
"\x00\xB5". # Length (181 bytes) |
382 |
"\x10". # AC, table 0 |
"\x10". # AC luminance, table 0 |
383 |
"\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04". |
"\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01\x7D". |
384 |
"\x00\x00\x01\x7D\x01\x02\x03\x00\x04\x11\x05\x12". |
"\x01\x02\x03\x00\x04\x11\x05\x12". |
385 |
"\x21\x31\x41\x06\x13\x51\x61\x07\x22\x71\x14\x32". |
"\x21\x31\x41\x06\x13\x51\x61\x07\x22\x71\x14\x32". |
386 |
"\x81\x91\xA1\x08\x23\x42\xB1\xC1\x15\x52\xD1\xF0". |
"\x81\x91\xA1\x08\x23\x42\xB1\xC1\x15\x52\xD1\xF0". |
387 |
"\x24\x33\x62\x72\x82\x09\x0A\x16\x17\x18\x19\x1A". |
"\x24\x33\x62\x72\x82\x09\x0A\x16\x17\x18\x19\x1A". |
395 |
"\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6\xD7\xD8". |
"\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6\xD7\xD8". |
396 |
"\xD9\xDA\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA". |
"\xD9\xDA\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA". |
397 |
"\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA". |
"\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA". |
|
# Define huffman table (section B.2.4.1) |
|
|
"\xFF\xC4". # /* Marker */ |
|
|
"\x00\x1F". # /* Length (31 bytes) */ |
|
|
"\x01". #/* DC". table 1 */ |
|
|
"\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00". |
|
|
"\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07". |
|
|
"\x08\x09\x0A\x0B". |
|
398 |
#/* Define huffman table (section B.2.4.1) */ |
#/* Define huffman table (section B.2.4.1) */ |
399 |
"\xFF\xC4". # /* Marker */ |
"\xFF\xC4". # Marker |
400 |
"\x00\xB5". # /* Length (181 bytes) */ |
"\x00\xB5". # Length (181 bytes) |
401 |
"\x11". #/* AC". table 1 */ |
"\x11". # AC chrominance, table 1 |
402 |
"\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04". |
"\x00\x02\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04". |
403 |
"\x00\x01\x02\x77\x00\x01\x02\x03\x11\x04\x05\x21". |
"\x00\x01\x02\x77". |
404 |
|
"\x00\x01\x02\x03\x11\x04\x05\x21". |
405 |
"\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81". |
"\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81". |
406 |
"\x08\x14\x42\x91\xA1\xB1\xC1\x09\x23\x33\x52\xF0". |
"\x08\x14\x42\x91\xA1\xB1\xC1\x09\x23\x33\x52\xF0". |
407 |
"\x15\x62\x72\xD1\x0A\x16\x24\x34\xE1\x25\xF1\x17". |
"\x15\x62\x72\xD1\x0A\x16\x24\x34\xE1\x25\xF1\x17". |
418 |
# start of frame |
# start of frame |
419 |
"\xff\xc0". |
"\xff\xc0". |
420 |
"\x00\x11\x08". |
"\x00\x11\x08". |
421 |
pack("nn", 120, 160). |
pack("nn", $h, $w). |
422 |
"\x03\x01\x21\x00\x02\x11\x01\x03\x11\x01". |
"\x03\x01\x21\x00\x02\x11\x01\x03\x11\x01". |
423 |
# |
# |
424 |
"\xff\xda". |
"\xff\xda". |