/[amv]/amv.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /amv.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 16 by dpavlin, Sat Jul 21 11:18:15 2007 UTC revision 19 by dpavlin, Sat Jul 21 15:03:30 2007 UTC
# Line 20  use Getopt::Long; Line 20  use Getopt::Long;
20  my $dump = 0;  my $dump = 0;
21  my $debug = 0;  my $debug = 0;
22  my $dump_dir = '/tmp/dump/';  my $dump_dir = '/tmp/dump/';
23    my $no_jpeg_header = 0;
24    my $jpeg_q = 100;
25    
26  GetOptions(  GetOptions(
27          "dump!"                 => \$dump,          "dump!"                 => \$dump,
28          "debug!"                => \$debug,          "debug!"                => \$debug,
29          "dump-dir=s"    => \$dump_dir,          "dump-dir=s"    => \$dump_dir,
30            "no-jpeg-headers!" => \$no_jpeg_header,
31  );  );
32    
33  my $path = shift @ARGV || die "usage: $0 movie.amv\n";  my $path = shift @ARGV || die "usage: $0 movie.amv\n";
# Line 88  sub x { Line 91  sub x {
91          hex_dump( $bytes );          hex_dump( $bytes );
92    
93          if ( $bytes eq 'AMV_END_' ) {          if ( $bytes eq 'AMV_END_' ) {
94                  warn "> end of file marker AMV_END_\n";                  print "> end of file marker AMV_END_\n" if $dump;
95                  $d->{eof}++;                  $d->{eof}++;
96                  return;                  return;
97          }          }
98    
99          if ( $format ) {          if ( $format ) {
100                  my @data = unpack($format, $bytes);                  my @data = unpack($format, $bytes);
101                  warn "## unpacked = ",dump(@data),"\n" if $debug;                  print "## unpacked = ",dump(@data),"\n" if $debug;
102                  return @data;                  return @data;
103          } else {          } else {
104                  return $bytes;                  return $bytes;
# Line 115  sub next_part { Line 118  sub next_part {
118          return $len;          return $len;
119  }  }
120    
121  sub huffman {  sub quality {
122            my @table = @_;
123            die "quantization matrice needs to have 64 bytes!" if $#table != 63;
124    
125            my $in = join('', map { chr($_) } @table );
126            my $out;
127    
128            foreach my $t ( @table ) {
129                    $t = int( ( $t * $jpeg_q ) / 100 );
130                    $t = 255 if $t > 255;
131                    $out .= chr($t);
132            }
133    
134  # JPEG DHT Segment for YCrCb omitted from MJPG data          if ( $dump ) {
135  return                  print "## quantization table original\n";
136  "\xFF\xC4\x01\xA2" .                  hex_dump( $in );
137  "\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00" .                  print "## quantization table for $jpeg_q %\n";
138  "\x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x01" .                  hex_dump( $out );
139  "\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\x10\x00" .  
 "\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01\x7D" .  
 "\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\x61" .  
 "\x07\x22\x71\x14\x32\x81\x91\xA1\x08\x23\x42\xB1\xC1\x15\x52" .  
 "\xD1\xF0\x24\x33\x62\x72\x82\x09\x0A\x16\x17\x18\x19\x1A\x25" .  
 "\x26\x27\x28\x29\x2A\x34\x35\x36\x37\x38\x39\x3A\x43\x44\x45" .  
 "\x46\x47\x48\x49\x4A\x53\x54\x55\x56\x57\x58\x59\x5A\x63\x64" .  
 "\x65\x66\x67\x68\x69\x6A\x73\x74\x75\x76\x77\x78\x79\x7A\x83" .  
 "\x84\x85\x86\x87\x88\x89\x8A\x92\x93\x94\x95\x96\x97\x98\x99" .  
 "\x9A\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xB2\xB3\xB4\xB5\xB6" .  
 "\xB7\xB8\xB9\xBA\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xD2\xD3" .  
 "\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8" .  
 "\xE9\xEA\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\x11\x00\x02" .  
 "\x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00" .  
 "\x01\x02\x03\x11\x04\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71" .  
 "\x13\x22\x32\x81\x08\x14\x42\x91\xA1\xB1\xC1\x09\x23\x33\x52" .  
 "\xF0\x15\x62\x72\xD1\x0A\x16\x24\x34\xE1\x25\xF1\x17\x18\x19" .  
 "\x1A\x26\x27\x28\x29\x2A\x35\x36\x37\x38\x39\x3A\x43\x44\x45" .  
 "\x46\x47\x48\x49\x4A\x53\x54\x55\x56\x57\x58\x59\x5A\x63\x64" .  
 "\x65\x66\x67\x68\x69\x6A\x73\x74\x75\x76\x77\x78\x79\x7A\x82" .  
 "\x83\x84\x85\x86\x87\x88\x89\x8A\x92\x93\x94\x95\x96\x97\x98" .  
 "\x99\x9A\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xB2\xB3\xB4\xB5" .  
 "\xB6\xB7\xB8\xB9\xBA\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xD2" .  
 "\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xE2\xE3\xE4\xE5\xE6\xE7\xE8" .  
 "\xE9\xEA\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA";  
140    
141            return $out;
142  }  }
143    
144    my @subframes;
145    my $frame_nr = 1;
146    
147    # how many subframes to join into single frame?
148    my $join_subframes = 0;
149    
150  sub mkjpg {  sub mkjpg {
151          my ($path,$data) = @_;          my ($data) = @_;
         open(my $fh, '>', $path) || die "can't create $path: $!";  
152    
153          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";
154          $data = substr($data,2);          confess "no EOI marker in data" if substr($data,-2,2) ne "\xFF\xD9";
155            $data = substr($data,2,-2);
156    
157            if ( $#subframes < ( $join_subframes - 1 ) ) {
158                    push @subframes, $data;
159                    print "## saved $frame_nr/", $#subframes + 1, " subframe of ", length($data), " bytes\n";
160                    return;
161            }
162    
163            my $path = sprintf("$dump_dir/%04d.jpg", $frame_nr++ );
164    
165            open(my $fh, '>', $path) || die "can't create $path: $!";
166    
167          my $w = $d->{amvh}->{width} || die "no width?";          my $w = $d->{amvh}->{width} || die "no width?";
168          my $h = $d->{amvh}->{height} || confess "no height?";          my $h = $d->{amvh}->{height} || confess "no height?";
169    
170          my $header =          my $header =
171                  "\xFF\xD8".     # Start of Image (SOI) marker          # Start of Image (SOI) marker
172  #------------------------------------------------------------------          "\xFF\xD8".
173                  "\xFF\xE0".     # JFIF marker          # JFIF marker
174            "\xFF\xE0".
175          pack("nZ5CCCnnCC",          pack("nZ5CCCnnCC",
176                  16,                     # length                  16,                     # length
177                  'JFIF',         # identifier                  'JFIF',         # identifier (JFIF)
178                  1,1,            # version                  1,1,            # version
179                  0,                      # units (none)                  0,                      # units (none)
180                  1,1,            # X,Y density                  1,1,            # X,Y density
181                  0,0,            # X,Y thumbnail                  0,0,            # X,Y thumbnail
182          ).          ).
183  #------------------------------------------------------------------          "\xFF\xFE".
184          "\xFF\xC0".     # Start of frame          "\x00\x3CCREATOR: amv dumper (compat. IJG JPEG v62), quality = 100\n".
185            # quantization table (quaility=100%)
186            "\xFF\xDB".
187            "\x00\x43".
188            # 8 bit values, table 1
189            "\x00".
190            quality(
191        0x10, 0x0B, 0x0C, 0x0E, 0x0C, 0x0A, 0x10, 0x0E,
192        0x0D, 0x0E, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28,
193        0x1A, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25,
194        0x1D, 0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33,
195        0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44,
196        0x57, 0x45, 0x37, 0x38, 0x50, 0x6D, 0x51, 0x57,
197        0x5F, 0x62, 0x67, 0x68, 0x67, 0x3E, 0x4D, 0x71,
198        0x79, 0x70, 0x64, 0x78, 0x5C, 0x65, 0x67, 0x63,
199            ).
200            "\xFF\xDB".
201            "\x00\x43".
202            # 8 bit values, table 1
203            "\x01".
204            quality(
205        0x11, 0x12, 0x12, 0x18, 0x15, 0x18, 0x2F, 0x1A,
206        0x1A, 0x2F, 0x63, 0x42, 0x38, 0x42, 0x63, 0x63,
207        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
208        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
209        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
210        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
211        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
212        0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63,
213            ).
214            # start of frame
215            "\xFF\xC0".
216          pack("ncnncc9",          pack("ncnncc9",
217                  17,                     # len                  17,                     # len
218                  8,                      # sample precision in bits                  8,                      # sample precision in bits
219                  $h,$w,          # X,Y size                  $h,$w,          # X,Y size
220                  3,                      # number of components                  3,                      # number of components
221                  1,0x21,0,       # Component ID, H+V sampling factors, Quantization table number                  1,0x22,0,       # Component ID, H+V sampling factors, Quantization table number
222                  2,0x11,1,                  2,0x11,1,
223                  3,0x11,1,                  3,0x11,1,
224          ).          ).
 #------------------------------------------------------------------  
         "\xFF\xDB".             # Define Quantization table marker  
         "\x00\x84".             # len  
         "\x00".                 # 8 bit values, (byte) table 0  
         "\x10\x0B\x0C\x0E\x0C".  
         "\x0A\x10\x0E\x0D\x0E".  
         "\x12\x11\x10\x13\x18".  
         "\x28\x1A\x18\x16\x16".  
         "\x18\x31\x23\x25\x1D".  
         "\x28\x3A\x33\x3D\x3C".  
         "\x39\x33\x38\x37\x40".  
         "\x48\x5C\x4E\x40\x44".  
         "\x57\x45\x37\x38\x50".  
         "\x6D\x51\x57\x5F\x62".  
         "\x67\x68\x67\x3E\x4D".  
         "\x71\x79\x70\x64\x78".  
         "\x5C\x65\x67\x63".  
         "\x01".         # 8 bit values, (byte) table 1  
         "\x11\x12\x12\x18\x15".  
         "\x18\x2F\x1A\x1A\x2F".  
         "\x63\x42\x38\x42\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63\x63".  
         "\x63\x63\x63\x63".  
 #------------------------------------------------------------------  
 #       huffman("\x00").        # 0 DC  
 #       huffman("\x01").        # 1 DC  
 #       huffman("\x10").        # 0 AC  
 #       huffman("\x11").        # 1 AC  
 #------------------------------------------------------------------  
         # Define huffman table (section B.2.4.1)  
         "\xFF\xC4".             # Marker  
         "\x00\x1F".             # Length (31 bytes)  
         "\x00".                 # DC, (byte) table 0  
         "\x00\x01\x05\x01\x01".  
         "\x01\x01\x01\x01\x00".  
         "\x00\x00\x00\x00\x00".  
         "\x00\x00\x01\x02\x03".  
         "\x04\x05\x06\x07\x08".  
         "\x09\x0A\x0B".  
         # Define huffman table (section B.2.4.1)  
         "\xFF\xC4".             # Marker  
         "\x00\xB5".             # Length (181 bytes)  
         "\x10".                 # AC, (byte) table 0  
         "\x00\x02\x01\x03\x03".  
         "\x02\x04\x03\x05\x05".  
         "\x04\x04\x00\x00\x01".  
         "\x7D\x01\x02\x03\x00".  
         "\x04\x11\x05\x12\x21".  
         "\x31\x41\x06\x13\x51".  
         "\x61\x07\x22\x71\x14".  
         "\x32\x81\x91\xA1\x08".  
         "\x23\x42\xB1\xC1\x15".  
         "\x52\xD1\xF0\x24\x33".  
         "\x62\x72\x82\x09\x0A".  
         "\x16\x17\x18\x19\x1A".  
         "\x25\x26\x27\x28\x29".  
         "\x2A\x34\x35\x36\x37".  
         "\x38\x39\x3A\x43\x44".  
         "\x45\x46\x47\x48\x49".  
         "\x4A\x53\x54\x55\x56".  
         "\x57\x58\x59\x5A\x63".  
         "\x64\x65\x66\x67\x68".  
         "\x69\x6A\x73\x74\x75".  
         "\x76\x77\x78\x79\x7A".  
         "\x83\x84\x85\x86\x87".  
         "\x88\x89\x8A\x92\x93".  
         "\x94\x95\x96\x97\x98".  
         "\x99\x9A\xA2\xA3\xA4".  
         "\xA5\xA6\xA7\xA8\xA9".  
         "\xAA\xB2\xB3\xB4\xB5".  
         "\xB6\xB7\xB8\xB9\xBA".  
         "\xC2\xC3\xC4\xC5\xC6".  
         "\xC7\xC8\xC9\xCA\xD2".  
         "\xD3\xD4\xD5\xD6\xD7".  
         "\xD8\xD9\xDA\xE1\xE2".  
         "\xE3\xE4\xE5\xE6\xE7".  
         "\xE8\xE9\xEA\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, (byte) 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".  
         # Define huffman table (section B.2.4.1)  
         "\xFF\xC4".             # Marker  
         "\x00\xB5".             # Length (181 bytes)  
         "\x11".                 # AC, (byte) table 1  
         "\x00\x02\x01\x02\x04".  
         "\x04\x03\x04\x07\x05".  
         "\x04\x04\x00\x01\x02".  
         "\x77\x00\x01\x02\x03".  
         "\x11\x04\x05\x21\x31".  
         "\x06\x12\x41\x51\x07".  
         "\x61\x71\x13\x22\x32".  
         "\x81\x08\x14\x42\x91".  
         "\xA1\xB1\xC1\x09\x23".  
         "\x33\x52\xF0\x15\x62".  
         "\x72\xD1\x0A\x16\x24".  
         "\x34\xE1\x25\xF1\x17".  
         "\x18\x19\x1A\x26\x27".  
         "\x28\x29\x2A\x35\x36".  
         "\x37\x38\x39\x3A\x43".  
         "\x44\x45\x46\x47\x48".  
         "\x49\x4A\x53\x54\x55".  
         "\x56\x57\x58\x59\x5A".  
         "\x63\x64\x65\x66\x67".  
         "\x68\x69\x6A\x73\x74".  
         "\x75\x76\x77\x78\x79".  
         "\x7A\x82\x83\x84\x85".  
         "\x86\x87\x88\x89\x8A".  
         "\x92\x93\x94\x95\x96".  
         "\x97\x98\x99\x9A\xA2".  
         "\xA3\xA4\xA5\xA6\xA7".  
         "\xA8\xA9\xAA\xB2\xB3".  
         "\xB4\xB5\xB6\xB7\xB8".  
         "\xB9\xBA\xC2\xC3\xC4".  
         "\xC5\xC6\xC7\xC8\xC9".  
         "\xCA\xD2\xD3\xD4\xD5".  
         "\xD6\xD7\xD8\xD9\xDA".  
         "\xE2\xE3\xE4\xE5\xE6".  
         "\xE7\xE8\xE9\xEA\xF2".  
         "\xF3\xF4\xF5\xF6\xF7".  
         "\xF8\xF9\xFA".  
 #------------------------------------------------------------------  
                 "\xFF\xDA".     # Start of Scan marker  
         pack("nC11",  
                 12,                     # length  
                 3,                      # number of components  
                 1,0x00,         # Scan 1: use DC/AC huff tables 0/0  
                 2,0x11,         # Scan 2: use DC/AC huff tables 1/1  
                 3,0x11,         # Scan 3: use DC/AC huff tables 1/1  
                 0,0x3f,         # Ss, Se  
                 0,                      # Ah, Ai (not used)  
         );  
 #------------------------------------------------------------------  
   
         $header =  
         # SOI  
         "\xFF\xD8".  
         # JFIF  
         "\xFF\xE0".  
         "\x00\x0e\x41\x56\x49\x31\x00\x00\x00\x00\x00\x00\x00\x00".  
         "\xff\xDD\x00\x04\x00\x00".  
         # quantization table  
         "\xFF\xDB".  
         "\x00\x43\x00\x21\x16\x18".  
         "\x1D\x18\x14\x21\x1D\x1B\x1D\x25".  
         "\x23\x21\x27\x31\x53\x36\x31\x2D".  
         "\x2D\x31\x65\x48\x4c\x3c\x53\x78".  
         "\x6a\x7e\x7c\x76\x6a\x74\x72\x85".  
         "\x95\xbf\xa2\x85\x8d\xb4\x8f\x72".  
         "\x74\xa6\xe2\xa8\xb4\xc5\xcb\xd6".  
         "\xd8\xd6\x80\xa0\xeb\xfb\xe8\xd0".  
         "\xf9\xbf\xd2\xd6\xcd".  
         # quantization table  
         "\xff\xdb".  
         "\x00\x43\x01\x23\x25\x25\x31\x2b\x31".  
         "\x61\x36\x36\x61\xcd\x89\x74\x89".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd".  
         "\xcd\xcd".  
225          # Define huffman table (section B.2.4.1)          # Define huffman table (section B.2.4.1)
226          "\xFF\xC4".     # Marker          "\xFF\xC4".     # Marker
227          "\x00\x1F".     # Length (31 bytes)          "\x00\x1F".     # Length (31 bytes)
# Line 371  sub mkjpg { Line 230  sub mkjpg {
230          "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B".          "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B".
231          # Define huffman table (section B.2.4.1)          # Define huffman table (section B.2.4.1)
232          "\xFF\xC4".     # Marker          "\xFF\xC4".     # Marker
         "\x00\x1F".     # Length (31 bytes)  
         "\x01".         # DC chrominance, 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".  
         # Define huffman table (section B.2.4.1)  
         "\xFF\xC4".     # Marker  
233          "\x00\xB5".     # Length (181 bytes)          "\x00\xB5".     # Length (181 bytes)
234          "\x10".         # AC luminance, table 0          "\x10".         # AC luminance, table 0
235          "\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01\x7D".          "\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\x01\x7D".
# Line 395  sub mkjpg { Line 247  sub mkjpg {
247          "\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6\xD7\xD8".          "\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6\xD7\xD8".
248          "\xD9\xDA\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA".          "\xD9\xDA\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA".
249          "\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA".          "\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA".
250            # Define huffman table (section B.2.4.1)
251            "\xFF\xC4".     # Marker
252            "\x00\x1F".     # Length (31 bytes)
253            "\x01".         # DC chrominance, table 1
254            "\x00\x03\x01\x01\x01\x01\x01\x01\x01\x01\x01\x00".
255            "\x00\x00\x00\x00".
256            "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B".
257          #/* Define huffman table (section B.2.4.1) */          #/* Define huffman table (section B.2.4.1) */
258          "\xFF\xC4".     # Marker          "\xFF\xC4".     # Marker
259          "\x00\xB5".     # Length (181 bytes)          "\x00\xB5".     # Length (181 bytes)
# Line 415  sub mkjpg { Line 274  sub mkjpg {
274          "\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6".          "\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xD2\xD3\xD4\xD5\xD6".
275          "\xD7\xD8\xD9\xDA\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9".          "\xD7\xD8\xD9\xDA\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9".
276          "\xEA\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA".          "\xEA\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA".
277          # start of frame          # Start of Scan marker
278          "\xff\xc0".          "\xFF\xDA".
279          "\x00\x11\x08".          pack("nC10",
280          pack("nn", $h, $w).                  12,                     # length
281          "\x03\x01\x21\x00\x02\x11\x01\x03\x11\x01".                  3,                      # number of components
282          #                  1,0x00,         # Scan 1: use DC/AC huff tables 0/0
283          "\xff\xda".                  2,0x11,         # Scan 2: use DC/AC huff tables 1/1
284          "\x00\x0c\x03\x01\x00\x02\x11\x03\x11".                  3,0x11,         # Scan 3: use DC/AC huff tables 1/1
285          "\x00\x3f\x00";                  0,0x3f,         # Ss, Se
286                    0,                      # Ah, Ai (not used)
287            );
288    
289          if ( $dump ) {          if ( $dump ) {
290                  warn "## created JPEG header...\n";                  print "## created JPEG header...\n";
291                  hex_dump( $header, 0 );                  hex_dump( $header, 0 );
292          }          }
293    
294          print $fh $header || die "can't write header into $path: $!";          my $frame = join('', @subframes ) . $data;
295          print $fh $data || die "can't write frame into $path: $!";          @subframes = ();
296    
297            if ( ! $no_jpeg_header ) {
298                    print $fh $header, $frame, "\xFF\xD9" || die "can't write jpeg $path: $!";
299            } else {
300                    print $fh $frame || die "can't write raw jpeg $path: $!";
301            }
302          close $fh || die "can't close $path: $!";          close $fh || die "can't close $path: $!";
303          print ">> created $path ", -s $path, " bytes\n";          print ">> created $frame_nr ", $no_jpeg_header ? 'raw' : '', " jpeg $path ", -s $path, " bytes\n";
304  }  }
305    
306  my ( $riff, $amv ) = x(12, 'Z4x4Z4');  my ( $riff, $amv ) = x(12, 'Z4x4Z4');
# Line 477  while ( ! defined($d->{eof}) ) { Line 344  while ( ! defined($d->{eof}) ) {
344                          my $len = next_part( '00dc' );                          my $len = next_part( '00dc' );
345                          last unless $len;                          last unless $len;
346                          printf "<< %s 00dc - frame %d jpeg %d 0x%x bytes\n", $name, $frame, $len, $len;                          printf "<< %s 00dc - frame %d jpeg %d 0x%x bytes\n", $name, $frame, $len, $len;
347                          mkjpg( sprintf("$dump_dir/%03d.jpg", $frame ), x($len) );                          mkjpg( x($len) );
348    
349                          $len = next_part( '01wb', 0, 1 );                          $len = next_part( '01wb', 0, 1 );
350                          printf "<< %s 01wb - frame %d audio %d 0x%x bytes\n", $name, $frame, $len, $len;                          printf "<< %s 01wb - frame %d audio %d 0x%x bytes\n", $name, $frame, $len, $len;

Legend:
Removed from v.16  
changed lines
  Added in v.19

  ViewVC Help
Powered by ViewVC 1.1.26