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