123 |
} |
} |
124 |
} |
} |
125 |
|
|
126 |
|
# my $len = next_part( 'boob' ); |
127 |
|
# my ( $len, $part ) = next_part(); |
128 |
|
|
129 |
sub next_part { |
sub next_part { |
130 |
my ( $expected_part, $expected_len, $skip ) = @_; |
my ( $expected_part, $expected_len, $skip ) = @_; |
131 |
my ( $part, $len ) = x(8,'A4V'); |
my ( $part, $len ) = x(8,'A4V'); |
132 |
return unless $len; |
return unless $len; |
133 |
confess "not $expected_part but $part" if $expected_part ne $part; |
confess "not $expected_part but $part" if $expected_part && $expected_part ne $part; |
134 |
if ( $expected_len ) { |
if ( $expected_len ) { |
135 |
confess "expected $expected_len bytes for $part got $len" if $len != $expected_len; |
confess "expected $expected_len bytes for $part got $len" if $len != $expected_len; |
136 |
} |
} |
137 |
printf "## next_part %s - %d 0x%x bytes\n", $part, $len, $len if $debug; |
printf "## next_part %s - %d 0x%x bytes\n", $part, $len, $len if $debug; |
138 |
x($len) if $skip; |
x($len) if $skip; |
139 |
|
return ( $len, $part ) if wantarray; |
140 |
return $len; |
return $len; |
141 |
} |
} |
142 |
|
|
163 |
return $out; |
return $out; |
164 |
} |
} |
165 |
|
|
166 |
|
=for obsolete |
167 |
|
|
168 |
sub mp3_frame { |
sub mp3_frame { |
169 |
my $frame = join('', |
my $frame = join('', |
170 |
# Frame sync (all bits set) |
# Frame sync (all bits set) |
228 |
return $bits; |
return $bits; |
229 |
} |
} |
230 |
|
|
231 |
|
=cut |
232 |
|
|
233 |
my @subframes; |
my @subframes; |
234 |
my $frame_nr = 1; |
my $frame_nr = 1; |
235 |
|
|
602 |
|
|
603 |
} elsif ( $name eq 'movi' ) { |
} elsif ( $name eq 'movi' ) { |
604 |
|
|
605 |
while (1) { |
my $have_parts = 1; |
606 |
|
|
607 |
|
while ( $have_parts ) { |
608 |
my $frame = $d->{movi}++; |
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 ); |
|
|
} |
|
609 |
|
|
610 |
# print $audio_fh mp3_frame; |
my $parts = 0; |
611 |
audio_frame( $audio_frame ); |
|
612 |
|
while ( $parts < 2 ) { |
613 |
|
|
614 |
|
my ( $len, $part ) = next_part(); |
615 |
|
|
616 |
|
if ( ! $len ) { |
617 |
|
$have_parts = 0; |
618 |
|
last; |
619 |
|
} |
620 |
|
|
621 |
|
if ( $part eq '00dc' ) { |
622 |
|
|
623 |
|
printf "<< %s 00dc - part %d jpeg %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; |
624 |
|
mkjpg( x($len) ); |
625 |
|
$parts++; |
626 |
|
|
627 |
|
} elsif ( $part eq '01wb' ) { |
628 |
|
printf "<< %s 01wb - part %d audio %d 0x%x bytes\n", $name, $frame, $len, $len if $verbose; |
629 |
|
|
630 |
|
my $audio_frame = x( $len ); |
631 |
|
|
632 |
|
if ( $dump_audio ) { |
633 |
|
printf "#### dumping audio frame %d 0x%x bytes\n", length($audio_frame), length($audio_frame); |
634 |
|
hex_dump( $audio_frame ); |
635 |
|
} |
636 |
|
|
637 |
|
# print $audio_fh mp3_frame; |
638 |
|
audio_frame( $audio_frame ); |
639 |
|
|
640 |
|
$parts++; |
641 |
|
} else { |
642 |
|
warn "unknown next part $part with $len bytes, skipping!"; |
643 |
|
} |
644 |
|
|
645 |
|
warn "## #$frame_nr $name $part has $parts parts\n" if $debug; |
646 |
|
} |
647 |
|
|
648 |
$frame_nr++; |
$frame_nr++; |
649 |
|
|