Add rfc5761 module
parent
0a6553f965
commit
3f755e781d
|
@ -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;
|
||||
|
||||
|
|
|
@ -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<T, U> {
|
||||
Rtp(T),
|
||||
Rtcp(U),
|
||||
}
|
||||
impl<T, U> Packet for MuxedPacket<T, U>
|
||||
where T: RtpPacket,
|
||||
U: RtcpPacket
|
||||
{
|
||||
}
|
||||
impl<T, U> ReadFrom for MuxedPacket<T, U>
|
||||
where T: RtpPacket,
|
||||
U: RtcpPacket
|
||||
{
|
||||
fn read_from<R: Read>(reader: &mut R) -> Result<Self> {
|
||||
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<T, U> WriteTo for MuxedPacket<T, U>
|
||||
where T: RtpPacket,
|
||||
U: RtcpPacket
|
||||
{
|
||||
fn write_to<W: Write>(&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(())
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
use packet::Packet;
|
||||
|
||||
pub trait RtpPacket: Packet {}
|
||||
pub trait RtcpPacket: Packet {}
|
Loading…
Reference in New Issue