Skip to content

Commit 32d2035

Browse files
committed
aud_io: Move AtomReader from lofty
1 parent 782209c commit 32d2035

File tree

9 files changed

+44
-28
lines changed

9 files changed

+44
-28
lines changed

aud_io/src/io.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,19 @@ where
229229
Ok(F80::from_be_bytes(bytes))
230230
}
231231
}
232+
233+
/// Stable version of [`Seek::stream_len()`]
234+
pub trait SeekStreamLen: Seek {
235+
fn stream_len_hack(&mut self) -> Result<u64> {
236+
use std::io::SeekFrom;
237+
238+
let current_pos = self.stream_position()?;
239+
let len = self.seek(SeekFrom::End(0))?;
240+
241+
self.seek(SeekFrom::Start(current_pos))?;
242+
243+
Ok(len)
244+
}
245+
}
246+
247+
impl<T> SeekStreamLen for T where T: Seek {}

lofty/src/mp4/read/atom_reader.rs renamed to aud_io/src/mp4/atom_reader.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::config::ParsingMode;
22
use crate::error::Result;
3-
use crate::macros::err;
4-
use crate::util::io::SeekStreamLen;
3+
use super::atom_info::AtomInfo;
4+
use crate::err;
5+
use crate::io::SeekStreamLen;
56

67
use std::io::{Read, Seek, SeekFrom};
78

8-
use aud_io::mp4::AtomInfo;
99
use byteorder::{BigEndian, ReadBytesExt};
1010

