Skip to content

Commit 3ddf1e4

Browse files
committed
将rgb转换为yuv传输
1 parent de57f08 commit 3ddf1e4

File tree

8 files changed

+145
-155
lines changed

8 files changed

+145
-155
lines changed

dsclient/src/client.rs

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use flate2::write::ZlibDecoder;
1+
use flate2::write::DeflateDecoder;
22
use fltk::button::Button;
33
use fltk::draw;
44
use fltk::enums::Color;
@@ -65,55 +65,6 @@ fn depack(buffer: &[u8]) -> usize {
6565
((buffer[0] as usize) << 16) | ((buffer[1] as usize) << 8) | (buffer[2] as usize)
6666
}
6767

68-
struct DefDecoder {
69-
decoder: ZlibDecoder<Vec<u8>>,
70-
}
71-
72-
impl DefDecoder {
73-
#[inline]
74-
fn new(mut swap: Vec<u8>) -> Self {
75-
unsafe {
76-
swap.set_len(0);
77-
}
78-
Self {
79-
decoder: ZlibDecoder::new(swap),
80-
}
81-
}
82-
#[inline]
83-
fn write_all(&mut self, buf: &[u8]) {
84-
self.decoder.write_all(buf).unwrap();
85-
}
86-
#[inline]
87-
fn read(&mut self, mut swap: Vec<u8>) -> Vec<u8> {
88-
unsafe {
89-
swap.set_len(0);
90-
}
91-
let s = self.decoder.reset(swap).unwrap();
92-
return s;
93-
}
94-
}
95-
96-
/*
97-
a: 老图像
98-
b: 压缩图像
99-
return: 新图像, 老图像
100-
*/
101-
#[inline]
102-
fn unzip_and_swap(
103-
mut unzip: DefDecoder,
104-
a: Vec<u8>,
105-
mut b: Vec<u8>,
106-
) -> (DefDecoder, Vec<u8>, Vec<u8>) {
107-
// 解压
108-
unzip.write_all(&mut b);
109-
let mut b = unzip.read(b);
110-
// 计算差异
111-
b.par_iter_mut().zip(a.par_iter()).for_each(|(d1, d2)| {
112-
*d1 ^= *d2;
113-
});
114-
return (unzip, b, a);
115-
}
116-
11768
fn draw(host: String, pwd: String) {
11869
let mut conn = TcpStream::connect(host).unwrap();
11970
// 认证
@@ -286,10 +237,12 @@ fn draw(host: String, pwd: String) {
286237
let (tx, rx) = app::channel::<Msg>();
287238

288239
std::thread::spawn(move || {
289-
let a = Vec::<u8>::with_capacity(dlen);
290-
let mut b = Vec::<u8>::with_capacity(dlen);
291-
let c = Vec::<u8>::with_capacity(dlen);
292-
let mut unzip = DefDecoder::new(c);
240+
let u = (w * h) as usize;
241+
let v = u + u/4;
242+
let mut yuv = Vec::<u8>::new();
243+
let mut _yuv = Vec::<u8>::new();
244+
let mut buf = Vec::<u8>::new();
245+
293246
// FPS
294247
let mut last = std::time::Instant::now();
295248
let mut fps = 0u8;
@@ -304,18 +257,25 @@ fn draw(host: String, pwd: String) {
304257
}
305258
let recv_len = depack(&header);
306259
_length_sum += recv_len;
307-
unsafe {
308-
b.set_len(recv_len);
260+
261+
if buf.capacity() < recv_len {
262+
buf.resize(recv_len, 0u8);
309263
}
310-
if let Err(e) = conn.read_exact(&mut b) {
264+
if let Err(e) = conn.read_exact(&mut buf) {
311265
println!("error {}", e);
312266
return;
313267
}
314-
unzip.write_all(&b);
315-
let mut a = unzip.read(a);
268+
unsafe {
269+
yuv.set_len(0);
270+
}
271+
let mut d = DeflateDecoder::new(yuv);
272+
d.write_all(&buf).unwrap();
273+
yuv = d.reset(Vec::new()).unwrap();
274+
316275
if let Ok(mut _buf) = work_buf.write() {
317-
_buf.copy_from_slice(&a);
276+
dscom::convert::i420_to_rgb(w as usize, h as usize, &yuv[..u], &yuv[u..v], &yuv[v..], &mut _buf);
318277
}
278+
(_yuv, yuv) = (yuv, _yuv);
319279
tx.send(Msg::Draw);
320280

321281
loop {
@@ -324,16 +284,31 @@ fn draw(host: String, pwd: String) {
324284
}
325285
let recv_len = depack(&header);
326286
_length_sum += recv_len;
327-
unsafe {
328-
b.set_len(recv_len);
287+
288+
if buf.capacity() < recv_len {
289+
buf.resize(recv_len, 0u8);
290+
} else {
291+
unsafe {
292+
buf.set_len(recv_len);
293+
}
329294
}
330-
if let Err(_) = conn.read_exact(&mut b) {
295+
if let Err(_) = conn.read_exact(&mut buf) {
331296
return;
332297
}
333-
(unzip, a, b) = unzip_and_swap(unzip, a, b);
298+
unsafe {
299+
yuv.set_len(0);
300+
}
301+
d.write_all(&buf).unwrap();
302+
yuv = d.reset(yuv).unwrap();
303+
304+
yuv.par_iter_mut().zip(_yuv.par_iter()).for_each(|(a, b)| {
305+
*a = b.wrapping_sub(*a);
306+
});
307+
334308
if let Ok(mut _buf) = work_buf.write() {
335-
_buf.copy_from_slice(&a);
309+
dscom::convert::i420_to_rgb(w as usize, h as usize, &yuv[..u], &yuv[u..v], &yuv[v..], &mut _buf);
336310
}
311+
(_yuv, yuv) = (yuv, _yuv);
337312
{
338313
let cur = std::time::Instant::now();
339314
let dur = cur.duration_since(last);

dsclient/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
1+
// #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
22
mod bitmap;
33
mod client;
44

dscom/src/convert.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
pub fn bgra_to_i420(width: usize, height: usize, src: &[u8], dest: &mut Vec<u8>) {
2+
let stride = src.len() / height;
3+
unsafe {
4+
dest.set_len(0);
5+
}
6+
7+
for y in 0..height {
8+
for x in 0..width {
9+
let o = y * stride + 4 * x;
10+
11+
let b = src[o] as i32;
12+
let g = src[o + 1] as i32;
13+
let r = src[o + 2] as i32;
14+
15+
let y = (66 * r + 129 * g + 25 * b + 128) / 256 + 16;
16+
dest.push(clamp(y));
17+
}
18+
}
19+
20+
for y in (0..height).step_by(2) {
21+
for x in (0..width).step_by(2) {
22+
let o = y * stride + 4 * x;
23+
24+
let b = src[o] as i32;
25+
let g = src[o + 1] as i32;
26+
let r = src[o + 2] as i32;
27+
28+
let u = (-38 * r - 74 * g + 112 * b + 128) / 256 + 128;
29+
dest.push(clamp(u));
30+
}
31+
}
32+
33+
for y in (0..height).step_by(2) {
34+
for x in (0..width).step_by(2) {
35+
let o = y * stride + 4 * x;
36+
37+
let b = src[o] as i32;
38+
let g = src[o + 1] as i32;
39+
let r = src[o + 2] as i32;
40+
41+
let v = (112 * r - 94 * g - 18 * b + 128) / 256 + 128;
42+
dest.push(clamp(v));
43+
}
44+
}
45+
}
46+
47+
fn clamp(x: i32) -> u8 {
48+
x.min(255).max(0) as u8
49+
}
50+
51+
pub fn i420_to_rgb(width: usize, height: usize, sy: &[u8], su: &[u8], sv: &[u8], dest: &mut [u8]) {
52+
let uvw = width >> 1;
53+
for i in 0..height {
54+
let sw = i * width;
55+
let t = (i >> 1) * uvw;
56+
for j in 0..width {
57+
let mut rgbstart = sw + j;
58+
let uvi = t + (j >> 1);
59+
60+
let y = sy[rgbstart] as i32;
61+
let u = su[uvi] as i32 - 128;
62+
let v = sv[uvi] as i32 - 128;
63+
64+
rgbstart *= 3;
65+
dest[rgbstart] = clamp(y + (v * 359 >> 8));
66+
dest[rgbstart + 1] = clamp(y - (u * 88 >> 8) - (v * 182 >> 8));
67+
dest[rgbstart + 2] = clamp(y + (u * 453 >> 8));
68+
}
69+
}
70+
}

dscom/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ pub const MOUSE_WHEEL_UP: u8 = 5;
88
pub const MOUSE_WHEEL_DOWN: u8 = 6;
99
pub const MOVE: u8 = 7;
1010
// key事件 end
11+
pub mod convert;

dsserver/src/config.rs

Lines changed: 0 additions & 2 deletions
This file was deleted.

dsserver/src/main.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
mod key_mouse;
22
mod screen;
33
mod server;
4-
mod config;
54
fn main() {
65
let args: Vec<String> = std::env::args().collect();
76

dsserver/src/screen.rs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
use scrap::Capturer;
22
use scrap::Display;
33
use std::io::ErrorKind::WouldBlock;
4+
use std::slice::from_raw_parts;
45
use std::time::Duration;
5-
use rayon::prelude::*;
6-
7-
use crate::config;
86

97
/**
108
* 截屏
119
*/
1210
pub struct Cap {
1311
w: usize,
1412
h: usize,
15-
// org_len: usize,
1613
capturer: Option<Capturer>,
1714
sleep: Duration,
1815
}
@@ -24,7 +21,6 @@ impl Cap {
2421
Cap {
2522
w,
2623
h,
27-
// org_len: w * h * 4,
2824
capturer: Some(capturer),
2925
sleep: Duration::new(1, 0) / 60,
3026
}
@@ -45,12 +41,11 @@ impl Cap {
4541
};
4642
self.capturer = Some(capturer);
4743
}
48-
#[inline]
4944
pub fn wh(&self) -> (usize, usize) {
50-
return (self.w, self.h);
45+
(self.w, self.h)
5146
}
5247
#[inline]
53-
pub fn cap(&mut self, cap_buf: &mut [u8]) {
48+
pub fn cap(&mut self) -> &[u8] {
5449
loop {
5550
match &mut self.capturer {
5651
Some(capturer) => {
@@ -70,14 +65,7 @@ impl Cap {
7065
}
7166
}
7267
};
73-
74-
// 转换成rgb图像数组
75-
cap_buf.par_chunks_exact_mut(3).zip(buffer.par_chunks_exact(4)).for_each(|(c, b)|{
76-
c[0] = b[2] & config::BIT_MASK;
77-
c[1] = b[1] & config::BIT_MASK;
78-
c[2] = b[0] & config::BIT_MASK;
79-
});
80-
break;
68+
return unsafe { from_raw_parts(buffer.as_ptr(), buffer.len()) };
8169
}
8270
None => {
8371
std::thread::sleep(std::time::Duration::from_millis(200));

0 commit comments

Comments
 (0)