1#![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}