use ffmpeg_sys_next::{AVPacket, AVPacketSideDataType};
pub(crate) struct SideDataIter<'a> {
pkt: &'a AVPacket,
index: i32,
}
pub(crate) unsafe fn entries<'a>(pkt: *const AVPacket) -> SideDataIter<'a> {
SideDataIter {
pkt: &*pkt,
index: 0,
}
}
impl<'a> Iterator for SideDataIter<'a> {
type Item = Result<(AVPacketSideDataType, &'a [u8]), String>;
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.pkt.side_data_elems {
return None;
}
let entry = unsafe { &*self.pkt.side_data.add(self.index as usize) };
self.index += 1;
if entry.size == 0 {
return Some(Ok((entry.type_, &[][..])));
}
if entry.data.is_null() {
return Some(Err(format!(
"side data entry {:?} has a null payload with size {}",
entry.type_, entry.size
)));
}
let bytes = unsafe { std::slice::from_raw_parts(entry.data, entry.size) };
Some(Ok((entry.type_, bytes)))
}
}