summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtools/songdb.pl18
-rw-r--r--tools/vorbiscomm.pm44
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