ralfbiedert / openh264-rs

Idiomatic Rust wrappers around OpenH264.
66 stars 32 forks source link

Strides? #52

Closed xnorpx closed 4 weeks ago

xnorpx commented 1 month ago

I have a hard time grasping the strides values here.

I have 320x180 in dimensions and I am not sure what strides values can be to pass both asserts.

yuv.0 len() = 57600 yuv1.len() = 14400 yuv2.len() = 14400

/// Convenience wrapper if you already have YUV-sliced data from some other place.
#[must_use]
pub struct YUVSlices<'a> {
    dimensions: (usize, usize),
    yuv: (&'a [u8], &'a [u8], &'a [u8]),
    strides: (usize, usize, usize),
}

impl<'a> YUVSlices<'a> {
    /// Creates a new YUV slice.
    #[allow(unused)] // TODO: add nice unit test
    pub fn new(yuv: (&'a [u8], &'a [u8], &'a [u8]), dimensions: (usize, usize), strides: (usize, usize, usize)) -> Self {
        assert!(strides.0 >= dimensions.0);
        assert!(strides.1 >= dimensions.0);
        assert!(strides.2 >= dimensions.0);

        assert_eq!(dimensions.1 * strides.0, yuv.0.len());
        assert_eq!(dimensions.1 * strides.1, yuv.1.len());
        assert_eq!(dimensions.1 * strides.2, yuv.2.len());

        Self {
            dimensions,
            yuv,
            strides,
        }
    }
}
xnorpx commented 4 weeks ago

@ralfbiedert can you do a 0.6.1 release with the merged change?

ralfbiedert commented 4 weeks ago

Should be published as 0.6.1 now. Also, I did a quick search, but found no reason why force_intra_frame should be unsafe, so I changed it. Please let me know if you think that is wrong.

xnorpx commented 4 weeks ago

No I think you are correct!

Thanks for publishing!