flv_codec 0.1.0

Decoders and encoders for FLV file format
Documentation
extern crate bytecodec;
extern crate flv_codec;
#[macro_use]
extern crate trackable;

use bytecodec::io::{IoDecodeExt, ReadBuf};
use bytecodec::Decode;
use flv_codec::{FileDecoder, Tag};
use trackable::error::MainError;

fn main() -> Result<(), MainError> {
    let stdin = std::io::stdin();
    let mut input = stdin.lock();
    let mut buf = ReadBuf::new(vec![0; 1024]);
    let mut decoder = FileDecoder::new();
    let mut is_header_shown = false;

    while !buf.stream_state().is_eos() {
        track!(buf.fill(&mut input))?;
        track!(decoder.decode_from_read_buf(&mut buf))?;
        if let Some(h) = decoder.header() {
            if !is_header_shown {
                println!("[header]");
                println!("has_audio = {}", h.has_audio);
                println!("has_video = {}", h.has_video);
                println!("");
                is_header_shown = true;
            }
        }
        if decoder.is_idle() {
            let tag = track!(decoder.finish_decoding())?;
            println!("[[tags]]");
            println!("type = {:?}", tag_type(&tag));
            println!("timestamp = {}", tag.timestamp().value());
            println!("stream_id = {}", tag.stream_id().value());
            println!("");
        }
    }

    Ok(())
}

fn tag_type(tag: &Tag) -> &'static str {
    match tag {
        Tag::Audio(_) => "audio",
        Tag::Video(_) => "video",
        Tag::ScriptData(_) => "script_data",
    }
}