1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use crate::VideoFormat;
pub(super) const VBI_HD_MIN_PIXEL_WIDTH: u32 = 1280;

// rustdoc-stripper-ignore-next
/// Video Vertical Blanking Interval related Errors.
#[derive(thiserror::Error, Clone, Copy, Debug, Eq, PartialEq)]
pub enum VideoVBIError {
    #[error("Format and/or pixel_width is not supported")]
    Unsupported,

    #[error("Not enough space left in the current line")]
    NotEnoughSpace,

    #[error("Not enough data left in the current line")]
    NotEnoughData,

    #[error("Insufficient line buffer length {found}. Expected: {expected}")]
    InsufficientLineBufLen { found: usize, expected: usize },
}

// rustdoc-stripper-ignore-next
/// Returns the buffer length needed to store the line.
pub(super) fn line_buffer_len(format: VideoFormat, width: u32) -> usize {
    skip_assert_initialized!();
    // Taken from gst-plugins-base/gst-libs/gst/video/video-info.c:fill_planes
    match format {
        VideoFormat::V210 => ((width as usize + 47) / 48) * 128,
        VideoFormat::Uyvy => {
            // round up width to the next multiple of 4
            // FIXME: {integer}::next_multiple_of was stabilised in rustc 1.73.0
            ((width as usize * 2) + 3) & !3
        }
        _ => unreachable!(),
    }
}