Skip to main content

yscv_video/
stream.rs

1use crate::{Frame, FrameSource, VideoError};
2
3/// Pull-based frame stream wrapper with deterministic optional limit.
4#[derive(Debug)]
5pub struct FrameStream<S: FrameSource> {
6    source: S,
7    max_frames: Option<usize>,
8    emitted: usize,
9}
10
11impl<S: FrameSource> FrameStream<S> {
12    pub fn new(source: S) -> Self {
13        Self {
14            source,
15            max_frames: None,
16            emitted: 0,
17        }
18    }
19
20    pub fn with_max_frames(mut self, max_frames: usize) -> Self {
21        self.max_frames = Some(max_frames);
22        self
23    }
24
25    pub fn try_next(&mut self) -> Result<Option<Frame>, VideoError> {
26        if let Some(limit) = self.max_frames
27            && self.emitted >= limit
28        {
29            return Ok(None);
30        }
31        let frame = self.source.next_frame()?;
32        if frame.is_some() {
33            self.emitted += 1;
34        }
35        Ok(frame)
36    }
37}