mirror of
https://github.com/Serial-ATA/lofty-rs
synced 2025-03-04 23:07:20 +00:00
Fix vorbis bitrate reading
This commit is contained in:
parent
ea4bc3aa1b
commit
553db7a0fe
2 changed files with 12 additions and 28 deletions
|
@ -22,18 +22,18 @@ fn read_properties<R>(data: &mut R, header_sig: &[u8], first_page: &Page) -> Res
|
|||
where
|
||||
R: Read + Seek,
|
||||
{
|
||||
let stream_len = {
|
||||
let current = data.seek(SeekFrom::Current(0))?;
|
||||
let end = data.seek(SeekFrom::End(0))?;
|
||||
data.seek(SeekFrom::Start(current))?;
|
||||
|
||||
end - first_page.start
|
||||
};
|
||||
|
||||
let properties = if header_sig == OPUSHEAD {
|
||||
let stream_len = {
|
||||
let current = data.seek(SeekFrom::Current(0))?;
|
||||
let end = data.seek(SeekFrom::End(0))?;
|
||||
data.seek(SeekFrom::Start(current))?;
|
||||
|
||||
end - first_page.start
|
||||
};
|
||||
|
||||
opus::read_properties(data, first_page, stream_len)?
|
||||
} else {
|
||||
vorbis::read_properties(data, first_page, stream_len)?
|
||||
vorbis::read_properties(data, first_page)?
|
||||
};
|
||||
|
||||
Ok(properties)
|
||||
|
|
|
@ -12,7 +12,6 @@ use std::time::Duration;
|
|||
pub(in crate::components) fn read_properties<R>(
|
||||
data: &mut R,
|
||||
first_page: &Page,
|
||||
stream_len: u64,
|
||||
) -> Result<FileProperties>
|
||||
where
|
||||
R: Read + Seek,
|
||||
|
@ -25,23 +24,8 @@ where
|
|||
let channels = first_page_content.read_u8()?;
|
||||
let sample_rate = first_page_content.read_u32::<LittleEndian>()?;
|
||||
|
||||
// Identification and metadata packets have already been skipped
|
||||
// Have to find the end of the setup packet now
|
||||
let header_end = loop {
|
||||
let page = Page::read(data, false)?;
|
||||
let segments = page.segments();
|
||||
|
||||
if let Some(seg_end) = segments.iter().position(|s| s != &255_u8) {
|
||||
let packet_size: usize = segments[..seg_end].iter().map(|s| *s as usize).sum();
|
||||
|
||||
// Position in stream + page header (26 bytes long) + segment table + however long the packet is
|
||||
let header_end = page.start + 26 + segments.len() as u64 + packet_size as u64;
|
||||
|
||||
break header_end;
|
||||
}
|
||||
};
|
||||
|
||||
let audio_size = stream_len - header_end;
|
||||
let _bitrate_max = first_page_content.read_u32::<LittleEndian>()?;
|
||||
let bitrate_nominal = first_page_content.read_u32::<LittleEndian>()?;
|
||||
|
||||
let last_page = find_last_page(data)?;
|
||||
let last_page_abgp = last_page.abgp;
|
||||
|
@ -55,7 +39,7 @@ where
|
|||
|frame_count| {
|
||||
let length = frame_count * 1000 / u64::from(sample_rate);
|
||||
let duration = Duration::from_millis(length as u64);
|
||||
let bitrate = (audio_size * 8 / length) as u32;
|
||||
let bitrate = bitrate_nominal / 1000;
|
||||
|
||||
Ok(FileProperties {
|
||||
duration,
|
||||
|
|
Loading…
Add table
Reference in a new issue