@@ -9,7 +9,7 @@ use crate::Mtu;
99use report:: ReportsQueue ;
1010use rtp:: {
1111 RtpPacket , Ssrc ,
12- rtcp_types:: { Compound , Packet as RtcpPacket } ,
12+ rtcp_types:: { Compound , Fir , Packet as RtcpPacket , Pli , RtcpPacketParser } ,
1313} ;
1414use ssrc_hasher:: SsrcHasher ;
1515use std:: {
@@ -44,15 +44,20 @@ pub struct RtpSession {
4444
4545impl RtpSession {
4646 /// Create a new RTP session
47- pub fn new ( ) -> Self {
47+ pub fn new ( rtcp_rsize : bool ) -> Self {
4848 Self {
4949 next_tx_ssrc : Ssrc ( rand:: random ( ) ) ,
5050 tx : HashMap :: default ( ) ,
5151 rx : HashMap :: default ( ) ,
52- reports : ReportsQueue :: default ( ) ,
52+ reports : ReportsQueue :: new ( rtcp_rsize ) ,
5353 }
5454 }
5555
56+ /// Is reduced size RTCP allowed
57+ pub fn rtcp_rsize ( & self ) -> bool {
58+ self . reports . rtcp_rsize ( )
59+ }
60+
5661 /// Create a new outbound RTP stream with the given parameters
5762 pub fn new_tx_stream ( & mut self , clock_rate : u32 ) -> & mut RtpOutboundStream {
5863 let ssrc = self . next_tx_ssrc ;
@@ -100,13 +105,20 @@ impl RtpSession {
100105 }
101106
102107 /// Hand of the RTCP packet to the RTP session
103- pub fn receive_rtcp ( & mut self , now : Instant , rtcp_packet : Compound < ' _ > ) {
108+ #[ must_use]
109+ pub fn receive_rtcp (
110+ & mut self ,
111+ now : Instant ,
112+ rtcp_packet : Compound < ' _ > ,
113+ ) -> Vec < RtpSessionReceiveRtcpEvent > {
114+ let mut events = vec ! [ ] ;
115+
104116 for rtcp_packet in rtcp_packet {
105117 let rtcp_packet = match rtcp_packet {
106118 Ok ( rtcp_packet) => rtcp_packet,
107119 Err ( e) => {
108120 log:: warn!( "Failed to parse RTCP packet in compound packet, {e}" ) ;
109- return ;
121+ return events ;
110122 }
111123 } ;
112124
@@ -139,14 +151,36 @@ impl RtpSession {
139151 RtcpPacket :: TransportFeedback ( _transport_feedback) => {
140152 // TODO: handle feedback
141153 }
142- RtcpPacket :: PayloadFeedback ( _payload_feedback) => {
143- // TODO: handle feedback
154+ RtcpPacket :: PayloadFeedback ( payload_feedback) => {
155+ if payload_feedback. parse_fci :: < Pli > ( ) . is_ok ( ) {
156+ events. push ( RtpSessionReceiveRtcpEvent :: NackPliReceived ( Ssrc (
157+ payload_feedback. media_ssrc ( ) ,
158+ ) ) ) ;
159+ } else if let Ok ( fir) = payload_feedback. parse_fci :: < Fir > ( ) {
160+ for entry in fir. entries ( ) {
161+ events. push ( RtpSessionReceiveRtcpEvent :: CcmFirReceived ( Ssrc (
162+ entry. ssrc ( ) ,
163+ ) ) ) ;
164+ }
165+ } else {
166+ log:: warn!(
167+ "Received unknown RTCP payload feedback packet header={:02X?} sender_ssrc={} media_ssrc={}" ,
168+ payload_feedback. header_data( ) ,
169+ payload_feedback. sender_ssrc( ) ,
170+ payload_feedback. media_ssrc( ) ,
171+ )
172+ }
173+ }
174+ RtcpPacket :: Xr ( _xr) => {
175+ // ignore
144176 }
145177 RtcpPacket :: Unknown ( ..) => {
146178 // ignore
147179 }
148180 }
149181 }
182+
183+ events
150184 }
151185
152186 /// Returns the duration to wait from the given Instant before polling again
@@ -165,7 +199,7 @@ impl RtpSession {
165199 }
166200
167201 /// Poll the session for any new events
168- pub fn poll ( & mut self , now : Instant , mtu : Mtu ) -> Option < RtpSessionEvent > {
202+ pub fn poll ( & mut self , now : Instant , mtu : Mtu ) -> Option < RtpSessionPollEvent > {
169203 let fallback_sender_ssrc = * self . tx . keys ( ) . next ( ) . unwrap_or ( & self . next_tx_ssrc ) ;
170204
171205 for tx in self . tx . values_mut ( ) {
@@ -177,34 +211,34 @@ impl RtpSession {
177211 }
178212
179213 if let Some ( report) = self . reports . make_report ( fallback_sender_ssrc, mtu) {
180- return Some ( RtpSessionEvent :: SendRtcp ( report) ) ;
214+ return Some ( RtpSessionPollEvent :: SendRtcp ( report) ) ;
181215 }
182216
183217 for tx in self . tx . values_mut ( ) {
184218 if let Some ( rtp_packet) = tx. pop ( now) {
185- return Some ( RtpSessionEvent :: SendRtp ( rtp_packet) ) ;
219+ return Some ( RtpSessionPollEvent :: SendRtp ( rtp_packet) ) ;
186220 }
187221 }
188222
189223 for rx in self . rx . values_mut ( ) {
190224 if let Some ( rtp_packet) = rx. pop ( now) {
191- return Some ( RtpSessionEvent :: ReceiveRtp ( rtp_packet) ) ;
225+ return Some ( RtpSessionPollEvent :: ReceiveRtp ( rtp_packet) ) ;
192226 }
193227 }
194228
195229 None
196230 }
197231}
198232
199- impl Default for RtpSession {
200- fn default ( ) -> Self {
201- Self :: new ( )
202- }
203- }
204-
205233/// Event returned by [`RtpSession::poll`]
206- pub enum RtpSessionEvent {
234+ pub enum RtpSessionPollEvent {
207235 ReceiveRtp ( RtpPacket ) ,
208236 SendRtp ( RtpPacket ) ,
209237 SendRtcp ( Vec < u8 > ) ,
210238}
239+
240+ /// Event returned by [`RtpSession::receive_rtcp`]
241+ pub enum RtpSessionReceiveRtcpEvent {
242+ NackPliReceived ( Ssrc ) ,
243+ CcmFirReceived ( Ssrc ) ,
244+ }
0 commit comments