1use crate::avcodec::AvError;
6use crate::avcodec::AvPixelFormat;
7use crate::ffi;
8
9pub const AV_NOPTS_VALUE: u64 = 0x8000000000000000;
10const MAX_FFMPEG_PLANES: usize = 4;
11
12pub fn max_buffer_alignment() -> usize {
15 unsafe { ffi::av_cpu_max_align() }
18}
19
20pub(crate) fn av_image_line_size(
22 format: AvPixelFormat,
23 width: u32,
24 plane: usize,
25) -> Result<usize, AvError> {
26 match unsafe { ffi::av_image_get_linesize(format.pix_fmt(), width as _, plane as _) } {
29 i if i >= 0 => Ok(i as _),
30 err => Err(AvError(err)),
31 }
32}
33
34pub(crate) fn av_image_plane_sizes<I: IntoIterator<Item = u32>>(
36 format: AvPixelFormat,
37 linesizes: I,
38 height: u32,
39) -> Result<Vec<usize>, AvError> {
40 let mut linesizes_buf = [0; MAX_FFMPEG_PLANES];
41 let mut planes = 0;
42 for (i, linesize) in linesizes.into_iter().take(MAX_FFMPEG_PLANES).enumerate() {
43 linesizes_buf[i] = linesize as _;
44 planes += 1;
45 }
46 let mut plane_sizes_buf = [0; MAX_FFMPEG_PLANES];
47 AvError::result(unsafe {
51 ffi::av_image_fill_plane_sizes(
52 plane_sizes_buf.as_mut_ptr(),
53 format.pix_fmt(),
54 height as _,
55 linesizes_buf.as_ptr(),
56 )
57 })?;
58 Ok(plane_sizes_buf
59 .into_iter()
60 .map(|x| x as _)
61 .take(planes)
62 .collect())
63}