1extern crate bytecodec;
2extern crate flv_codec;
3#[macro_use]
4extern crate trackable;
5
6use bytecodec::io::{IoDecodeExt, ReadBuf};
7use bytecodec::Decode;
8use flv_codec::{FileDecoder, Tag};
9use trackable::error::MainError;
10
11fn main() -> Result<(), MainError> {
12 let stdin = std::io::stdin();
13 let mut input = stdin.lock();
14 let mut buf = ReadBuf::new(vec![0; 1024]);
15 let mut decoder = FileDecoder::new();
16 let mut is_header_shown = false;
17
18 while !buf.stream_state().is_eos() {
19 track!(buf.fill(&mut input))?;
20 track!(decoder.decode_from_read_buf(&mut buf))?;
21 if let Some(h) = decoder.header() {
22 if !is_header_shown {
23 println!("[header]");
24 println!("has_audio = {}", h.has_audio);
25 println!("has_video = {}", h.has_video);
26 println!("");
27 is_header_shown = true;
28 }
29 }
30 if decoder.is_idle() {
31 let tag = track!(decoder.finish_decoding())?;
32 println!("[[tags]]");
33 println!("type = {:?}", tag_type(&tag));
34 println!("timestamp = {}", tag.timestamp().value());
35 println!("stream_id = {}", tag.stream_id().value());
36 println!("");
37 }
38 }
39
40 Ok(())
41}
42
43fn tag_type(tag: &Tag) -> &'static str {
44 match tag {
45 Tag::Audio(_) => "audio",
46 Tag::Video(_) => "video",
47 Tag::ScriptData(_) => "script_data",
48 }
49}