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));
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 {
return false;
}
let mut encoder = (enc_create.unwrap())();
+ let forced_out = oopts.enc_params.format != NACodecTypeInfo::None;
if oopts.enc_params.format == NACodecTypeInfo::None {
oopts.enc_params.format = istr.get_info().get_properties();
}
//todo check for params mismatch
let cvt = match (&oopts.enc_params.format, &ret_eparams.format) {
(NACodecTypeInfo::Video(svinfo), NACodecTypeInfo::Video(dvinfo)) => {
- if svinfo == dvinfo {
+ if svinfo == dvinfo && !forced_out {
OutputConvert::None
} else {
let ofmt = ScaleInfo { fmt: dvinfo.format, width: dvinfo.width, height: dvinfo.height };
}
printed_info = true;
},
- "--input" => {
+ "--input" | "-i" => {
next_arg!(args, arg_idx);
transcoder.input_name = args[arg_idx].clone();
},
next_arg!(args, arg_idx);
transcoder.input_fmt = Some(args[arg_idx].clone());
},
- "--output" => {
+ "--output" | "-o" => {
next_arg!(args, arg_idx);
transcoder.output_name = args[arg_idx].clone();
},
return;
}
},
- "--no-video" => {
+ "--no-video" | "-vn" => {
transcoder.no_video = true;
},
- "--no-audio" => {
+ "--no-audio" | "-an" => {
transcoder.no_audio = true;
},
"--start" => {
if let Ok(val) = ret {
transcoder.end = val;
} else {
- println!("invalid start time");
+ println!("invalid end time");
return;
}
},
break;
}
let mut pkt = pktres.unwrap();
+ if transcoder.start != NATimePoint::None && pkt.ts.less_than(transcoder.start) { continue; }
let src_id = pkt.get_stream().get_num();
match transcoder.encoders[src_id] {
OutputMode::Drop => {},
OutputMode::Encode(dst_id, ref mut encoder, ref mut cvt) => {
if let Some((ref mut dsupp, ref mut decoder)) = transcoder.decoders[src_id] {
let ret = decoder.decode(dsupp, &pkt);
+ if let (true, Err(DecoderError::MissingReference)) = (transcoder.start != NATimePoint::None, &ret) {
+ continue;
+ }
if ret.is_err() {
println!("error decoding stream {}", src_id);
break;