1111
/// A reader for an MP4 file
@@ -15,7 +15,7 @@ use byteorder::{BigEndian, ReadBytesExt};
1515
/// * [`Self::next`] to read atoms.
1616
/// * `read_u*` methods to read integers without needing to specify the endianness.
1717
/// * Bounds checking on reads and seeks to prevent going outside the file.
18-
pub(crate) struct AtomReader<R>
18+
pub struct AtomReader<R>
1919
where
2020
R: Read + Seek,
2121
{
@@ -31,7 +31,7 @@ where
3131
R: Read + Seek,
3232
{
3333
/// Create a new `AtomReader`
34-
pub(crate) fn new(mut reader: R, parse_mode: ParsingMode) -> Result<Self> {
34+
pub fn new(mut reader: R, parse_mode: ParsingMode) -> Result<Self> {
3535
let len = reader.stream_len_hack()?;
3636
Ok(Self {
3737
reader,
@@ -47,46 +47,46 @@ where
4747
/// This is useful when reading an atom such as `moov`, where we only want to read it and its
4848
/// children. We can read the atom, set the bounds to the atom's length, and then read the children
4949
/// without worrying about reading past the atom's end.
50-
pub(crate) fn reset_bounds(&mut self, start_position: u64, len: u64) {
50+
pub fn reset_bounds(&mut self, start_position: u64, len: u64) {
5151
self.start = start_position;
5252
self.remaining_size = len;
5353
self.len = len;
5454
}
5555

56-
pub(crate) fn read_u8(&mut self) -> std::io::Result<u8> {
56+
pub fn read_u8(&mut self) -> std::io::Result<u8> {
5757
self.remaining_size = self.remaining_size.saturating_sub(1);
5858
self.reader.read_u8()
5959
}
6060

61-
pub(crate) fn read_u16(&mut self) -> std::io::Result<u16> {
61+
pub fn read_u16(&mut self) -> std::io::Result<u16> {
6262
self.remaining_size = self.remaining_size.saturating_sub(2);
6363
self.reader.read_u16::<BigEndian>()
6464
}
6565

66-
pub(crate) fn read_u24(&mut self) -> std::io::Result<u32> {
66+
pub fn read_u24(&mut self) -> std::io::Result<u32> {
6767
self.remaining_size = self.remaining_size.saturating_sub(3);
6868
self.reader.read_u24::<BigEndian>()
6969
}
7070

71-
pub(crate) fn read_u32(&mut self) -> std::io::Result<u32> {
71+
pub fn read_u32(&mut self) -> std::io::Result<u32> {
7272
self.remaining_size = self.remaining_size.saturating_sub(4);
7373
self.reader.read_u32::<BigEndian>()
7474
}
7575

76-
pub(crate) fn read_u64(&mut self) -> std::io::Result<u64> {
76+
pub fn read_u64(&mut self) -> std::io::Result<u64> {
7777
self.remaining_size = self.remaining_size.saturating_sub(8);
7878
self.reader.read_u64::<BigEndian>()
7979
}
8080

81-
pub(crate) fn read_uint(&mut self, size: usize) -> std::io::Result<u64> {
81+
pub fn read_uint(&mut self, size: usize) -> std::io::Result<u64> {
8282
self.remaining_size = self.remaining_size.saturating_sub(size as u64);
8383
self.reader.read_uint::<BigEndian>(size)
8484
}
8585

8686
/// Read the next atom in the file
8787
///
8888
/// This will leave the reader at the beginning of the atom content.
89-
pub(crate) fn next(&mut self) -> Result<Option<AtomInfo>> {
89+
pub fn next(&mut self) -> Result<Option<AtomInfo>> {
9090
if self.remaining_size == 0 {
9191
return Ok(None);
9292
}
@@ -98,7 +98,7 @@ where
9898
AtomInfo::read(self, self.remaining_size, self.parse_mode).map_err(Into::into)
9999
}
100100

101-
pub(crate) fn into_inner(self) -> R {
101+
pub fn into_inner(self) -> R {
102102
self.reader
103103
}
104104
}

aud_io/src/mp4/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
mod atom_info;
22
pub use atom_info::*;
3+
4+
mod atom_reader;
5+
pub use atom_reader::*;

lofty/src/mp4/ilst/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,6 @@ mod tests {
934934
use crate::config::{ParseOptions, ParsingMode, WriteOptions};
935935
use crate::mp4::ilst::TITLE;
936936
use crate::mp4::ilst::atom::AtomDataStorage;
937-
use crate::mp4::read::AtomReader;
938937
use crate::mp4::{AdvisoryRating, Atom, AtomData, AtomIdent, DataType, Ilst, Mp4File};
939938
use crate::picture::{MimeType, Picture, PictureType};
940939
use crate::prelude::*;
@@ -944,6 +943,8 @@ mod tests {
944943

945944
use std::io::{Cursor, Read as _, Seek as _, Write as _};
946945

946+
use aud_io::mp4::AtomReader;
947+
947948
fn read_ilst(path: &str, parse_options: ParseOptions) -> Ilst {
948949
let tag = std::fs::read(path).unwrap();
949950
read_ilst_raw(&tag, parse_options)

lofty/src/mp4/ilst/read.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ use crate::error::{LoftyError, Result};
66
use crate::id3::v1::constants::GENRES;
77
use crate::macros::{err, try_vec};
88
use crate::mp4::ilst::atom::AtomDataStorage;
9-
use crate::mp4::read::{AtomReader, skip_atom};
9+
use crate::mp4::read::skip_atom;
1010
use crate::picture::{MimeType, Picture, PictureType};
1111
use crate::tag::TagExt;
1212

1313
use std::borrow::Cow;
1414
use std::io::{Cursor, Read, Seek, SeekFrom};
1515

1616
use aud_io::text::{utf8_decode, utf16_decode_bytes};
17-
use aud_io::mp4::{ATOM_HEADER_LEN, AtomInfo};
17+
use aud_io::mp4::{ATOM_HEADER_LEN, AtomInfo, AtomReader};
1818

1919
pub(in crate::mp4) fn parse_ilst<R>(
2020
reader: &mut AtomReader<R>,

lofty/src/mp4/ilst/write.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ use crate::file::FileType;
66
use crate::macros::{decode_err, try_vec};
77
use crate::mp4::AtomData;
88
use crate::mp4::ilst::r#ref::AtomRef;
9-
use crate::mp4::read::{AtomReader, atom_tree, find_child_atom, meta_is_full, verify_mp4};
9+
use crate::mp4::read::{atom_tree, find_child_atom, meta_is_full, verify_mp4};
1010
use crate::mp4::write::{AtomWriter, AtomWriterCompanion, ContextualAtom};
1111
use crate::picture::{MimeType, Picture};
1212

1313
use std::io::{Cursor, Seek, SeekFrom, Write};
1414

15-
use aud_io::mp4::{ATOM_HEADER_LEN, AtomIdent, AtomInfo, FOURCC_LEN};
15+
use aud_io::mp4::{AtomReader, ATOM_HEADER_LEN, AtomIdent, AtomInfo, FOURCC_LEN};
1616
use aud_io::err as io_err;
1717
use aud_io::io::{FileLike, Length, Truncate};
1818
use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt};

lofty/src/mp4/moov.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use super::ilst::Ilst;
22
use super::ilst::read::parse_ilst;
3-
use super::read::{AtomReader, find_child_atom, meta_is_full, skip_atom};
3+
use super::read::{find_child_atom, meta_is_full, skip_atom};
44
use crate::config::ParseOptions;
55
use crate::error::Result;
66
use crate::macros::decode_err;
77

88
use std::io::{Read, Seek};
99

10-
use aud_io::mp4::{AtomIdent, AtomInfo};
10+
use aud_io::mp4::{AtomReader, AtomIdent, AtomInfo};
1111

1212
pub(crate) struct Moov {
1313
// Represents the trak.mdia atom

lofty/src/mp4/properties.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::read::{AtomReader, find_child_atom, skip_atom};
1+
use super::read::{find_child_atom, skip_atom};
22
use crate::config::ParsingMode;
33
use crate::error::{LoftyError, Result};
44
use crate::macros::{decode_err, err, try_vec};
@@ -7,7 +7,7 @@ use crate::properties::FileProperties;
77
use std::io::{Cursor, Read, Seek, SeekFrom};
88
use std::time::Duration;
99

10-
use aud_io::mp4::{AtomIdent, AtomInfo};
10+
use aud_io::mp4::{AtomReader, AtomIdent, AtomInfo};
1111
use aud_io::alloc::VecFallibleCapacity;
1212
use aud_io::math::RoundedDivision;
1313
use byteorder::{BigEndian, ReadBytesExt};

lofty/src/mp4/read/mod.rs renamed to lofty/src/mp4/read.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
mod atom_reader;
2-
31
use super::Mp4File;
42
use super::moov::Moov;
53
use super::properties::Mp4Properties;
@@ -10,13 +8,11 @@ use crate::util::io::SeekStreamLen;
108

119
use std::io::{Read, Seek, SeekFrom};
1210

13-
use aud_io::mp4::{AtomIdent, AtomInfo};
11+
use aud_io::mp4::{AtomIdent, AtomInfo, AtomReader};
1412
use aud_io::err as io_err;
1513
use aud_io::text::utf8_decode_str;
1614
use byteorder::{BigEndian, ReadBytesExt};
1715

18-
pub(super) use atom_reader::AtomReader;
19-
2016
pub(in crate::mp4) fn verify_mp4<R>(reader: &mut AtomReader<R>) -> Result<String>
2117
where
2218
R: Read + Seek,

0 commit comments

Comments
 (0)