* Create README.md * add example * crates & examples * fix syntax * add LICENSE * thirdparty LICENSE * rearrange repo * fix build * egui versions * prepare publish * fix demo compilation * add test ci * Update rust.yml * forgot runs-on * install protoc before building * avoid rate limit * include submodules * updates to readme * cache rust builds Co-authored-by: David Zhao <[email protected]> Co-authored-by: David Zhao <[email protected]>
44 lines
1.2 KiB
Rust
44 lines
1.2 KiB
Rust
use std::convert::TryInto;
|
|
|
|
use webrtc_sys::yuv_helper as yuv_sys;
|
|
|
|
pub fn i420_to_abgr(
|
|
src_y: &[u8],
|
|
src_stride_y: i32,
|
|
src_u: &[u8],
|
|
src_stride_u: i32,
|
|
src_v: &[u8],
|
|
src_stride_v: i32,
|
|
dst_abgr: &mut [u8],
|
|
dst_stride_abgr: i32,
|
|
width: i32,
|
|
height: i32,
|
|
) {
|
|
// Assert minimum capacity for safety
|
|
let chroma_height = (height + 1) / 2; // the buffer should be padded?
|
|
let min_y: usize = (src_stride_y * height).try_into().unwrap();
|
|
let min_u: usize = (src_stride_u * chroma_height).try_into().unwrap();
|
|
let min_v: usize = (src_stride_v * chroma_height).try_into().unwrap();
|
|
let min_abgr: usize = (dst_stride_abgr * height).try_into().unwrap();
|
|
|
|
assert!(src_y.len() >= min_y);
|
|
assert!(src_u.len() >= min_u);
|
|
assert!(src_v.len() >= min_v);
|
|
assert!(dst_abgr.len() >= min_abgr);
|
|
|
|
unsafe {
|
|
yuv_sys::ffi::i420_to_abgr(
|
|
src_y.as_ptr(),
|
|
src_stride_y,
|
|
src_u.as_ptr(),
|
|
src_stride_u,
|
|
src_v.as_ptr(),
|
|
src_stride_v,
|
|
dst_abgr.as_mut_ptr(),
|
|
dst_stride_abgr,
|
|
width,
|
|
height,
|
|
);
|
|
}
|
|
}
|