use std::sync::Arc;
use crate::{
buffer::MediaBuffer,
control::ControlMsg,
element::{ElementType, Sink},
error::Result,
pp_log::{PpLog, pp_trace},
};
pub struct SrcPad {
name: String,
peer: Option<Box<dyn Sink>>,
}
impl SrcPad {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
peer: None,
}
}
pub fn name(&self) -> &str {
&self.name
}
pub fn is_linked(&self) -> bool {
self.peer.is_some()
}
pub fn peer_identity(&self) -> Option<(ElementType, Arc<str>)> {
self.peer
.as_ref()
.map(|sink| (sink.element_type(), sink.name()))
}
pub(crate) fn link(&mut self, sink: Box<dyn Sink>) {
self.peer = Some(sink);
}
pub fn push(&mut self, buf: MediaBuffer) -> Result<()> {
match &mut self.peer {
Some(sink) => sink.consume(buf),
None => Ok(()),
}
}
pub(crate) fn push_eos(&mut self, pp_log: &PpLog) -> Result<()> {
if self.peer.is_none() {
pp_trace!(
pp_log: pp_log,
"event=eos phase=skipped pad={} reason=unlinked",
self.name
);
return Ok(());
}
pp_trace!(
pp_log: pp_log,
"event=eos phase=sending pad={}",
self.name
);
let result = self.push(MediaBuffer::Eos);
match &result {
Ok(()) => pp_trace!(
pp_log: pp_log,
"event=eos phase=sent pad={} outcome=ok",
self.name
),
Err(error) => pp_trace!(
pp_log: pp_log,
"event=eos phase=sent pad={} outcome=error error={error}",
self.name
),
}
result
}
pub fn control(&mut self, msg: ControlMsg) -> Result<()> {
match &mut self.peer {
Some(sink) => sink.control(msg),
None => Ok(()),
}
}
}