rtp_parse/
lib.rs

1use std::{
2    fmt::{Debug, LowerHex},
3    io::Seek,
4    ops::Range,
5};
6
7use bit_cursor::{bit_cursor::BitCursor, bit_read::BitRead, bit_write::BitWrite};
8use bitvec::{order::Msb0, slice::BitSlice, vec::BitVec};
9
10pub mod rtcp;
11pub mod rtp;
12pub mod util;
13
14pub trait PacketBuffer: BitRead + Seek + Debug + LowerHex {
15    /// Return the current cursor position of this buffer
16    fn position(&self) -> u64;
17
18    /// How many bytes remaining in this buffer.
19    fn bytes_remaining(&self) -> usize;
20
21    /// Get a sub buffer of this one, corresponding to the given range.  Note that advances in the
22    /// given sub-buffer's position wll _not_ be reflected in the parent; you'll need to seek
23    /// manually.
24    ///
25    /// # Example:
26    /// TODO
27    ///
28    fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer;
29}
30
31impl PacketBuffer for BitCursor<BitVec<u8, Msb0>> {
32    fn position(&self) -> u64 {
33        BitCursor::position(self)
34    }
35
36    fn bytes_remaining(&self) -> usize {
37        self.remaining_slice().len() / 8
38    }
39
40    fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer {
41        self.sub_cursor(range)
42    }
43}
44
45impl PacketBuffer for BitCursor<&BitSlice<u8, Msb0>> {
46    fn position(&self) -> u64 {
47        BitCursor::position(self)
48    }
49
50    fn bytes_remaining(&self) -> usize {
51        self.remaining_slice().len() / 8
52    }
53
54    fn sub_buffer(&self, range: Range<usize>) -> impl PacketBuffer {
55        self.sub_cursor(range)
56    }
57}
58
59pub trait PacketBufferMut: PacketBuffer + BitWrite {}
60impl<T> PacketBufferMut for T where T: PacketBuffer + BitWrite {}