use crate::impl_thread_safety;
#[cxx::bridge(namespace = "livekit_ffi")]
pub mod ffi {
#[derive(Debug)]
#[repr(i32)]
pub enum VideoFrameBufferType {
Native,
I420,
I420A,
I422,
I444,
I010,
NV12,
}
unsafe extern "C++" {
include!("livekit/video_frame_buffer.h");
type VideoFrameBuffer;
type PlanarYuvBuffer;
type PlanarYuv8Buffer;
type PlanarYuv16BBuffer;
type BiplanarYuvBuffer;
type BiplanarYuv8Buffer;
type I420Buffer;
type I420ABuffer;
type I422Buffer;
type I444Buffer;
type I010Buffer;
type NV12Buffer;
type PlatformImageBuffer;
fn buffer_type(self: &VideoFrameBuffer) -> VideoFrameBufferType;
fn width(self: &VideoFrameBuffer) -> u32;
fn height(self: &VideoFrameBuffer) -> u32;
unsafe fn to_i420(self: &VideoFrameBuffer) -> UniquePtr<I420Buffer>;
unsafe fn get_i420(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<I420Buffer>;
unsafe fn get_i420a(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<I420ABuffer>;
unsafe fn get_i422(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<I422Buffer>;
unsafe fn get_i444(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<I444Buffer>;
unsafe fn get_i010(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<I010Buffer>;
unsafe fn get_nv12(self: Pin<&mut VideoFrameBuffer>) -> UniquePtr<NV12Buffer>;
fn chroma_width(self: &PlanarYuvBuffer) -> u32;
fn chroma_height(self: &PlanarYuvBuffer) -> u32;
fn stride_y(self: &PlanarYuvBuffer) -> u32;
fn stride_u(self: &PlanarYuvBuffer) -> u32;
fn stride_v(self: &PlanarYuvBuffer) -> u32;
fn data_y(self: &PlanarYuv8Buffer) -> *const u8;
fn data_u(self: &PlanarYuv8Buffer) -> *const u8;
fn data_v(self: &PlanarYuv8Buffer) -> *const u8;
fn data_y(self: &PlanarYuv16BBuffer) -> *const u16;
fn data_u(self: &PlanarYuv16BBuffer) -> *const u16;
fn data_v(self: &PlanarYuv16BBuffer) -> *const u16;
fn chroma_width(self: &BiplanarYuvBuffer) -> u32;
fn chroma_height(self: &BiplanarYuvBuffer) -> u32;
fn stride_y(self: &BiplanarYuvBuffer) -> u32;
fn stride_uv(self: &BiplanarYuvBuffer) -> u32;
fn data_y(self: &BiplanarYuv8Buffer) -> *const u8;
fn data_uv(self: &BiplanarYuv8Buffer) -> *const u8;
fn stride_a(self: &I420ABuffer) -> u32;
fn data_a(self: &I420ABuffer) -> *const u8;
fn scale(self: &I420Buffer, scaled_width: i32, scaled_height: i32)
-> UniquePtr<I420Buffer>;
fn scale(
self: &I420ABuffer,
scaled_width: i32,
scaled_height: i32,
) -> UniquePtr<I420ABuffer>;
fn scale(self: &I422Buffer, scaled_width: i32, scaled_height: i32)
-> UniquePtr<I422Buffer>;
fn scale(self: &I444Buffer, scaled_width: i32, scaled_height: i32)
-> UniquePtr<I444Buffer>;
fn scale(self: &I010Buffer, scaled_width: i32, scaled_height: i32)
-> UniquePtr<I010Buffer>;
fn scale(self: &NV12Buffer, scaled_width: i32, scaled_height: i32)
-> UniquePtr<NV12Buffer>;
fn copy_i420_buffer(i420: &UniquePtr<I420Buffer>) -> UniquePtr<I420Buffer>;
fn new_i420_buffer(
width: i32,
height: i32,
stride_y: i32,
stride_u: i32,
stride_v: i32,
) -> UniquePtr<I420Buffer>;
fn new_i422_buffer(
width: i32,
height: i32,
stride_y: i32,
stride_u: i32,
stride_v: i32,
) -> UniquePtr<I422Buffer>;
fn new_i444_buffer(
width: i32,
height: i32,
stride_y: i32,
stride_u: i32,
stride_v: i32,
) -> UniquePtr<I444Buffer>;
fn new_i010_buffer(
width: i32,
height: i32,
stride_y: i32,
stride_u: i32,
stride_v: i32,
) -> UniquePtr<I010Buffer>;
fn new_nv12_buffer(
width: i32,
height: i32,
stride_y: i32,
stride_uv: i32,
) -> UniquePtr<NV12Buffer>;
unsafe fn new_native_buffer_from_platform_image_buffer(
platform_native_buffer: *mut PlatformImageBuffer,
) -> UniquePtr<VideoFrameBuffer>;
unsafe fn native_buffer_to_platform_image_buffer(
buffer: &UniquePtr<VideoFrameBuffer>,
) -> *mut PlatformImageBuffer;
unsafe fn yuv_to_vfb(yuv: *const PlanarYuvBuffer) -> *const VideoFrameBuffer;
unsafe fn biyuv_to_vfb(yuv: *const BiplanarYuvBuffer) -> *const VideoFrameBuffer;
unsafe fn yuv8_to_yuv(yuv8: *const PlanarYuv8Buffer) -> *const PlanarYuvBuffer;
unsafe fn yuv16b_to_yuv(yuv16b: *const PlanarYuv16BBuffer) -> *const PlanarYuvBuffer;
unsafe fn biyuv8_to_biyuv(biyuv8: *const BiplanarYuv8Buffer) -> *const BiplanarYuvBuffer;
unsafe fn i420_to_yuv8(i420: *const I420Buffer) -> *const PlanarYuv8Buffer;
unsafe fn i420a_to_yuv8(i420a: *const I420ABuffer) -> *const PlanarYuv8Buffer;
unsafe fn i422_to_yuv8(i422: *const I422Buffer) -> *const PlanarYuv8Buffer;
unsafe fn i444_to_yuv8(i444: *const I444Buffer) -> *const PlanarYuv8Buffer;
unsafe fn i010_to_yuv16b(i010: *const I010Buffer) -> *const PlanarYuv16BBuffer;
unsafe fn nv12_to_biyuv8(nv12: *const NV12Buffer) -> *const BiplanarYuv8Buffer;
fn _unique_video_frame_buffer() -> UniquePtr<VideoFrameBuffer>;
}
}
impl_thread_safety!(ffi::VideoFrameBuffer, Send + Sync);
impl_thread_safety!(ffi::PlanarYuvBuffer, Send + Sync);
impl_thread_safety!(ffi::PlanarYuv8Buffer, Send + Sync);
impl_thread_safety!(ffi::PlanarYuv16BBuffer, Send + Sync);
impl_thread_safety!(ffi::BiplanarYuvBuffer, Send + Sync);
impl_thread_safety!(ffi::BiplanarYuv8Buffer, Send + Sync);
impl_thread_safety!(ffi::I420Buffer, Send + Sync);
impl_thread_safety!(ffi::I420ABuffer, Send + Sync);
impl_thread_safety!(ffi::I422Buffer, Send + Sync);
impl_thread_safety!(ffi::I444Buffer, Send + Sync);
impl_thread_safety!(ffi::I010Buffer, Send + Sync);
impl_thread_safety!(ffi::NV12Buffer, Send + Sync);