diff --git a/encoder/src/main.rs b/encoder/src/main.rs index ecd1084..4f18f11 100644 --- a/encoder/src/main.rs +++ b/encoder/src/main.rs @@ -1,19 +1,17 @@ -use std::{sync::Arc, thread::{self, sleep}, time::Duration}; +use std::{net::SocketAddr, result, sync::Arc, thread::{self, sleep}, time::Duration}; use image::{ImageBuffer, Rgb}; use nokhwa::{pixel_format::RgbFormat, utils::{ApiBackend, RequestedFormat, RequestedFormatType, Resolution}, Camera}; use anyhow::{Context, Ok, Result}; use openh264::{encoder::Encoder, formats::{RgbSliceU8, YUVBuffer}, nal_units}; -use tokio::{runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet}; +use tokio::{io::AsyncWriteExt, net::{TcpListener, TcpStream}, runtime::Runtime, sync::{Notify, RwLock}, task::LocalSet}; fn main() -> Result<()>{ let await_frame = Arc::new(Notify::new()); let latest_frame = Arc::new(RwLock::new(YUVBuffer::new(0, 0))); - println!("Hello, world!"); - - let runtime = Runtime::new()?; { + let runtime = Runtime::new()?; let await_frame = await_frame.clone(); let latest_frame = latest_frame.clone(); thread::spawn(move || { @@ -22,11 +20,18 @@ fn main() -> Result<()>{ }); } - Runtime::new()?.block_on(async move { - stream_video(await_frame.clone(), latest_frame.clone()).await.unwrap(); - }); + { + let runtime = Runtime::new()?; + let await_frame = await_frame.clone(); + let latest_frame = latest_frame.clone(); + thread::spawn(move || { + let local = LocalSet::new(); + local.block_on(&runtime, server(await_frame, latest_frame)).unwrap(); + }); + } - Ok(()) + + loop {} } async fn camera_manager(await_frame: Arc, latest_frame: Arc>) -> Result<()>{ @@ -52,7 +57,7 @@ async fn camera_manager(await_frame: Arc, latest_frame: Arc, latest_frame: Arc>) -> Result<()>{ +async fn stream_video(await_frame: Arc, latest_frame: Arc>, mut client: TcpStream) -> Result<()>{ let mut encoder = Encoder::new()?; loop { @@ -61,8 +66,25 @@ async fn stream_video(await_frame: Arc, latest_frame: Arc, latest_frame: Arc>) -> Result<()> { + let port = 2993; + let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?; + println!("listening on {port}"); + + while let result::Result::Ok((client, addr)) = listener.accept().await { + println!("connected to {:?}", addr); + + tokio::task::spawn_local(stream_video(await_frame.clone(), latest_frame.clone(), client)); + } Ok(()) }