use std::sync::Arc;
use crate::pp_log::{PpLog, pp_info};
use crate::{
buffer::MediaBuffer,
control::ControlMsg,
element::{Element, ElementType, Sink, element_pp_log},
error::Result,
};
pub struct AppSink<F, C> {
pp_log: PpLog,
name: Arc<str>,
consume: F,
control: C,
}
impl<F> AppSink<F, fn(ControlMsg) -> Result<()>>
where
F: FnMut(MediaBuffer) -> Result<()> + Send + 'static,
{
pub fn new(name: impl Into<String>, consume: F) -> Self {
Self::with_control(name, consume, |_| Ok(()))
}
}
impl<F, C> AppSink<F, C>
where
F: FnMut(MediaBuffer) -> Result<()> + Send + 'static,
C: FnMut(ControlMsg) -> Result<()> + Send + 'static,
{
pub fn with_control(name: impl Into<String>, consume: F, control: C) -> Self {
let name: Arc<str> = name.into().into();
let pp_log = element_pp_log(ElementType::AppSink, &name, None);
pp_info!(pp_log: &pp_log, "created");
Self {
name,
pp_log,
consume,
control,
}
}
}
impl<F, C> Element for AppSink<F, C>
where
F: FnMut(MediaBuffer) -> Result<()> + Send + 'static,
C: FnMut(ControlMsg) -> Result<()> + Send + 'static,
{
fn name(&self) -> Arc<str> {
self.name.clone()
}
fn element_type(&self) -> ElementType {
ElementType::AppSink
}
fn pp_log(&self) -> &PpLog {
&self.pp_log
}
fn pp_log_mut(&mut self) -> &mut PpLog {
&mut self.pp_log
}
}
impl<F, C> Sink for AppSink<F, C>
where
F: FnMut(MediaBuffer) -> Result<()> + Send + 'static,
C: FnMut(ControlMsg) -> Result<()> + Send + 'static,
{
fn consume(&mut self, buf: MediaBuffer) -> Result<()> {
(self.consume)(buf)
}
fn control(&mut self, msg: ControlMsg) -> Result<()> {
(self.control)(msg)
}
}