interceptor/twcc/sender/
sender_stream.rs

1use super::*;
2
3pub(super) struct SenderStream {
4    next_rtp_writer: Arc<dyn RTPWriter + Send + Sync>,
5    next_sequence_nr: Arc<AtomicU32>,
6    hdr_ext_id: u8,
7}
8
9impl SenderStream {
10    pub(super) fn new(
11        next_rtp_writer: Arc<dyn RTPWriter + Send + Sync>,
12        next_sequence_nr: Arc<AtomicU32>,
13        hdr_ext_id: u8,
14    ) -> Self {
15        SenderStream {
16            next_rtp_writer,
17            next_sequence_nr,
18            hdr_ext_id,
19        }
20    }
21}
22
23/// RTPWriter is used by Interceptor.bind_local_stream.
24#[async_trait]
25impl RTPWriter for SenderStream {
26    /// write a rtp packet
27    async fn write(&self, pkt: &rtp::packet::Packet, a: &Attributes) -> Result<usize> {
28        let sequence_number = self.next_sequence_nr.fetch_add(1, Ordering::SeqCst);
29
30        let tcc_ext = TransportCcExtension {
31            transport_sequence: sequence_number as u16,
32        };
33        let tcc_payload = tcc_ext.marshal()?;
34
35        let mut pkt = pkt.clone();
36        pkt.header.set_extension(self.hdr_ext_id, tcc_payload)?;
37
38        self.next_rtp_writer.write(&pkt, a).await
39    }
40}