From 3f755e781d7310c32aebae3a9203c5931c25dd82 Mon Sep 17 00:00:00 2001 From: Takeru Ohta Date: Sun, 26 Mar 2017 14:38:08 +0900 Subject: [PATCH] Add rfc5761 module --- src/lib.rs | 2 ++ src/rfc5761.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/traits.rs | 4 ++++ 3 files changed, 58 insertions(+) create mode 100644 src/rfc5761.rs create mode 100644 src/traits.rs diff --git a/src/lib.rs b/src/lib.rs index 13817c4..66d2f8a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,9 @@ pub use error::{Error, ErrorKind}; pub mod io; pub mod packet; +pub mod traits; pub mod rfc3550; +pub mod rfc5761; mod error; diff --git a/src/rfc5761.rs b/src/rfc5761.rs new file mode 100644 index 0000000..71ffe01 --- /dev/null +++ b/src/rfc5761.rs @@ -0,0 +1,52 @@ +use std::io::{Read, Write}; + +use {Result, ErrorKind}; +use io::{ReadFrom, WriteTo}; +use traits::{RtpPacket, RtcpPacket}; +use packet::Packet; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MuxedPacket { + Rtp(T), + Rtcp(U), +} +impl Packet for MuxedPacket + where T: RtpPacket, + U: RtcpPacket +{ +} +impl ReadFrom for MuxedPacket + where T: RtpPacket, + U: RtcpPacket +{ + fn read_from(reader: &mut R) -> Result { + let mut buf = [0; 2]; + track_try!(reader.read_exact(&mut buf)); + let marker = (buf[1] & 0b1000_0000) != 0; + if !marker { + let reader = &mut (&buf[..]).chain(reader); + track_err!(T::read_from(reader).map(MuxedPacket::Rtp)) + } else { + let reader = &mut (&buf[..]).chain(reader); + track_err!(U::read_from(reader).map(MuxedPacket::Rtcp)) + } + } +} +impl WriteTo for MuxedPacket + where T: RtpPacket, + U: RtcpPacket +{ + fn write_to(&self, writer: &mut W) -> Result<()> { + match *self { + MuxedPacket::Rtp(ref p) => { + let mut buf = Vec::new(); + track_try!(p.write_to(&mut buf)); + track_assert!(buf.len() >= 2, ErrorKind::Other); + buf[1] &= 0b0111_1111; + track_try!(writer.write_all(&buf)); + } + MuxedPacket::Rtcp(ref p) => track_try!(p.write_to(writer)), + } + Ok(()) + } +} diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..270d366 --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,4 @@ +use packet::Packet; + +pub trait RtpPacket: Packet {} +pub trait RtcpPacket: Packet {}