I'm not sure enough when it happens, but it seems that Packet::last_in_page returns wrong values in most cases.
Here is NON-minimum code that reproduces the error:
use std::fs::File;
use std::io::{BufReader, Read, SeekFrom, Seek};
use std::fmt::Debug;
use ogg::reading::{PacketReader, OggReadError};
use ogg::Packet;
use itertools::Itertools;
fn iter_packet<'a, R: Read + Seek>(reader: &'a mut PacketReader<R>) -> impl Iterator<Item=(u64, u64, Result<Packet, OggReadError>)> + 'a {
std::iter::repeat_with(move || {
let begin_pos = reader.seek_bytes(SeekFrom::Current(0)).unwrap();
let packet = reader.read_packet().transpose();
let end_pos = reader.seek_bytes(SeekFrom::Current(0)).unwrap();
packet.map(|p| (begin_pos, end_pos, p))
})
.take_while(|x| x.is_some())
.flatten()
}
fn packet_tuple(p: &Packet) -> impl Debug {
(
p.stream_serial(),
p.first_in_stream(),
p.first_in_page(),
p.last_in_page(),
p.last_in_stream(),
p.absgp_page(),
{
let mut data_iter = p.data.iter();
let first = data_iter.by_ref().take(16).map(|x| format!("{:02x}", x)).collect::<String>();
let remain = match data_iter.next() {
Some(_) => "...",
None => "",
};
format!("{}{}", first, remain)
}
)
}
fn main() -> anyhow::Result<()> {
let file = File::open("song.ogg")?;
let mut reader = PacketReader::new(BufReader::new(file));
let packets = iter_packet(&mut reader).map(|x| x.2).collect::<Result<Vec<_>, _>>()?;
for (absgp, mut packets) in &packets.iter().group_by(|p| p.absgp_page()) {
let first = packets.next().expect("There are at least one element in a group");
let last = packets.last().unwrap_or(first);
println!("{}\t{:?}\t{:?}", absgp, packet_tuple(first), packet_tuple(last));
}
Ok(())
}
In the sample code above, each the packet are grouped according to the absgp indicated by the page that it belongs, then the first and the last packet in each group is outputted. It is expected that last packet in each group returns true for last_in_page, but it returns false.
I'm not sure enough when it happens, but it seems that
Packet::last_in_page
returns wrong values in most cases. Here is NON-minimum code that reproduces the error:It outputs:
In the sample code above, each the packet are grouped according to the absgp indicated by the page that it belongs, then the first and the last packet in each group is outputted. It is expected that last packet in each group returns
true
forlast_in_page
, but it returnsfalse
.Any idea why it happens?