flv_codec/
lib.rs

1//! Decoders and encoders for [FLV] file format.
2//!
3//! # Examples
4//!
5//! ```
6//! # extern crate bytecodec;
7//! # extern crate flv_codec;
8//! use bytecodec::io::IoDecodeExt;
9//! use flv_codec::{FileDecoder, Header, Tag};
10//!
11//! // Reads FLV file content
12//! let mut flv = &include_bytes!("../black_silent.flv")[..];
13//! let mut decoder = FileDecoder::new();
14//!
15//! // Decodes the first FLV tag
16//! let tag = decoder.decode_exact(&mut flv).unwrap();
17//! let header = decoder.header().cloned().unwrap();
18//! assert_eq!(header, Header { has_audio: true, has_video: true });
19//! assert_eq!(tag.timestamp().value(), 0);
20//! assert_eq!(tag.stream_id().value(), 0);
21//! match tag {
22//!     Tag::Audio(_) => println!("audio tag"),
23//!     Tag::Video(_) => println!("video tag"),
24//!     Tag::ScriptData(_) => println!("script data tag"),
25//! }
26//!
27//! // Decodes the second FLV tag
28//! let tag = decoder.decode_exact(&mut flv).unwrap();
29//! ```
30//!
31//! See [examples/] directory for more examples.
32//!
33//! # Reference
34//!
35//! - [Video File Format Specification][FLV]
36//!
37//! [FLV]: https://wwwimages2.adobe.com/content/dam/acom/en/devnet/flv/video_file_format_spec_v10.pdf
38//! [examples/]: https://github.com/sile/flv_codec/tree/master/examples
39#![warn(missing_docs)]
40
41#[macro_use]
42extern crate bytecodec;
43#[macro_use]
44extern crate trackable;
45
46pub use audio::{AacPacketType, SoundFormat, SoundRate, SoundSize, SoundType};
47pub use file::{FileDecoder, FileEncoder};
48pub use header::Header;
49pub use stream::StreamId;
50pub use tag::{AudioTag, ScriptDataTag, Tag, TagDecoder, TagEncoder, TagKind, VideoTag};
51pub use time::{TimeOffset, Timestamp};
52pub use video::{AvcPacketType, CodecId, FrameType};
53
54mod audio;
55mod file;
56mod header;
57mod stream;
58mod tag;
59mod time;
60mod video;
61
62#[cfg(test)]
63mod test {
64    use bytecodec::io::{IoDecodeExt, IoEncodeExt};
65    use bytecodec::Encode;
66
67    use super::*;
68
69    #[test]
70    fn it_works() {
71        let mut flv = &include_bytes!("../black_silent.flv")[..];
72        let mut decoder = FileDecoder::new();
73
74        let tag = track_try_unwrap!(decoder.decode_exact(&mut flv));
75        assert_eq!(
76            decoder.header().cloned(),
77            Some(Header {
78                has_audio: true,
79                has_video: true
80            })
81        );
82        assert_eq!(tag.timestamp(), Timestamp::new(0));
83        assert_eq!(tag.stream_id(), StreamId::default());
84        if let Tag::ScriptData(_) = tag {
85        } else {
86            panic!();
87        }
88
89        let tag = track_try_unwrap!(decoder.decode_exact(&mut flv));
90        assert_eq!(tag.timestamp(), Timestamp::new(0));
91        assert_eq!(tag.stream_id(), StreamId::default());
92        if let Tag::Audio(_) = tag {
93        } else {
94            panic!();
95        }
96
97        let tag = track_try_unwrap!(decoder.decode_exact(&mut flv));
98        assert_eq!(tag.timestamp(), Timestamp::new(25));
99        assert_eq!(tag.stream_id(), StreamId::default());
100        if let Tag::Video(_) = tag {
101        } else {
102            panic!();
103        }
104    }
105
106    #[test]
107    fn file_encoder_works() {
108        let mut flv = &include_bytes!("../black_silent.flv")[..];
109        let mut buf = Vec::new();
110        let mut decoder = FileDecoder::default();
111        let mut encoder = FileEncoder::default();
112
113        while !flv.is_empty() {
114            let tag = track_try_unwrap!(decoder.decode_exact(&mut flv));
115            track_try_unwrap!(encoder.start_encoding(tag));
116            track_try_unwrap!(encoder.encode_all(&mut buf));
117        }
118        assert_eq!(buf, &include_bytes!("../black_silent.flv")[..]);
119    }
120}