1 use super::*;
2 
3 pub(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 
9 impl SenderStream {
new( next_rtp_writer: Arc<dyn RTPWriter + Send + Sync>, next_sequence_nr: Arc<AtomicU32>, hdr_ext_id: u8, ) -> Self10     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]
25 impl RTPWriter for SenderStream {
26     /// write a rtp packet
write(&self, pkt: &rtp::packet::Packet, a: &Attributes) -> Result<usize>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 }
41