mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-03-17 00:16:50 +08:00
feat(video): 事务化切换与前端统一编排,增强视频输入格式支持
- 后端:切换事务+transition_id,/stream/mode 返回 switching/transition_id 与实际 codec - 事件:新增 mode_switching/mode_ready,config/webrtc_ready/mode_changed 关联事务 - 编码/格式:扩展 NV21/NV16/NV24/RGB/BGR 输入与转换链路,RKMPP direct input 优化 - 前端:useVideoSession 统一切换,失败回退真实切回 MJPEG,菜单格式同步修复 - 清理:useVideoStream 降级为 MJPEG-only
This commit is contained in:
@@ -7,9 +7,8 @@ use bytes::Bytes;
|
||||
use protobuf::Message as ProtobufMessage;
|
||||
|
||||
use super::protocol::hbb::message::{
|
||||
message as msg_union, misc as misc_union, video_frame as vf_union,
|
||||
AudioFormat, AudioFrame, CursorData, CursorPosition,
|
||||
EncodedVideoFrame, EncodedVideoFrames, Message, Misc, VideoFrame,
|
||||
message as msg_union, misc as misc_union, video_frame as vf_union, AudioFormat, AudioFrame,
|
||||
CursorData, CursorPosition, EncodedVideoFrame, EncodedVideoFrames, Message, Misc, VideoFrame,
|
||||
};
|
||||
|
||||
/// Video codec type for RustDesk
|
||||
@@ -63,7 +62,12 @@ impl VideoFrameAdapter {
|
||||
/// Convert encoded video data to RustDesk Message (zero-copy version)
|
||||
///
|
||||
/// This version takes Bytes directly to avoid copying the frame data.
|
||||
pub fn encode_frame_from_bytes(&mut self, data: Bytes, is_keyframe: bool, timestamp_ms: u64) -> Message {
|
||||
pub fn encode_frame_from_bytes(
|
||||
&mut self,
|
||||
data: Bytes,
|
||||
is_keyframe: bool,
|
||||
timestamp_ms: u64,
|
||||
) -> Message {
|
||||
// Calculate relative timestamp
|
||||
if self.seq == 0 {
|
||||
self.timestamp_base = timestamp_ms;
|
||||
@@ -104,13 +108,23 @@ impl VideoFrameAdapter {
|
||||
/// Encode frame to bytes for sending (zero-copy version)
|
||||
///
|
||||
/// Takes Bytes directly to avoid copying the frame data.
|
||||
pub fn encode_frame_bytes_zero_copy(&mut self, data: Bytes, is_keyframe: bool, timestamp_ms: u64) -> Bytes {
|
||||
pub fn encode_frame_bytes_zero_copy(
|
||||
&mut self,
|
||||
data: Bytes,
|
||||
is_keyframe: bool,
|
||||
timestamp_ms: u64,
|
||||
) -> Bytes {
|
||||
let msg = self.encode_frame_from_bytes(data, is_keyframe, timestamp_ms);
|
||||
Bytes::from(msg.write_to_bytes().unwrap_or_default())
|
||||
}
|
||||
|
||||
/// Encode frame to bytes for sending
|
||||
pub fn encode_frame_bytes(&mut self, data: &[u8], is_keyframe: bool, timestamp_ms: u64) -> Bytes {
|
||||
pub fn encode_frame_bytes(
|
||||
&mut self,
|
||||
data: &[u8],
|
||||
is_keyframe: bool,
|
||||
timestamp_ms: u64,
|
||||
) -> Bytes {
|
||||
self.encode_frame_bytes_zero_copy(Bytes::copy_from_slice(data), is_keyframe, timestamp_ms)
|
||||
}
|
||||
|
||||
@@ -234,15 +248,13 @@ mod tests {
|
||||
let msg = adapter.encode_frame(&data, true, 0);
|
||||
|
||||
match &msg.union {
|
||||
Some(msg_union::Union::VideoFrame(vf)) => {
|
||||
match &vf.union {
|
||||
Some(vf_union::Union::H264s(frames)) => {
|
||||
assert_eq!(frames.frames.len(), 1);
|
||||
assert!(frames.frames[0].key);
|
||||
}
|
||||
_ => panic!("Expected H264s"),
|
||||
Some(msg_union::Union::VideoFrame(vf)) => match &vf.union {
|
||||
Some(vf_union::Union::H264s(frames)) => {
|
||||
assert_eq!(frames.frames.len(), 1);
|
||||
assert!(frames.frames[0].key);
|
||||
}
|
||||
}
|
||||
_ => panic!("Expected H264s"),
|
||||
},
|
||||
_ => panic!("Expected VideoFrame"),
|
||||
}
|
||||
}
|
||||
@@ -256,15 +268,13 @@ mod tests {
|
||||
assert!(adapter.format_sent());
|
||||
|
||||
match &msg.union {
|
||||
Some(msg_union::Union::Misc(misc)) => {
|
||||
match &misc.union {
|
||||
Some(misc_union::Union::AudioFormat(fmt)) => {
|
||||
assert_eq!(fmt.sample_rate, 48000);
|
||||
assert_eq!(fmt.channels, 2);
|
||||
}
|
||||
_ => panic!("Expected AudioFormat"),
|
||||
Some(msg_union::Union::Misc(misc)) => match &misc.union {
|
||||
Some(misc_union::Union::AudioFormat(fmt)) => {
|
||||
assert_eq!(fmt.sample_rate, 48000);
|
||||
assert_eq!(fmt.channels, 2);
|
||||
}
|
||||
}
|
||||
_ => panic!("Expected AudioFormat"),
|
||||
},
|
||||
_ => panic!("Expected Misc"),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user