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 fn position(&self) -> u64;
17
18 fn bytes_remaining(&self) -> usize;
20
21 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 {}