@@ -5,14 +5,15 @@ use tokio_util::sync::CancellationToken;
55use crate :: frame_ws:: { WSFrame , create_frame_ws} ;
66
77pub async fn create_camera_preview_ws ( ) -> ( Sender < FFmpegVideoFrame > , u16 , CancellationToken ) {
8- let ( camera_tx, mut _camera_rx) = flume:: bounded :: < FFmpegVideoFrame > ( 4 ) ;
9- let ( _camera_tx, camera_rx) = flume:: bounded :: < WSFrame > ( 4 ) ;
8+ let ( camera_tx, mut camera_rx) = flume:: bounded :: < FFmpegVideoFrame > ( 4 ) ;
9+ let ( frame_tx, _) = tokio:: sync:: broadcast:: channel :: < WSFrame > ( 4 ) ;
10+ let frame_tx_clone = frame_tx. clone ( ) ;
1011 std:: thread:: spawn ( move || {
1112 use ffmpeg:: format:: Pixel ;
1213
1314 let mut converter: Option < ( Pixel , ffmpeg:: software:: scaling:: Context ) > = None ;
1415
15- while let Ok ( raw_frame) = _camera_rx . recv ( ) {
16+ while let Ok ( raw_frame) = camera_rx . recv ( ) {
1617 let mut frame = raw_frame. inner ;
1718
1819 if frame. format ( ) != Pixel :: RGBA || frame. width ( ) > 1280 || frame. height ( ) > 720 {
@@ -55,7 +56,7 @@ pub async fn create_camera_preview_ws() -> (Sender<FFmpegVideoFrame>, u16, Cance
5556 frame = new_frame;
5657 }
5758
58- _camera_tx
59+ frame_tx_clone
5960 . send ( WSFrame {
6061 data : frame. data ( 0 ) . to_vec ( ) ,
6162 width : frame. width ( ) ,
@@ -66,7 +67,7 @@ pub async fn create_camera_preview_ws() -> (Sender<FFmpegVideoFrame>, u16, Cance
6667 }
6768 } ) ;
6869 // _shutdown needs to be kept alive to keep the camera ws running
69- let ( camera_ws_port, _shutdown) = create_frame_ws ( camera_rx . clone ( ) ) . await ;
70+ let ( camera_ws_port, _shutdown) = create_frame_ws ( frame_tx ) . await ;
7071
7172 ( camera_tx, camera_ws_port, _shutdown)
7273}
0 commit comments