Skip to main content

flowly_flv/
reader.rs

1use std::ops::RangeBounds;
2
3use bytes::{Buf, Bytes};
4
5pub trait FlvReader {
6    fn available(&self) -> usize;
7    fn peek<R: RangeBounds<usize>>(&self, range: R) -> std::io::Result<&[u8]>;
8
9    fn read_u8(&mut self) -> std::io::Result<u8>;
10    fn read_i16(&mut self) -> std::io::Result<i16>;
11    fn read_u16(&mut self) -> std::io::Result<u16>;
12    fn read_u24(&mut self) -> std::io::Result<u32> {
13        let mut buff = [0u8; 4];
14        self.read_to_slice(&mut buff[1..])?;
15
16        Ok(u32::from_be_bytes(buff))
17    }
18    fn read_i24(&mut self) -> std::io::Result<i32> {
19        let mut buff = [0u8; 4];
20        self.read_to_slice(&mut buff[1..])?;
21
22        Ok(i32::from_be_bytes(buff) << 8 >> 8)
23    }
24    fn read_u32(&mut self) -> std::io::Result<u32>;
25    fn read_f64(&mut self) -> std::io::Result<f64>;
26    fn read_to_slice(&mut self, buff: &mut [u8]) -> std::io::Result<()>;
27    fn read_to_bytes(&mut self, count: usize) -> std::io::Result<Bytes>;
28    fn read_to_end(&mut self) -> std::io::Result<Bytes>;
29}
30
31impl<T: Buf> FlvReader for T {
32    #[inline]
33    fn available(&self) -> usize {
34        self.remaining()
35    }
36
37    #[inline]
38    fn peek<R: RangeBounds<usize>>(&self, range: R) -> std::io::Result<&[u8]> {
39        Ok(&self.chunk()[(range.start_bound().cloned(), range.end_bound().cloned())])
40    }
41
42    #[inline]
43    fn read_u8(&mut self) -> std::io::Result<u8> {
44        Ok(self.try_get_u8()?)
45    }
46
47    #[inline]
48    fn read_i16(&mut self) -> std::io::Result<i16> {
49        Ok(self.try_get_i16()?)
50    }
51
52    #[inline]
53    fn read_u16(&mut self) -> std::io::Result<u16> {
54        Ok(self.try_get_u16()?)
55    }
56
57    #[inline]
58    fn read_u32(&mut self) -> std::io::Result<u32> {
59        Ok(self.try_get_u32()?)
60    }
61
62    #[inline]
63    fn read_f64(&mut self) -> std::io::Result<f64> {
64        Ok(self.try_get_f64()?)
65    }
66
67    #[inline]
68    fn read_to_slice(&mut self, buff: &mut [u8]) -> std::io::Result<()> {
69        self.try_copy_to_slice(buff)?;
70        Ok(())
71    }
72
73    #[inline]
74    fn read_to_bytes(&mut self, count: usize) -> std::io::Result<Bytes> {
75        Ok(self.copy_to_bytes(count))
76    }
77
78    #[inline]
79    fn read_to_end(&mut self) -> std::io::Result<Bytes> {
80        Ok(self.copy_to_bytes(self.remaining()))
81    }
82}