aboutsummaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-07-09 11:05:48 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-07-09 11:05:48 +0200
commit951916e82104ed20d3fab23df23ceef29b8d0d58 (patch)
tree1840bd8397aa798b112e012512928997ab4f64bb /src/main.rs
parentb267d37e527242aa3507dea50c4065944312db09 (diff)
downloadnihav-encoder-951916e82104ed20d3fab23df23ceef29b8d0d58.tar.gz
add commands for setting start and end time of input to process
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 8261d6a..787a6b2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -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 {
@@ -697,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) {
@@ -792,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
@@ -838,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() {
@@ -852,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;
@@ -899,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 {