Skip to content

Commit 9556a50

Browse files
committed
[*] use openh264 as video encoder for windows
1 parent c43608b commit 9556a50

File tree

5 files changed

+79
-297
lines changed

5 files changed

+79
-297
lines changed

lib/mp4m/Cargo.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,4 @@ image.workspace = true
2727
env_logger.workspace = true
2828

2929
[target.'cfg(target_os = "linux")'.dev-dependencies]
30-
recorder = { workspace = true, features = [
31-
"wayland-wlr",
32-
"x264-video-encoder",
33-
] }
30+
recorder = { workspace = true, features = ["wayland-wlr"] }

lib/recorder/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ env_logger.workspace = true
5151

5252
[features]
5353
default = ["wayland-wlr"]
54-
# default = ["wayland-wlr", "openh264-video-encoder"] # TODO:
5554
windows = ["openh264-video-encoder"]
5655
wayland-wlr = ["dep:screen-capture-wayland-wlr", "x264-video-encoder"]
56+
# wayland-wlr = ["dep:screen-capture-wayland-wlr", "openh264-video-encoder"]
5757
wayland-portal = ["dep:screen-capture-wayland-portal", "x264-video-encoder"]
5858

5959
x264-video-encoder = ["dep:x264"]

lib/recorder/src/video_encoder.rs

Lines changed: 5 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
#[cfg(feature = "x264-video-encoder")]
22
mod ve_x264;
33

4-
use derive_setters::Setters;
5-
#[cfg(feature = "x264-video-encoder")]
6-
pub use ve_x264::*;
7-
84
#[cfg(feature = "openh264-video-encoder")]
95
mod ve_openh264;
106

11-
#[cfg(feature = "openh264-video-encoder")]
12-
pub use ve_openh264::*;
13-
147
use crate::{FPS, RecorderError, recorder::ResizedImageBuffer};
8+
use derive_setters::Setters;
159

1610
#[derive(Debug, Clone)]
1711
pub enum EncodedFrame {
@@ -54,48 +48,10 @@ impl VideoEncoderConfig {
5448

5549
pub fn new(config: VideoEncoderConfig) -> Result<Box<dyn VideoEncoder>, RecorderError> {
5650
#[cfg(feature = "x264-video-encoder")]
57-
let ve = X264VideoEncoder::new(config)?;
58-
59-
Ok(Box::new(ve))
60-
}
51+
let ve = ve_x264::X264VideoEncoder::new(config)?;
6152

62-
pub fn rgb_to_i420_yuv(rgb_data: &[u8], width: u32, height: u32) -> Result<Vec<u8>, RecorderError> {
63-
use yuv::{
64-
YuvChromaSubsampling, YuvConversionMode, YuvPlanarImageMut, YuvRange, YuvStandardMatrix,
65-
rgb_to_yuv420,
66-
};
53+
#[cfg(feature = "openh264-video-encoder")]
54+
let ve = ve_openh264::OpenH264VideoEncoder::new(config)?;
6755

68-
let frame_size = (width * height) as usize;
69-
70-
// Allocate YUV planar image
71-
let mut planar_image =
72-
YuvPlanarImageMut::<u8>::alloc(width, height, YuvChromaSubsampling::Yuv420);
73-
74-
// Convert RGB to YUV420
75-
rgb_to_yuv420(
76-
&mut planar_image,
77-
rgb_data,
78-
width * 3, // RGB stride (3 bytes per pixel)
79-
YuvRange::Limited,
80-
YuvStandardMatrix::Bt601,
81-
YuvConversionMode::Balanced,
82-
)
83-
.map_err(|e| {
84-
RecorderError::ImageProcessingFailed(format!("RGB to YUV conversion failed: {:?}", e))
85-
})?;
86-
87-
// Extract the YUV data from the planar image
88-
let mut yuv_data = vec![0u8; frame_size * 3 / 2];
89-
90-
// Copy Y plane
91-
yuv_data[0..frame_size].copy_from_slice(planar_image.y_plane.borrow());
92-
93-
// Copy U plane
94-
let u_plane_end = frame_size + frame_size / 4;
95-
yuv_data[frame_size..u_plane_end].copy_from_slice(planar_image.u_plane.borrow());
96-
97-
// Copy V plane
98-
yuv_data[u_plane_end..].copy_from_slice(planar_image.v_plane.borrow());
99-
100-
Ok(yuv_data)
56+
Ok(Box::new(ve))
10157
}

0 commit comments

Comments
 (0)