xref: /xiu/library/container/flv/src/muxer.rs (revision 13bac29a)
1 use {
2     super::errors::FlvMuxerError, byteorder::BigEndian, bytes::BytesMut,
3     bytesio::bytes_writer::BytesWriter,
4 };
5 
6 const FLV_HEADER: [u8; 9] = [
7     0x46, // 'F'
8     0x4c, //'L'
9     0x56, //'V'
10     0x01, //version
11     0x05, //00000101  audio tag  and video tag
12     0x00, 0x00, 0x00, 0x09, //flv header size
13 ]; // 9
14 pub const HEADER_LENGTH: u32 = 11;
15 pub struct FlvMuxer {
16     pub writer: BytesWriter,
17 }
18 
19 impl Default for FlvMuxer {
default() -> Self20     fn default() -> Self {
21         Self::new()
22     }
23 }
24 
25 impl FlvMuxer {
new() -> Self26     pub fn new() -> Self {
27         Self {
28             writer: BytesWriter::new(),
29         }
30     }
31 
write_flv_header(&mut self) -> Result<(), FlvMuxerError>32     pub fn write_flv_header(&mut self) -> Result<(), FlvMuxerError> {
33         self.writer.write(&FLV_HEADER)?;
34         Ok(())
35     }
36 
write_flv_tag_header( &mut self, tag_type: u8, data_size: u32, timestamp: u32, ) -> Result<(), FlvMuxerError>37     pub fn write_flv_tag_header(
38         &mut self,
39         tag_type: u8,
40         data_size: u32,
41         timestamp: u32,
42     ) -> Result<(), FlvMuxerError> {
43         //tag type
44         self.writer.write_u8(tag_type)?;
45         //data size
46         self.writer.write_u24::<BigEndian>(data_size)?;
47         //timestamp
48         self.writer.write_u24::<BigEndian>(timestamp & 0xffffff)?;
49         //timestamp extended.
50         let timestamp_ext = (timestamp >> 24 & 0xff) as u8;
51         self.writer.write_u8(timestamp_ext)?;
52         //stream id
53         self.writer.write_u24::<BigEndian>(0)?;
54 
55         Ok(())
56     }
57 
write_flv_tag_body(&mut self, body: BytesMut) -> Result<(), FlvMuxerError>58     pub fn write_flv_tag_body(&mut self, body: BytesMut) -> Result<(), FlvMuxerError> {
59         self.writer.write(&body[..])?;
60         Ok(())
61     }
62 
write_previous_tag_size(&mut self, size: u32) -> Result<(), FlvMuxerError>63     pub fn write_previous_tag_size(&mut self, size: u32) -> Result<(), FlvMuxerError> {
64         self.writer.write_u32::<BigEndian>(size)?;
65         Ok(())
66     }
67 }
68