xref: /xiu/protocol/rtsp/src/rtsp.rs (revision 06c50324)
1 use streamhub::define::StreamHubEventSender;
2 
3 use super::session::RtspServerSession;
4 use std::net::SocketAddr;
5 use tokio::io::Error;
6 use tokio::net::TcpListener;
7 
8 pub struct RtspServer {
9     address: String,
10     event_producer: StreamHubEventSender,
11 }
12 
13 impl RtspServer {
new(address: String, event_producer: StreamHubEventSender) -> Self14     pub fn new(address: String, event_producer: StreamHubEventSender) -> Self {
15         Self {
16             address,
17             event_producer,
18         }
19     }
20 
run(&mut self) -> Result<(), Error>21     pub async fn run(&mut self) -> Result<(), Error> {
22         let socket_addr: &SocketAddr = &self.address.parse().unwrap();
23         let listener = TcpListener::bind(socket_addr).await?;
24 
25         log::info!("Rtsp server listening on tcp://{}", socket_addr);
26         loop {
27             let (tcp_stream, _) = listener.accept().await?;
28             let mut session = RtspServerSession::new(tcp_stream, self.event_producer.clone());
29             tokio::spawn(async move {
30                 if let Err(err) = session.run().await {
31                     log::error!("session run error, err: {}", err);
32                 }
33             });
34         }
35     }
36 }
37