//! `frame_ingest` — RTSP pull + decode + timestamp.
//!
//! Real implementation lands in:
//! - AZ-657 `frame_ingest_rtsp_session`
//! - AZ-658 `frame_ingest_decoder`
//! - AZ-659 `frame_ingest_publisher`
use tokio::sync::broadcast;
use shared::health::ComponentHealth;
use shared::models::frame::Frame;
const NAME: &str = "frame_ingest";
pub struct FrameIngest {
tx: broadcast::Sender,
}
impl FrameIngest {
pub fn new(channel_capacity: usize) -> Self {
let (tx, _rx) = broadcast::channel(channel_capacity);
Self { tx }
}
pub fn handle(&self) -> FrameIngestHandle {
FrameIngestHandle {
tx: self.tx.clone(),
}
}
}
#[derive(Clone)]
pub struct FrameIngestHandle {
tx: broadcast::Sender,
}
impl FrameIngestHandle {
/// Subscribe to the frame stream. Consumers receive every frame after they
/// subscribed; back-pressure is implemented via broadcast channel lag (see
/// AZ-659 for the slow-consumer policy).
pub fn subscribe(&self) -> broadcast::Receiver {
self.tx.subscribe()
}
pub fn health(&self) -> ComponentHealth {
ComponentHealth::disabled(NAME)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_compiles() {
let h = FrameIngest::new(8).handle();
assert_eq!(h.health().level, shared::health::HealthLevel::Disabled);
}
}