File
Blob: firmware/vendor/str0m/src/rtp/rtcp/pli.rs
| 1 | use super::{FeedbackMessageType, PayloadType, RtcpHeader, RtcpPacket}; |
| 2 | use super::{RtcpType, Ssrc}; |
| 3 | |
| 4 | /// Picture loss indicator. |
| 5 | #[derive(Debug, Clone, PartialEq, Eq)] |
| 6 | pub 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 | |
| 13 | impl 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 | |
| 39 | impl<'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 | } |