interceptor/twcc/sender/
sender_stream.rs1use 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#[async_trait]
25impl RTPWriter for SenderStream {
26 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}