1- use flate2:: write:: DeflateDecoder ;
21use fltk:: button:: Button ;
3- use fltk:: draw;
42use fltk:: enums:: Color ;
53use fltk:: frame:: Frame ;
64use fltk:: input:: Input ;
@@ -12,6 +10,8 @@ use std::hash::Hasher;
1210use std:: io:: Read ;
1311use std:: io:: Write ;
1412use std:: net:: TcpStream ;
13+ use std:: sync:: atomic:: AtomicI32 ;
14+ use std:: sync:: atomic:: Ordering ;
1515use std:: sync:: Arc ;
1616use std:: sync:: RwLock ;
1717
@@ -23,7 +23,6 @@ use fltk::prelude::GroupExt;
2323use fltk:: prelude:: ImageExt ;
2424use fltk:: prelude:: WidgetBase ;
2525use fltk:: prelude:: WidgetExt ;
26- use rayon:: prelude:: * ;
2726
2827use crate :: bitmap;
2928
@@ -40,7 +39,7 @@ pub fn app_run() {
4039 ) ;
4140 wind. set_color ( Color :: from_rgb ( 255 , 255 , 255 ) ) ;
4241 let mut host_ipt = Input :: new ( 80 , 20 , 200 , 25 , "HOST:" ) ;
43- host_ipt. set_value ( "127.0.0.1:80 " ) ;
42+ host_ipt. set_value ( "127.0.0.1:38971 " ) ;
4443 let mut pwd_ipt = SecretInput :: new ( 80 , 50 , 200 , 25 , "PASS:" ) ;
4544 pwd_ipt. set_value ( "diffscreen" ) ;
4645 let mut login_btn = Button :: new ( 200 , 80 , 80 , 40 , "Login" ) ;
@@ -109,17 +108,22 @@ fn draw(host: String, pwd: String) {
109108 if let Err ( _) = conn. read_exact ( & mut meta) {
110109 return ;
111110 }
112- let w = ( ( ( meta[ 0 ] as u16 ) << 8 ) | meta[ 1 ] as u16 ) as i32 ;
113- let h = ( ( ( meta[ 2 ] as u16 ) << 8 ) | meta[ 3 ] as u16 ) as i32 ;
111+ let iw = ( ( ( meta[ 0 ] as u16 ) << 8 ) | meta[ 1 ] as u16 ) as i32 ;
112+ let ih = ( ( ( meta[ 2 ] as u16 ) << 8 ) | meta[ 3 ] as u16 ) as i32 ;
114113
115- let dlen = ( w * h * 3 ) as usize ;
114+ let wh = Arc :: new ( ( AtomicI32 :: new ( iw ) , AtomicI32 :: new ( ih ) ) ) ;
116115
117- let work_buf = Arc :: new ( RwLock :: new ( vec ! [ 0u8 ; dlen] ) ) ;
116+
117+ // let dlen = (w * h * 3) as usize;
118+
119+ let work_buf = Arc :: new ( RwLock :: new ( ( 0usize , 0usize , Vec :: < u8 > :: new ( ) ) ) ) ;
118120 let draw_work_buf = work_buf. clone ( ) ;
119121 let mut hooked = false ;
120122 let mut bmap = bitmap:: Bitmap :: new ( ) ;
121123 let mut cmd_buf = [ 0u8 ; 5 ] ;
124+ let wh1 = wh. clone ( ) ;
122125 frame. handle ( move |f, ev| {
126+ let ( w, h) = ( wh1. 0 . load ( Ordering :: Relaxed ) , wh1. 1 . load ( Ordering :: Relaxed ) ) ;
123127 match ev {
124128 Event :: Enter => {
125129 // 进入窗口
@@ -215,20 +219,14 @@ fn draw(host: String, pwd: String) {
215219 }
216220 true
217221 } ) ;
218- let _tool_str = Arc :: new ( RwLock :: new ( String :: new ( ) ) ) ;
219- let _tool_strc = _tool_str. clone ( ) ;
220222 frame. draw ( move |frame|{
221- if let Ok ( _buf ) = draw_work_buf. read ( ) {
223+ if let Ok ( p ) = draw_work_buf. read ( ) {
222224 unsafe {
223225 if let Ok ( mut image) =
224- image:: RgbImage :: from_data2 ( & _buf , w , h , enums:: ColorDepth :: Rgb8 as i32 , 0 )
226+ image:: RgbImage :: from_data2 ( & p . 2 , p . 0 as _ , p . 1 as _ , enums:: ColorDepth :: Rgb8 as i32 , 0 )
225227 {
226228 image. scale ( frame. width ( ) , frame. height ( ) , false , true ) ;
227- image. draw ( frame. x ( ) , frame. y ( ) , frame. width ( ) , frame. height ( ) ) ;
228- draw:: set_color_rgb ( 0 , 0 , 0 ) ;
229- if let Ok ( a) = _tool_strc. read ( ) {
230- draw:: draw_text ( & a, frame. x ( ) + frame. width ( ) - 180 , 20 ) ;
231- }
229+ image. draw ( frame. x ( ) , frame. y ( ) , frame. width ( ) , frame. height ( ) ) ;
232230 }
233231 }
234232 }
@@ -237,94 +235,46 @@ fn draw(host: String, pwd: String) {
237235 let ( tx, rx) = app:: channel :: < Msg > ( ) ;
238236
239237 std:: thread:: spawn ( move || {
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 ( ) ;
244238 let mut buf = Vec :: < u8 > :: new ( ) ;
239+ let fps = 30 ;
245240
246- // FPS
247- let mut last = std:: time:: Instant :: now ( ) ;
248- let mut fps = 0u8 ;
249- let mut fpscount = 0u8 ;
250- // 流速
251- let mut _length_all = 0usize ;
252- let mut _length_sum = 0usize ;
253- // 接收第一帧数据
254- let mut header = [ 0u8 ; 3 ] ;
255- if let Err ( _) = conn. read_exact ( & mut header) {
256- return ;
257- }
258- let recv_len = depack ( & header) ;
259- _length_sum += recv_len;
260-
261- if buf. capacity ( ) < recv_len {
262- buf. resize ( recv_len, 0u8 ) ;
263- }
264- if let Err ( e) = conn. read_exact ( & mut buf) {
265- println ! ( "error {}" , e) ;
266- return ;
267- }
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 ( ) ;
241+ let ecfg = vpx_codec:: decoder:: Config {
242+ width : iw as _ ,
243+ height : ih as _ ,
244+ timebase : [ 1 , ( fps as i32 ) * 1000 ] , // 120fps
245+ bitrate : 8192 ,
246+ codec : vpx_codec:: decoder:: VideoCodecId :: VP8 ,
247+ } ;
274248
275- if let Ok ( mut _buf) = work_buf. write ( ) {
276- dscom:: convert:: i420_to_rgb ( w as usize , h as usize , & yuv[ ..u] , & yuv[ u..v] , & yuv[ v..] , & mut _buf) ;
277- }
278- ( _yuv, yuv) = ( yuv, _yuv) ;
279- tx. send ( Msg :: Draw ) ;
249+ let mut dec = vpx_codec:: decoder:: Decoder :: new ( ecfg) . unwrap ( ) ;
280250
281251 loop {
252+ let mut header = [ 0u8 ; 3 ] ;
282253 if let Err ( _) = conn. read_exact ( & mut header) {
283254 return ;
284255 }
285256 let recv_len = depack ( & header) ;
286- _length_sum += recv_len;
287257
288- if buf. capacity ( ) < recv_len {
289- buf. resize ( recv_len, 0u8 ) ;
290- } else {
291- unsafe {
292- buf. set_len ( recv_len) ;
293- }
294- }
295- if let Err ( _) = conn. read_exact ( & mut buf) {
258+ buf. resize ( recv_len, 0u8 ) ;
259+ if let Err ( e) = conn. read_exact ( & mut buf) {
260+ println ! ( "error {}" , e) ;
296261 return ;
297262 }
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 ^ * a;
306- } ) ;
307263
308- if let Ok ( mut _buf) = work_buf. write ( ) {
309- dscom:: convert:: i420_to_rgb ( w as usize , h as usize , & yuv[ ..u] , & yuv[ u..v] , & yuv[ v..] , & mut _buf) ;
310- }
311- ( _yuv, yuv) = ( yuv, _yuv) ;
312- {
313- let cur = std:: time:: Instant :: now ( ) ;
314- let dur = cur. duration_since ( last) ;
315- fpscount += 1 ;
316- if dur. as_millis ( ) >= 1000 {
317- last = cur;
318- _length_all = _length_sum;
319- if let Ok ( mut a) = _tool_str. write ( ) {
320- * a = format ! ( "FPS:{:2} | Rate:{:>6}KB/s" , fps, _length_all / 1024 ) ;
264+ if let Ok ( pkgs) = dec. decode ( & buf) {
265+ for ele in pkgs {
266+ let ( y, u, v) = ele. data ( ) ;
267+ if let Ok ( mut p) = work_buf. write ( ) {
268+ p. 0 = ele. width ( ) ;
269+ p. 1 = ele. height ( ) ;
270+ wh. 0 . store ( ele. width ( ) as _ , Ordering :: Relaxed ) ;
271+ wh. 1 . store ( ele. height ( ) as _ , Ordering :: Relaxed ) ;
272+ p. 2 . resize ( ele. width ( ) * ele. height ( ) * 3 , 0u8 ) ;
273+ dscom:: convert:: i420_to_rgb ( ele. width ( ) , ele. height ( ) , y, u, v, & mut p. 2 ) ;
321274 }
322- fps = fpscount;
323- fpscount = 0 ;
324- _length_sum = 0 ;
275+ tx. send ( Msg :: Draw ) ;
325276 }
326277 }
327- tx. send ( Msg :: Draw ) ;
328278 }
329279 } ) ;
330280 while app:: wait ( ) {
0 commit comments