1use crate::{Frame, FrameSource, VideoError};
2
3#[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}