use std::os::raw::c_int;
use crate::{AVFilterContext, AvError, Frame};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BufferSinkOutcome {
Frame,
NeedMore,
Drained,
}
pub unsafe fn buffersink_get_frame(
sink: *mut AVFilterContext,
dst: &mut Frame,
) -> Result<BufferSinkOutcome, AvError> {
let ret = unsafe { crate::av_buffersink_get_frame(sink, dst.as_mut_ptr()) };
classify_get_frame(ret)
}
fn classify_get_frame(ret: c_int) -> Result<BufferSinkOutcome, AvError> {
match ret {
r if r >= 0 => Ok(BufferSinkOutcome::Frame),
r if r == crate::error_codes::EAGAIN => Ok(BufferSinkOutcome::NeedMore),
r if r == crate::error_codes::EOF => Ok(BufferSinkOutcome::Drained),
r => Err(AvError::new(r)),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classify_get_frame_should_map_drain_states() {
assert!(matches!(
classify_get_frame(0),
Ok(BufferSinkOutcome::Frame)
));
assert!(matches!(
classify_get_frame(1),
Ok(BufferSinkOutcome::Frame)
));
assert!(matches!(
classify_get_frame(crate::error_codes::EAGAIN),
Ok(BufferSinkOutcome::NeedMore)
));
assert!(matches!(
classify_get_frame(crate::error_codes::EOF),
Ok(BufferSinkOutcome::Drained)
));
}
#[test]
fn classify_get_frame_should_return_err_on_other_negative_code() {
assert_eq!(classify_get_frame(-22), Err(AvError::new(-22)));
}
}