Skip to content

Commit dd06b5b

Browse files
authored
Add i420_to_nv12 (#605)
1 parent e2aeb65 commit dd06b5b

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

.nanpa/i420_to_nv12.kdl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
minor type="added" "Add i420_to_nv12"

libwebrtc/src/native/yuv_helper.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,51 @@ i420_to_rgba!(i420_to_bgra);
245245
i420_to_rgba!(i420_to_abgr);
246246
i420_to_rgba!(i420_to_rgba);
247247

248+
pub fn i420_to_nv12(
249+
src_y: &[u8],
250+
src_stride_y: u32,
251+
src_u: &[u8],
252+
src_stride_u: u32,
253+
src_v: &[u8],
254+
src_stride_v: u32,
255+
dst_y: &mut [u8],
256+
dst_stride_y: u32,
257+
dst_uv: &mut [u8],
258+
dst_stride_uv: u32,
259+
width: i32,
260+
height: i32,
261+
) {
262+
i420_assert_safety(
263+
src_y,
264+
src_stride_y,
265+
src_u,
266+
src_stride_u,
267+
src_v,
268+
src_stride_v,
269+
width,
270+
height,
271+
);
272+
nv12_assert_safety(dst_y, dst_stride_y, dst_uv, dst_stride_uv, width, height);
273+
274+
unsafe {
275+
yuv_sys::ffi::i420_to_nv12(
276+
src_y.as_ptr(),
277+
src_stride_y as i32,
278+
src_u.as_ptr(),
279+
src_stride_u as i32,
280+
src_v.as_ptr(),
281+
src_stride_v as i32,
282+
dst_y.as_mut_ptr(),
283+
dst_stride_y as i32,
284+
dst_uv.as_mut_ptr(),
285+
dst_stride_uv as i32,
286+
width,
287+
height,
288+
)
289+
.unwrap();
290+
}
291+
}
292+
248293
pub fn nv12_to_i420(
249294
src_y: &[u8],
250295
src_stride_y: u32,

webrtc-sys/include/livekit/yuv_helper.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,23 @@ static void nv12_to_i420(const uint8_t* src_y,
164164
dst_v, dst_stride_v, width, height));
165165
}
166166

167+
static void i420_to_nv12(const uint8_t* src_y,
168+
int src_stride_y,
169+
const uint8_t* src_u,
170+
int src_stride_u,
171+
uint8_t* src_v,
172+
int src_stride_v,
173+
uint8_t* dst_y,
174+
int dst_stride_y,
175+
uint8_t* dst_uv,
176+
int dst_stride_uv,
177+
int width,
178+
int height) {
179+
THROW_ON_ERROR(webrtc::NV12ToI420(src_y, src_stride_y, src_u, src_stride_u,
180+
src_v, src_stride_v, dst_y, dst_stride_y,
181+
dst_uv, dst_stride_uv, width, height));
182+
}
183+
167184
static void i444_to_i420(const uint8_t* src_y,
168185
int src_stride_y,
169186
const uint8_t* src_u,

webrtc-sys/src/yuv_helper.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,21 @@ pub mod ffi {
121121
height: i32,
122122
) -> Result<()>;
123123

124+
unsafe fn i420_to_nv12(
125+
src_y: *const u8,
126+
src_stride_y: i32,
127+
src_u: *const u8,
128+
src_stride_u: i32,
129+
src_v: *const u8,
130+
src_stride_v: i32,
131+
dst_y: *mut u8,
132+
dst_stride_y: i32,
133+
dst_uv: *mut u8,
134+
dst_stride_uv: i32,
135+
width: i32,
136+
height: i32,
137+
) -> Result<()>;
138+
124139
unsafe fn i444_to_i420(
125140
src_y: *const u8,
126141
src_stride_y: i32,

0 commit comments

Comments
 (0)