1- use flate2:: write:: ZlibDecoder ;
1+ use flate2:: write:: DeflateDecoder ;
22use fltk:: button:: Button ;
33use fltk:: draw;
44use 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-
11768fn 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) ;
0 commit comments