nihav_register_all_codecs was renamed
[nihav-encoder.git] / src / main.rs
index 9e2bd88efd4830abbe1ca487a6272bc2de2f4605..0d5082d78162452bf0b74b10c1b501eba76dc574 100644 (file)
@@ -13,9 +13,13 @@ use nihav_core::muxers::*;
 use nihav_core::scale::*;
 use nihav_core::soundcvt::*;
 use nihav_registry::detect;
+use nihav_registry::register;
 use nihav_allstuff::*;
 use std::env;
 
+mod null;
+use crate::null::*;
+
 fn print_options(name: &str, options: &[NAOptionDefinition]) {
     if options.is_empty() {
         println!("No custom options.");
@@ -71,6 +75,8 @@ struct Transcoder {
     encoders:       Vec<OutputMode>,
     no_video:       bool,
     no_audio:       bool,
+    start:          NATimePoint,
+    end:            NATimePoint,
 }
 
 macro_rules! parse_and_apply_options {
@@ -554,18 +560,63 @@ fn main() {
     let mut dmx_reg = RegisteredDemuxers::new();
     nihav_register_all_demuxers(&mut dmx_reg);
     let mut dec_reg = RegisteredDecoders::new();
-    nihav_register_all_codecs(&mut dec_reg);
+    nihav_register_all_decoders(&mut dec_reg);
 
     let mut mux_reg = RegisteredMuxers::new();
     nihav_register_all_muxers(&mut mux_reg);
+    mux_reg.add_muxer(NULL_MUXER);
     let mut enc_reg = RegisteredEncoders::new();
     nihav_register_all_encoders(&mut enc_reg);
+    enc_reg.add_encoder(NULL_ENCODER);
 
     let mut transcoder = Transcoder::new();
 
     let mut arg_idx = 1;
+    let mut printed_info = false;
     while arg_idx < args.len() {
         match args[arg_idx].as_str() {
+            "--list-decoders" => {
+                if dec_reg.iter().len() > 0 {
+                    println!("Registered decoders:");
+                    for dec in dec_reg.iter() {
+                        let cdesc = register::get_codec_description(dec.name);
+                        let full_name = if let Some(cd) = cdesc { cd.get_full_name() } else { "???" };
+                        println!(" {} ({})", dec.name, full_name);
+                    }
+                } else {
+                    println!("No registered decoders.");
+                }
+                printed_info = true;
+            },
+            "--list-encoders" => {
+                if enc_reg.iter().len() > 0 {
+                    println!("Registered encoders:");
+                    for enc in enc_reg.iter() {
+                        let cdesc = register::get_codec_description(enc.name);
+                        let full_name = if let Some(cd) = cdesc { cd.get_full_name() } else { "???" };
+                        println!(" {} ({})", enc.name, full_name);
+                    }
+                } else {
+                    println!("No registered encoders.");
+                }
+                printed_info = true;
+            },
+            "--list-demuxers" => {
+                print!("Registered demuxers:");
+                for dmx in dmx_reg.iter() {
+                    print!(" {}", dmx.get_name());
+                }
+                println!();
+                printed_info = true;
+            },
+            "--list-muxers" => {
+                print!("Registered muxers:");
+                for mux in mux_reg.iter() {
+                    print!(" {}", mux.get_name());
+                }
+                println!();
+                printed_info = true;
+            },
             "--query-decoder-options" => {
                 next_arg!(args, arg_idx);
                 let cname = args[arg_idx].as_str();
@@ -576,6 +627,7 @@ fn main() {
                 } else {
                     println!("codec {} is not found", cname);
                 }
+                printed_info = true;
             },
             "--query-demuxer-options" => {
                 next_arg!(args, arg_idx);
@@ -589,6 +641,7 @@ fn main() {
                 } else {
                     println!("demuxer {} is not found", dname);
                 }
+                printed_info = true;
             },
             "--query-encoder-options" => {
                 next_arg!(args, arg_idx);
@@ -600,6 +653,7 @@ fn main() {
                 } else {
                     println!("codec {} is not found", cname);
                 }
+                printed_info = true;
             },
             "--query-muxer-options" => {
                 next_arg!(args, arg_idx);
@@ -614,6 +668,7 @@ fn main() {
                 } else {
                     println!("muxer {} is not found", name);
                 }
+                printed_info = true;
             },
             "--input" => {
                 next_arg!(args, arg_idx);
@@ -644,6 +699,26 @@ fn main() {
             "--no-audio" => {
                 transcoder.no_audio = true;
             },
+            "--start" => {
+                next_arg!(args, arg_idx);
+                let ret = args[arg_idx].parse::<NATimePoint>();
+                if let Ok(val) = ret {
+                    transcoder.start = val;
+                } else {
+                    println!("invalid start time");
+                    return;
+                }
+            },
+            "--end" => {
+                next_arg!(args, arg_idx);
+                let ret = args[arg_idx].parse::<NATimePoint>();
+                if let Ok(val) = ret {
+                    transcoder.end = val;
+                } else {
+                    println!("invalid start time");
+                    return;
+                }
+            },
             "--muxer-options" => {
                 next_arg!(args, arg_idx);
                 if !transcoder.parse_muxer_options(&args[arg_idx], &mux_reg) {
@@ -676,6 +751,10 @@ fn main() {
         arg_idx += 1;
     }
 
+    if printed_info {
+        return;
+    }
+
     if transcoder.input_name.len() == 0 {
         println!("no input name provided");
         return;
@@ -735,6 +814,12 @@ println!("stream {} - {} {}", i, s, info.get_name());
             transcoder.decoders.push(None);
         }
     }
+    if transcoder.start != NATimePoint::None {
+        let ret = dmx.seek(transcoder.start);
+        if ret.is_err() {
+            println!(" failed to seek to {} error {:?}", transcoder.start, ret.err().unwrap());
+        }
+    }
 
     let output_fmt = if let Some(ref str) = transcoder.output_fmt {
             str
@@ -781,7 +866,7 @@ println!("stream {} - {} {}", i, s, info.get_name());
         println!(" #{}: {} {}", ostr.get_num(), ostr, ostr.get_info().get_name());
     }
 
-    loop {
+    'main_loop: loop {
         let pktres = dmx.get_frame();
         if let Err(DemuxerError::EOF) = pktres { break; }
         if pktres.is_err() {
@@ -795,6 +880,7 @@ println!("stream {} - {} {}", i, s, info.get_name());
             OutputMode::Copy(dst_id) => {
                 let dstr = mux.get_stream(dst_id as usize).unwrap();
                 pkt.reassign(dstr, pkt.get_time_information());
+                if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) { break 'main_loop; }
                 if mux.mux_frame(pkt).is_err() {
                     println!("error muxing packet");
                     break;
@@ -842,6 +928,7 @@ println!("stream {} - {} {}", i, s, info.get_name());
                     let cfrm = NAFrame::new(frm.get_time_information(), frm.frame_type, frm.key, frm.get_info(), cbuf);
                     encoder.encode(&cfrm).unwrap();
                     while let Ok(Some(pkt)) = encoder.get_packet() {
+                        if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) { break 'main_loop; }
                         mux.mux_frame(pkt).unwrap();
                     }
                 } else {