use pnet_macros_support::types::*;
use std::num::Wrapping;
#[derive(PartialEq)]
pub struct RtcpPacket<'p> {
packet: ::pnet_macros_support::packet::PacketData<'p>,
}
#[derive(PartialEq)]
pub struct MutableRtcpPacket<'p> {
packet: ::pnet_macros_support::packet::MutPacketData<'p>,
}
impl <'a> RtcpPacket<'a> {
#[inline]
pub fn new<'p>(packet: &'p [u8]) -> Option<RtcpPacket<'p>> {
if packet.len() >= RtcpPacket::minimum_packet_size() {
use ::pnet_macros_support::packet::PacketData;
Some(RtcpPacket{packet: PacketData::Borrowed(packet),})
} else { None }
}
pub fn owned(packet: Vec<u8>) -> Option<RtcpPacket<'static>> {
if packet.len() >= RtcpPacket::minimum_packet_size() {
use ::pnet_macros_support::packet::PacketData;
Some(RtcpPacket{packet: PacketData::Owned(packet),})
} else { None }
}
#[inline]
pub fn to_immutable<'p>(&'p self) -> RtcpPacket<'p> {
use ::pnet_macros_support::packet::PacketData;
RtcpPacket{packet: PacketData::Borrowed(self.packet.as_slice()),}
}
#[inline]
pub fn consume_to_immutable(self) -> RtcpPacket<'a> {
RtcpPacket{packet: self.packet.to_immutable(),}
}
#[inline]
pub const fn minimum_packet_size() -> usize { 8 }
#[inline]
pub fn packet_size(_packet: &Rtcp) -> usize { 8 + _packet.payload.len() }
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_version(&self) -> u2 {
let _self = self;
let co = 0;
((_self.packet[co] as u2) & 192) >> 6
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_padding(&self) -> u1 {
let _self = self;
let co = 0;
((_self.packet[co] as u1) & 32) >> 5
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_rx_report_count(&self) -> u5 {
let _self = self;
let co = 0;
((_self.packet[co] as u5) & 31)
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_packet_type(&self) -> RtcpType {
#[inline(always)]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn get_arg0(_self: &RtcpPacket) -> u8 {
let co = 1;
(_self.packet[co] as u8)
}
RtcpType::new(get_arg0(&self))
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_pkt_length(&self) -> u16be {
let _self = self;
let co = 2;
let b0 = ((_self.packet[co + 0] as u16be) << 8) as u16be;
let b1 = ((_self.packet[co + 1] as u16be)) as u16be;
b0 | b1
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_ssrc(&self) -> u32be {
let _self = self;
let co = 4;
let b0 = ((_self.packet[co + 0] as u32be) << 24) as u32be;
let b1 = ((_self.packet[co + 1] as u32be) << 16) as u32be;
let b2 = ((_self.packet[co + 2] as u32be) << 8) as u32be;
let b3 = ((_self.packet[co + 3] as u32be)) as u32be;
b0 | b1 | b2 | b3
}
}
impl <'a> MutableRtcpPacket<'a> {
#[inline]
pub fn new<'p>(packet: &'p mut [u8]) -> Option<MutableRtcpPacket<'p>> {
if packet.len() >= MutableRtcpPacket::minimum_packet_size() {
use ::pnet_macros_support::packet::MutPacketData;
Some(MutableRtcpPacket{packet: MutPacketData::Borrowed(packet),})
} else { None }
}
pub fn owned(packet: Vec<u8>) -> Option<MutableRtcpPacket<'static>> {
if packet.len() >= MutableRtcpPacket::minimum_packet_size() {
use ::pnet_macros_support::packet::MutPacketData;
Some(MutableRtcpPacket{packet: MutPacketData::Owned(packet),})
} else { None }
}
#[inline]
pub fn to_immutable<'p>(&'p self) -> RtcpPacket<'p> {
use ::pnet_macros_support::packet::PacketData;
RtcpPacket{packet: PacketData::Borrowed(self.packet.as_slice()),}
}
#[inline]
pub fn consume_to_immutable(self) -> RtcpPacket<'a> {
RtcpPacket{packet: self.packet.to_immutable(),}
}
#[inline]
pub const fn minimum_packet_size() -> usize { 8 }
#[inline]
pub fn packet_size(_packet: &Rtcp) -> usize { 8 + _packet.payload.len() }
#[inline]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn populate(&mut self, packet: &Rtcp) {
let _self = self;
_self.set_version(packet.version);
_self.set_padding(packet.padding);
_self.set_rx_report_count(packet.rx_report_count);
_self.set_packet_type(packet.packet_type);
_self.set_pkt_length(packet.pkt_length);
_self.set_ssrc(packet.ssrc);
_self.set_payload(&packet.payload);
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_version(&self) -> u2 {
let _self = self;
let co = 0;
((_self.packet[co] as u2) & 192) >> 6
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_padding(&self) -> u1 {
let _self = self;
let co = 0;
((_self.packet[co] as u1) & 32) >> 5
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_rx_report_count(&self) -> u5 {
let _self = self;
let co = 0;
((_self.packet[co] as u5) & 31)
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_packet_type(&self) -> RtcpType {
#[inline(always)]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn get_arg0(_self: &MutableRtcpPacket) -> u8 {
let co = 1;
(_self.packet[co] as u8)
}
RtcpType::new(get_arg0(&self))
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_pkt_length(&self) -> u16be {
let _self = self;
let co = 2;
let b0 = ((_self.packet[co + 0] as u16be) << 8) as u16be;
let b1 = ((_self.packet[co + 1] as u16be)) as u16be;
b0 | b1
}
#[inline]
#[allow(trivial_numeric_casts, unused_parens)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn get_ssrc(&self) -> u32be {
let _self = self;
let co = 4;
let b0 = ((_self.packet[co + 0] as u32be) << 24) as u32be;
let b1 = ((_self.packet[co + 1] as u32be) << 16) as u32be;
let b2 = ((_self.packet[co + 2] as u32be) << 8) as u32be;
let b3 = ((_self.packet[co + 3] as u32be)) as u32be;
b0 | b1 | b2 | b3
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_version(&mut self, val: u2) {
let _self = self;
let co = 0;
_self.packet[co + 0] =
((_self.packet[co + 0] & 63) | (((val & 3) << 6) as u8)) as u8;
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_padding(&mut self, val: u1) {
let _self = self;
let co = 0;
_self.packet[co + 0] =
((_self.packet[co + 0] & 223) | (((val & 1) << 5) as u8)) as u8;
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_rx_report_count(&mut self, val: u5) {
let _self = self;
let co = 0;
_self.packet[co + 0] =
((_self.packet[co + 0] & 224) | (((val & 31)) as u8)) as u8;
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_packet_type(&mut self, val: RtcpType) {
use pnet_macros_support::packet::PrimitiveValues;
let _self = self;
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn set_arg0(_self: &mut MutableRtcpPacket, val: u8) {
let co = 1;
_self.packet[co + 0] = (val) as u8;
}
let vals = val.to_primitive_values();
set_arg0(_self, vals.0);
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_pkt_length(&mut self, val: u16be) {
let _self = self;
let co = 2;
_self.packet[co + 0] = ((val & 65280) >> 8) as u8;
_self.packet[co + 1] = (val) as u8;
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_ssrc(&mut self, val: u32be) {
let _self = self;
let co = 4;
_self.packet[co + 0] = ((val & 4278190080) >> 24) as u8;
_self.packet[co + 1] = ((val & 16711680) >> 16) as u8;
_self.packet[co + 2] = ((val & 65280) >> 8) as u8;
_self.packet[co + 3] = (val) as u8;
}
#[inline]
#[allow(trivial_numeric_casts)]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
pub fn set_payload(&mut self, vals: &[u8]) {
use std::ptr::copy_nonoverlapping;
let mut _self = self;
let current_offset = 8;
unsafe {
copy_nonoverlapping(vals[..].as_ptr(),
_self.packet[current_offset..].as_mut_ptr(),
vals.len())
}
}
}
impl <'a> ::pnet_macros_support::packet::PacketSize for RtcpPacket<'a> {
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn packet_size(&self) -> usize { let _self = self; 8 }
}
impl <'a> ::pnet_macros_support::packet::PacketSize for MutableRtcpPacket<'a>
{
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn packet_size(&self) -> usize { let _self = self; 8 }
}
impl <'a> ::pnet_macros_support::packet::MutablePacket for
MutableRtcpPacket<'a> {
#[inline]
fn packet_mut<'p>(&'p mut self) -> &'p mut [u8] { &mut self.packet[..] }
#[inline]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn payload_mut<'p>(&'p mut self) -> &'p mut [u8] {
let _self = self;
let start = 8;
if _self.packet.len() <= start { return &mut []; }
&mut _self.packet[start..]
}
}
impl <'a> ::pnet_macros_support::packet::Packet for MutableRtcpPacket<'a> {
#[inline]
fn packet<'p>(&'p self) -> &'p [u8] { &self.packet[..] }
#[inline]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn payload<'p>(&'p self) -> &'p [u8] {
let _self = self;
let start = 8;
if _self.packet.len() <= start { return &[]; }
&_self.packet[start..]
}
}
impl <'a> ::pnet_macros_support::packet::Packet for RtcpPacket<'a> {
#[inline]
fn packet<'p>(&'p self) -> &'p [u8] { &self.packet[..] }
#[inline]
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn payload<'p>(&'p self) -> &'p [u8] {
let _self = self;
let start = 8;
if _self.packet.len() <= start { return &[]; }
&_self.packet[start..]
}
}
pub struct RtcpIterable<'a> {
buf: &'a [u8],
}
impl <'a> Iterator for RtcpIterable<'a> {
type
Item
=
RtcpPacket<'a>;
fn next(&mut self) -> Option<RtcpPacket<'a>> {
use pnet_macros_support::packet::PacketSize;
use std::cmp::min;
if self.buf.len() > 0 {
if let Some(ret) = RtcpPacket::new(self.buf) {
let start = min(ret.packet_size(), self.buf.len());
self.buf = &self.buf[start..];
return Some(ret);
}
}
None
}
fn size_hint(&self) -> (usize, Option<usize>) { (0, None) }
}
impl <'p> ::pnet_macros_support::packet::FromPacket for RtcpPacket<'p> {
type
T
=
Rtcp;
#[inline]
fn from_packet(&self) -> Rtcp {
use pnet_macros_support::packet::Packet;
let _self = self;
Rtcp{version: _self.get_version(),
padding: _self.get_padding(),
rx_report_count: _self.get_rx_report_count(),
packet_type: _self.get_packet_type(),
pkt_length: _self.get_pkt_length(),
ssrc: _self.get_ssrc(),
payload:
{
let payload = self.payload();
let mut vec = Vec::with_capacity(payload.len());
vec.extend_from_slice(payload);
vec
},}
}
}
impl <'p> ::pnet_macros_support::packet::FromPacket for MutableRtcpPacket<'p>
{
type
T
=
Rtcp;
#[inline]
fn from_packet(&self) -> Rtcp {
use pnet_macros_support::packet::Packet;
let _self = self;
Rtcp{version: _self.get_version(),
padding: _self.get_padding(),
rx_report_count: _self.get_rx_report_count(),
packet_type: _self.get_packet_type(),
pkt_length: _self.get_pkt_length(),
ssrc: _self.get_ssrc(),
payload:
{
let payload = self.payload();
let mut vec = Vec::with_capacity(payload.len());
vec.extend_from_slice(payload);
vec
},}
}
}
impl <'p> ::std::fmt::Debug for RtcpPacket<'p> {
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
let _self = self;
write!(fmt ,
"RtcpPacket {{ version : {:?}, padding : {:?}, rx_report_count : {:?}, packet_type : {:?}, pkt_length : {:?}, ssrc : {:?}, }}"
, _self . get_version ( ) , _self . get_padding ( ) , _self .
get_rx_report_count ( ) , _self . get_packet_type ( ) , _self
. get_pkt_length ( ) , _self . get_ssrc ( ))
}
}
impl <'p> ::std::fmt::Debug for MutableRtcpPacket<'p> {
#[cfg_attr(feature = "clippy", allow(used_underscore_binding))]
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
let _self = self;
write!(fmt ,
"MutableRtcpPacket {{ version : {:?}, padding : {:?}, rx_report_count : {:?}, packet_type : {:?}, pkt_length : {:?}, ssrc : {:?}, }}"
, _self . get_version ( ) , _self . get_padding ( ) , _self .
get_rx_report_count ( ) , _self . get_packet_type ( ) , _self
. get_pkt_length ( ) , _self . get_ssrc ( ))
}
}
#[derive(Clone, Debug)]
#[allow(unused_attributes)]
pub struct Rtcp {
pub version: u2,
pub padding: u1,
pub rx_report_count: u5,
pub packet_type: RtcpType,
pub pkt_length: u16be,
pub ssrc: u32be,
pub payload: Vec<u8>,
}