1*ffe74184SMartin Algesten #![warn(rust_2018_idioms)] 2*ffe74184SMartin Algesten #![allow(dead_code)] 3*ffe74184SMartin Algesten 4*ffe74184SMartin Algesten //! Package rtcp implements encoding and decoding of RTCP packets according to RFCs 3550 and 5506. 5*ffe74184SMartin Algesten //! 6*ffe74184SMartin Algesten //! RTCP is a sister protocol of the Real-time Transport Protocol (RTP). Its basic functionality 7*ffe74184SMartin Algesten //! and packet structure is defined in RFC 3550. RTCP provides out-of-band statistics and control 8*ffe74184SMartin Algesten //! information for an RTP session. It partners with RTP in the delivery and packaging of multimedia data, 9*ffe74184SMartin Algesten //! but does not transport any media data itself. 10*ffe74184SMartin Algesten //! 11*ffe74184SMartin Algesten //! The primary function of RTCP is to provide feedback on the quality of service (QoS) 12*ffe74184SMartin Algesten //! in media distribution by periodically sending statistics information such as transmitted octet 13*ffe74184SMartin Algesten //! and packet counts, packet loss, packet delay variation, and round-trip delay time to participants 14*ffe74184SMartin Algesten //! in a streaming multimedia session. An application may use this information to control quality of 15*ffe74184SMartin Algesten //! service parameters, perhaps by limiting flow, or using a different codec. 16*ffe74184SMartin Algesten //! 17*ffe74184SMartin Algesten //! Decoding RTCP packets: 18*ffe74184SMartin Algesten //!```nobuild 19*ffe74184SMartin Algesten //! let pkt = rtcp::unmarshal(&rtcp_data).unwrap(); 20*ffe74184SMartin Algesten //! 21*ffe74184SMartin Algesten //! if let Some(e) = pkt 22*ffe74184SMartin Algesten //! .as_any() 23*ffe74184SMartin Algesten //! .downcast_ref::<PictureLossIndication>() 24*ffe74184SMartin Algesten //! { 25*ffe74184SMartin Algesten //! 26*ffe74184SMartin Algesten //! } 27*ffe74184SMartin Algesten //! else if let Some(e) = packet 28*ffe74184SMartin Algesten //! .as_any() 29*ffe74184SMartin Algesten //! .downcast_ref::<Goodbye>(){} 30*ffe74184SMartin Algesten //! .... 31*ffe74184SMartin Algesten //!``` 32*ffe74184SMartin Algesten //! 33*ffe74184SMartin Algesten //! Encoding RTCP packets: 34*ffe74184SMartin Algesten //!```nobuild 35*ffe74184SMartin Algesten //! let pkt = PictureLossIndication{ 36*ffe74184SMartin Algesten //! sender_ssrc: sender_ssrc, 37*ffe74184SMartin Algesten //! media_ssrc: media_ssrc 38*ffe74184SMartin Algesten //! }; 39*ffe74184SMartin Algesten //! 40*ffe74184SMartin Algesten //! let pli_data = pkt.marshal().unwrap(); 41*ffe74184SMartin Algesten //! // ... 42*ffe74184SMartin Algesten //!``` 43*ffe74184SMartin Algesten 44*ffe74184SMartin Algesten pub mod compound_packet; 45*ffe74184SMartin Algesten mod error; 46*ffe74184SMartin Algesten pub mod extended_report; 47*ffe74184SMartin Algesten pub mod goodbye; 48*ffe74184SMartin Algesten pub mod header; 49*ffe74184SMartin Algesten pub mod packet; 50*ffe74184SMartin Algesten pub mod payload_feedbacks; 51*ffe74184SMartin Algesten pub mod raw_packet; 52*ffe74184SMartin Algesten pub mod receiver_report; 53*ffe74184SMartin Algesten pub mod reception_report; 54*ffe74184SMartin Algesten pub mod sender_report; 55*ffe74184SMartin Algesten pub mod source_description; 56*ffe74184SMartin Algesten pub mod transport_feedbacks; 57*ffe74184SMartin Algesten mod util; 58*ffe74184SMartin Algesten 59*ffe74184SMartin Algesten pub use error::Error; 60