songdb.pl now calculates the checksum for Ogg Vorbis files by starting at the first page of audio data

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7124 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Ryan Jackson 2005-07-12 16:40:50 +00:00
parent b3437ecbfe
commit 40a8401cd3
2 changed files with 59 additions and 3 deletions

View file

@ -106,6 +106,16 @@ sub get_oggtag {
return \%hash;
}
sub get_ogginfo {
my $fn = shift;
my %hash;
my $ogg = vorbiscomm->new($fn);
my $h= $ogg->load;
return $ogg->{'INFO'};
}
# return ALL directory entries in the given dir
sub getdir {
@ -231,17 +241,19 @@ sub crc32 {
sub singlefile {
my ($file) = @_;
my $hash;
my $info;
if($file =~ /\.ogg$/i) {
$hash = get_oggtag($file);
# CRC from 0 until we figure out exactly where the audio data starts!
$hash->{FILECRC} = crc32($file, 0);
$info = get_ogginfo($file);
$hash->{FILECRC} = crc32($file, $info->{audio_offset});
}
else {
$hash = get_mp3tag($file);
my $info = get_mp3info($file);
$info = get_mp3info($file);
$hash->{FILECRC} = crc32($file, $info->{headersize});
}

View file

@ -415,6 +415,50 @@ sub _loadComments
$data->{'INFO'}{'offset'} = $byteCount;
$data->{'COMMENTS'} = \%comments;
# Now find the offset of the first page
# with audio data.
while(_findPage($fh))
{
$byteCount = tell($fh) - 4;
# version flag
read($fh, $buffer, 1);
if (ord($buffer) != 0x00)
{
warn "Invalid stream structure version: " .
sprintf("%x", ord($buffer));
return;
}
# header type flag
read($fh, $buffer, 1);
# Audio data starts as a fresh packet on a new page, so
# if header_type is odd it's not a fresh packet
next if ( ord($buffer) % 2 );
# skip past granule position, stream_serial_number,
# page_sequence_number, and crc
read($fh, $buffer, 20);
# page_segments
read($fh, $buffer, 1);
my $page_segments = ord($buffer);
# skip past the segment table
read($fh, $buffer, $page_segments);
# read packet_type byte
read($fh, $buffer, 1);
# Not an audio packet. All audio packet numbers are even
next if ( ord($buffer) % 2 );
# Found the first audio packet
last;
}
$data->{'INFO'}{'audio_offset'} = $byteCount;
}
sub _calculateTrackLength