@@ -9,94 +9,6 @@ static LAST_LOG_TIME: AtomicU64 = AtomicU64::new(0);
99
1010const NV12_FORMAT_MAGIC : u32 = 0x4e563132 ;
1111
12- fn convert_to_nv12 ( data : & [ u8 ] , width : u32 , height : u32 , stride : u32 ) -> Vec < u8 > {
13- let width = ( width & !1 ) as usize ;
14- let height = ( height & !1 ) as usize ;
15-
16- if width == 0 || height == 0 {
17- return Vec :: new ( ) ;
18- }
19-
20- let y_size = width * height;
21- let uv_size = width * ( height / 2 ) ;
22- let stride = stride as usize ;
23-
24- let mut output = vec ! [ 0u8 ; y_size + uv_size] ;
25- let ( y_plane, uv_plane) = output. split_at_mut ( y_size) ;
26-
27- for row in 0 ..height {
28- let src_offset = row * stride;
29- let y_offset = row * width;
30-
31- if src_offset + width * 4 > data. len ( ) {
32- continue ;
33- }
34-
35- let src_row = & data[ src_offset..] ;
36- let y_row = & mut y_plane[ y_offset..y_offset + width] ;
37-
38- for x in 0 ..width {
39- let px = x * 4 ;
40- let r = src_row[ px] as i32 ;
41- let g = src_row[ px + 1 ] as i32 ;
42- let b = src_row[ px + 2 ] as i32 ;
43- y_row[ x] = ( ( ( 66 * r + 129 * g + 25 * b + 128 ) >> 8 ) + 16 ) . min ( 255 ) as u8 ;
44- }
45-
46- if row % 2 == 0 {
47- let uv_offset = ( row / 2 ) * width;
48- let uv_row = & mut uv_plane[ uv_offset..uv_offset + width] ;
49-
50- let mut x = 0 ;
51- while x < width {
52- let px0 = x * 4 ;
53- let px1 = ( x + 1 ) * 4 ;
54-
55- let r0 = src_row[ px0] as i32 ;
56- let g0 = src_row[ px0 + 1 ] as i32 ;
57- let b0 = src_row[ px0 + 2 ] as i32 ;
58- let r1 = src_row[ px1] as i32 ;
59- let g1 = src_row[ px1 + 1 ] as i32 ;
60- let b1 = src_row[ px1 + 2 ] as i32 ;
61-
62- let avg_r = ( r0 + r1) >> 1 ;
63- let avg_g = ( g0 + g1) >> 1 ;
64- let avg_b = ( b0 + b1) >> 1 ;
65-
66- uv_row[ x] = ( ( ( -38 * avg_r - 74 * avg_g + 112 * avg_b + 128 ) >> 8 ) + 128 )
67- . clamp ( 0 , 255 ) as u8 ;
68- uv_row[ x + 1 ] = ( ( ( 112 * avg_r - 94 * avg_g - 18 * avg_b + 128 ) >> 8 ) + 128 )
69- . clamp ( 0 , 255 ) as u8 ;
70-
71- x += 2 ;
72- }
73- }
74- }
75-
76- output
77- }
78-
79- fn pack_nv12_frame (
80- data : Vec < u8 > ,
81- width : u32 ,
82- height : u32 ,
83- frame_number : u32 ,
84- target_time_ns : u64 ,
85- ) -> Vec < u8 > {
86- let y_stride = width;
87- let metadata_size = 28 ;
88- let mut output = Vec :: with_capacity ( data. len ( ) + metadata_size) ;
89- output. extend_from_slice ( & data) ;
90- output. extend_from_slice ( & y_stride. to_le_bytes ( ) ) ;
91- output. extend_from_slice ( & height. to_le_bytes ( ) ) ;
92- output. extend_from_slice ( & width. to_le_bytes ( ) ) ;
93- output. extend_from_slice ( & frame_number. to_le_bytes ( ) ) ;
94- output. extend_from_slice ( & target_time_ns. to_le_bytes ( ) ) ;
95- output. extend_from_slice ( & NV12_FORMAT_MAGIC . to_le_bytes ( ) ) ;
96-
97- output
98- }
99-
10012fn pack_frame_data (
10113 mut data : Vec < u8 > ,
10214 stride : u32 ,
@@ -172,49 +84,6 @@ pub struct WSFrame {
17284 pub created_at : Instant ,
17385}
17486
175- impl WSFrame {
176- pub fn from_rendered_frame_nv12 (
177- data : Vec < u8 > ,
178- width : u32 ,
179- height : u32 ,
180- stride : u32 ,
181- frame_number : u32 ,
182- target_time_ns : u64 ,
183- ) -> Self {
184- let nv12_data = convert_to_nv12 ( & data, width, height, stride) ;
185- Self {
186- data : nv12_data,
187- width : width & !1 ,
188- height : height & !1 ,
189- stride : width & !1 ,
190- frame_number,
191- target_time_ns,
192- format : WSFrameFormat :: Nv12 ,
193- created_at : Instant :: now ( ) ,
194- }
195- }
196- }
197-
198- fn pack_ws_frame ( frame : WSFrame ) -> Vec < u8 > {
199- match frame. format {
200- WSFrameFormat :: Nv12 => pack_nv12_frame (
201- frame. data ,
202- frame. width ,
203- frame. height ,
204- frame. frame_number ,
205- frame. target_time_ns ,
206- ) ,
207- WSFrameFormat :: Rgba => pack_frame_data (
208- frame. data ,
209- frame. stride ,
210- frame. height ,
211- frame. width ,
212- frame. frame_number ,
213- frame. target_time_ns ,
214- ) ,
215- }
216- }
217-
21887fn pack_ws_frame_ref ( frame : & WSFrame ) -> Vec < u8 > {
21988 match frame. format {
22089 WSFrameFormat :: Nv12 => pack_nv12_frame_ref (
@@ -355,7 +224,7 @@ pub async fn create_watch_frame_ws(
355224 tokio:: select! {
356225 _ = server => { } ,
357226 _ = cancel_token. cancelled( ) => {
358- println !( "WebSocket server shutting down" ) ;
227+ tracing :: info !( "WebSocket server shutting down" ) ;
359228 }
360229 }
361230 } ) ;
@@ -385,7 +254,6 @@ pub async fn create_frame_ws(frame_tx: broadcast::Sender<WSFrame>) -> (u16, Canc
385254 }
386255
387256 async fn handle_socket ( mut socket : WebSocket , mut camera_rx : broadcast:: Receiver < WSFrame > ) {
388- println ! ( "socket connection established" ) ;
389257 tracing:: info!( "Socket connection established" ) ;
390258 let now = std:: time:: Instant :: now ( ) ;
391259
@@ -438,7 +306,6 @@ pub async fn create_frame_ws(frame_tx: broadcast::Sender<WSFrame>) -> (u16, Canc
438306 }
439307
440308 let elapsed = now. elapsed ( ) ;
441- println ! ( "Websocket closing after {elapsed:.2?}" ) ;
442309 tracing:: info!( "Websocket closing after {elapsed:.2?}" ) ;
443310 }
444311
@@ -457,7 +324,7 @@ pub async fn create_frame_ws(frame_tx: broadcast::Sender<WSFrame>) -> (u16, Canc
457324 tokio:: select! {
458325 _ = server => { } ,
459326 _ = cancel_token. cancelled( ) => {
460- println !( "WebSocket server shutting down" ) ;
327+ tracing :: info !( "WebSocket server shutting down" ) ;
461328 }
462329 }
463330 } ) ;
0 commit comments