Add rfc5761 module
							parent
							
								
									0a6553f965
								
							
						
					
					
						commit
						3f755e781d
					
				|  | @ -6,7 +6,9 @@ pub use error::{Error, ErrorKind}; | ||||||
| 
 | 
 | ||||||
| pub mod io; | pub mod io; | ||||||
| pub mod packet; | pub mod packet; | ||||||
|  | pub mod traits; | ||||||
| pub mod rfc3550; | pub mod rfc3550; | ||||||
|  | pub mod rfc5761; | ||||||
| 
 | 
 | ||||||
| mod error; | 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