diff options
author | Ryan Jackson <rdjackso@rockbox.org> | 2005-07-12 16:40:50 +0000 |
---|---|---|
committer | Ryan Jackson <rdjackso@rockbox.org> | 2005-07-12 16:40:50 +0000 |
commit | 40a8401cd35cef71b0ffa017106ee156fb3239ed (patch) | |
tree | 03975c03d4df8247c020bd85dea181f6bd6f700e /tools | |
parent | b3437ecbfefcc819dc3fb859f2c1e1894dd6cca1 (diff) |
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
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/songdb.pl | 18 | ||||
-rw-r--r-- | tools/vorbiscomm.pm | 44 |
2 files changed, 59 insertions, 3 deletions
diff --git a/tools/songdb.pl b/tools/songdb.pl index 0377bfd9e6..40d23d780d 100755 --- a/tools/songdb.pl +++ b/tools/songdb.pl @@ -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}); } diff --git a/tools/vorbiscomm.pm b/tools/vorbiscomm.pm index 4577a700a5..e2bae11276 100644 --- a/tools/vorbiscomm.pm +++ b/tools/vorbiscomm.pm @@ -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 |