fix submodule use
[nihav-encoder.git] / src / main.rs
index 08aab6b35a3e99898ba8ff0eba9097b3196d50b9..8261d6abca0d08768460fb1b7bd3caf5ef52918d 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.");
@@ -350,7 +354,8 @@ impl Transcoder {
 
         if let Some(str_idx) = self.ostr_opts.iter().position(|str| str.id == out_id) {
             let oopts = &mut self.ostr_opts[str_idx];
-            if cname == "copy" && istr.get_info().get_name() == cname {
+            if oopts.enc_name.as_str() == "copy" && (cname == "any" || istr.get_info().get_name() == cname) {
+                out_sm.add_stream_ref(istr.clone());
                 self.encoders.push(OutputMode::Copy(out_id));
             } else if cname == "any" || oopts.enc_name.as_str() == cname {
                 let enc_create = enc_reg.find_encoder(oopts.enc_name.as_str());
@@ -430,6 +435,7 @@ println!("encoder {} is not supported by output (expected {})", istr.id, istr.ge
             }
         } else {
             if cname == "any" || istr.get_info().get_name() == cname {
+                out_sm.add_stream_ref(istr.clone());
                 self.encoders.push(OutputMode::Copy(out_id));
             } else {
 println!("stream {} ({}) can't be handled", istr.id, istr.get_info().get_name());
@@ -556,14 +562,59 @@ fn main() {
 
     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();
@@ -574,6 +625,7 @@ fn main() {
                 } else {
                     println!("codec {} is not found", cname);
                 }
+                printed_info = true;
             },
             "--query-demuxer-options" => {
                 next_arg!(args, arg_idx);
@@ -587,6 +639,7 @@ fn main() {
                 } else {
                     println!("demuxer {} is not found", dname);
                 }
+                printed_info = true;
             },
             "--query-encoder-options" => {
                 next_arg!(args, arg_idx);
@@ -598,6 +651,7 @@ fn main() {
                 } else {
                     println!("codec {} is not found", cname);
                 }
+                printed_info = true;
             },
             "--query-muxer-options" => {
                 next_arg!(args, arg_idx);
@@ -612,6 +666,7 @@ fn main() {
                 } else {
                     println!("muxer {} is not found", name);
                 }
+                printed_info = true;
             },
             "--input" => {
                 next_arg!(args, arg_idx);
@@ -674,6 +729,10 @@ fn main() {
         arg_idx += 1;
     }
 
+    if printed_info {
+        return;
+    }
+
     if transcoder.input_name.len() == 0 {
         println!("no input name provided");
         return;