]> git.nihav.org Git - nihav-encoder.git/blobdiff - src/main.rs
parse requested formaton and soniton
[nihav-encoder.git] / src / main.rs
index 8261d6abca0d08768460fb1b7bd3caf5ef52918d..8d5efd377fd67aa680101adeacd4e6ea267caafe 100644 (file)
@@ -75,6 +75,8 @@ struct Transcoder {
     encoders:       Vec<OutputMode>,
     no_video:       bool,
     no_audio:       bool,
+    start:          NATimePoint,
+    end:            NATimePoint,
 }
 
 macro_rules! parse_and_apply_options {
@@ -119,7 +121,7 @@ impl Transcoder {
                 self.istr_opts.len() - 1
             };
         let istr = &mut self.istr_opts[sidx];
-        
+
         for opt in opt1.split(',') {
             let oval: Vec<_> = opt.split('=').collect();
             if oval.len() == 1 {
@@ -150,7 +152,7 @@ impl Transcoder {
                 self.ostr_opts.len() - 1
             };
         let ostr = &mut self.ostr_opts[sidx];
-        
+
         for opt in opt1.split(',') {
             let oval: Vec<_> = opt.split('=').collect();
             if oval.len() == 1 {
@@ -220,7 +222,21 @@ impl Transcoder {
                             println!("video option for audio stream");
                         }
                     },
-//todo formaton
+                    "pixfmt" => {
+                        if ostr.enc_params.format == NACodecTypeInfo::None {
+                            ostr.enc_params.format = NACodecTypeInfo::Video(NAVideoInfo::new(0, 0, false, YUV420_FORMAT));
+                        }
+                        if let NACodecTypeInfo::Video(ref mut vinfo) = ostr.enc_params.format {
+                            let ret = oval[1].parse::<NAPixelFormaton>();
+                            if let Ok(val) = ret {
+                                vinfo.format = val;
+                            } else {
+                                println!("invalid pixel format");
+                            }
+                        } else {
+                            println!("video option for audio stream");
+                        }
+                    },
                     "srate" => {
                         if ostr.enc_params.format == NACodecTypeInfo::None {
                             ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
@@ -266,7 +282,37 @@ impl Transcoder {
                             println!("audio option for video stream");
                         }
                     },
-//todo soniton, channel map
+                    "sfmt" => {
+                        if ostr.enc_params.format == NACodecTypeInfo::None {
+                            ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+                        }
+                        if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
+                            let ret = oval[1].parse::<NASoniton>();
+                            if let Ok(val) = ret {
+                                ainfo.format = val;
+                            } else {
+                                println!("invalid audio format");
+                            }
+                        } else {
+                            println!("audio option for video stream");
+                        }
+                    },
+// todo channel map negotiation
+                    /*"chmap" => {
+                        if ostr.enc_params.format == NACodecTypeInfo::None {
+                            ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+                        }
+                        if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
+                            let ret = oval[1].parse::<NAChannelMap>();
+                            if let Ok(val) = ret {
+                                ainfo.chmap = val;
+                            } else {
+                                println!("invalid channel map");
+                            }
+                        } else {
+                            println!("audio option for video stream");
+                        }
+                    },*/
                     "bitrate" => {
                         let ret = oval[1].parse::<u32>();
                         if let Ok(val) = ret {
@@ -558,7 +604,7 @@ 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);
@@ -697,6 +743,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) {
@@ -792,6 +858,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
@@ -838,7 +910,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() {
@@ -852,6 +924,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;
@@ -899,6 +972,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 {