--- amv.pl 2007/09/14 19:35:32 30 +++ amv.pl 2007/10/01 16:34:08 31 @@ -123,16 +123,20 @@ } } +# my $len = next_part( 'boob' ); +# my ( $len, $part ) = next_part(); + sub next_part { my ( $expected_part, $expected_len, $skip ) = @_; my ( $part, $len ) = x(8,'A4V'); return unless $len; - confess "not $expected_part but $part" if $expected_part ne $part; + confess "not $expected_part but $part" if $expected_part && $expected_part ne $part; if ( $expected_len ) { confess "expected $expected_len bytes for $part got $len" if $len != $expected_len; } printf "## next_part %s - %d 0x%x bytes\n", $part, $len, $len if $debug; x($len) if $skip; + return ( $len, $part ) if wantarray; return $len; } @@ -159,6 +163,8 @@ return $out; } +=for obsolete + sub mp3_frame { my $frame = join('', # Frame sync (all bits set) @@ -222,6 +228,8 @@ return $bits; } +=cut + my @subframes; my $frame_nr = 1; @@ -594,26 +602,48 @@ } elsif ( $name eq 'movi' ) { - while (1) { + my $have_parts = 1; + + while ( $have_parts ) { my $frame = $d->{movi}++; - - my $len = next_part( '00dc' ); - last unless $len; - printf "<< %s 00dc - part %d jpeg %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; - mkjpg( x($len) ); - - $len = next_part( '01wb' ); - printf "<< %s 01wb - part %d audio %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; - - my $audio_frame = x( $len ); - - if ( $dump_audio ) { - printf "#### dumping audio frame %d 0x%x bytes\n", length($audio_frame), length($audio_frame); - hex_dump( $audio_frame ); - } -# print $audio_fh mp3_frame; - audio_frame( $audio_frame ); + my $parts = 0; + + while ( $parts < 2 ) { + + my ( $len, $part ) = next_part(); + + if ( ! $len ) { + $have_parts = 0; + last; + } + + if ( $part eq '00dc' ) { + + printf "<< %s 00dc - part %d jpeg %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; + mkjpg( x($len) ); + $parts++; + + } elsif ( $part eq '01wb' ) { + printf "<< %s 01wb - part %d audio %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; + + my $audio_frame = x( $len ); + + if ( $dump_audio ) { + printf "#### dumping audio frame %d 0x%x bytes\n", length($audio_frame), length($audio_frame); + hex_dump( $audio_frame ); + } + + # print $audio_fh mp3_frame; + audio_frame( $audio_frame ); + + $parts++; + } else { + warn "unknown next part $part with $len bytes, skipping!"; + } + + warn "## #$frame_nr $name $part has $parts parts\n"; + } $frame_nr++;