Skip to content
File

Blob: firmware/vendor/str0m/src/rtp/rtcp/pli.rs

rust53 lines
1use super::{FeedbackMessageType, PayloadType, RtcpHeader, RtcpPacket};
2use super::{RtcpType, Ssrc};
3 
4/// Picture loss indicator.
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct Pli {
7 /// Sender of this feedback. Mostly irrelevant, but part of RTCP packets.
8 pub sender_ssrc: Ssrc,
9 /// The SSRC this picture loss indication is for.
10 pub ssrc: Ssrc,
11}
12 
13impl RtcpPacket for Pli {
14 fn header(&self) -> RtcpHeader {
15 RtcpHeader {
16 rtcp_type: RtcpType::PayloadSpecificFeedback,
17 feedback_message_type: FeedbackMessageType::PayloadFeedback(
18 PayloadType::PictureLossIndication,
19 ),
20 words_less_one: (self.length_words() - 1) as u16,
21 }
22 }
23 
24 fn length_words(&self) -> usize {
25 // header
26 // sender SSRC
27 // media SSRC
28 3
29 }
30 
31 fn write_to(&self, buf: &mut [u8]) -> usize {
32 self.header().write_to(&mut buf[..4]);
33 buf[4..8].copy_from_slice(&self.sender_ssrc.to_be_bytes());
34 buf[8..12].copy_from_slice(&self.ssrc.to_be_bytes());
35 12
36 }
37}
38 
39impl<'a> TryFrom<&'a [u8]> for Pli {
40 type Error = &'static str;
41 
42 fn try_from(buf: &'a [u8]) -> Result<Self, Self::Error> {
43 if buf.len() < 8 {
44 return Err("Pli less than 8 bytes");
45 }
46 
47 let sender_ssrc = u32::from_be_bytes([buf[0], buf[1], buf[2], buf[3]]).into();
48 let ssrc = u32::from_be_bytes([buf[4], buf[5], buf[6], buf[7]]).into();
49 
50 Ok(Pli { sender_ssrc, ssrc })
51 }
52}