Add rfc5761 module

dtls-srtp
Takeru Ohta 2017-03-26 14:38:08 +09:00
parent 0a6553f965
commit 3f755e781d
3 changed files with 58 additions and 0 deletions

View File

@ -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;

52
src/rfc5761.rs Normal file
View File

@ -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(())
}
}

4
src/traits.rs Normal file
View File

@ -0,0 +1,4 @@
use packet::Packet;
pub trait RtpPacket: Packet {}
pub trait RtcpPacket: Packet {}