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}