mod null;
mod acvt;
use crate::acvt::*;
+mod imgseq;
+use crate::imgseq::*;
+
+const SND_NO_FORMAT: NASoniton = NASoniton { bits: 0, be: false, packed: false, planar: false, float: false, signed: false };
fn format_time(ms: u64) -> String {
let s = ms / 1000;
},
"srate" => {
if ostr.enc_params.format == NACodecTypeInfo::None {
- ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+ ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_NO_FORMAT, 0));
}
if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
let ret = oval[1].parse::<u32>();
},
"channels" => {
if ostr.enc_params.format == NACodecTypeInfo::None {
- ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+ ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_NO_FORMAT, 0));
}
if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
let ret = oval[1].parse::<u8>();
},
"block_len" => {
if ostr.enc_params.format == NACodecTypeInfo::None {
- ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+ ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_NO_FORMAT, 0));
}
if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
let ret = oval[1].parse::<usize>();
},
"sfmt" => {
if ostr.enc_params.format == NACodecTypeInfo::None {
- ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_S16_FORMAT, 0));
+ ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_NO_FORMAT, 0));
}
if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
let ret = oval[1].parse::<NASoniton>();
// 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));
+ ostr.enc_params.format = NACodecTypeInfo::Audio(NAAudioInfo::new(0, 0, SND_NO_FORMAT, 0));
}
if let NACodecTypeInfo::Audio(ref mut ainfo) = ostr.enc_params.format {
let ret = oval[1].parse::<NAChannelMap>();
}
let mut encoder = (enc_create.unwrap())();
let forced_out = oopts.enc_params.format != NACodecTypeInfo::None;
+ let iformat = istr.get_info().get_properties();
if oopts.enc_params.format == NACodecTypeInfo::None {
oopts.enc_params.format = istr.get_info().get_properties();
+ } else {
+ match (&iformat, &mut oopts.enc_params.format) {
+ (NACodecTypeInfo::Video(svinfo), NACodecTypeInfo::Video(ref mut dvinfo)) => {
+ if dvinfo.width == 0 {
+ dvinfo.width = svinfo.width;
+ }
+ if dvinfo.height == 0 {
+ dvinfo.height = svinfo.height;
+ }
+ },
+ (NACodecTypeInfo::Audio(sainfo), NACodecTypeInfo::Audio(ref mut dainfo)) => {
+ if dainfo.sample_rate == 0 {
+ dainfo.sample_rate = sainfo.sample_rate;
+ }
+ if dainfo.format == SND_NO_FORMAT {
+ dainfo.format = sainfo.format;
+ }
+ if dainfo.channels == 0 {
+ dainfo.channels = sainfo.channels;
+ }
+ if dainfo.block_len == 0 {
+ dainfo.block_len = sainfo.block_len;
+ }
+ },
+ _ => {},
+ };
}
if oopts.enc_params.tb_num == 0 {
oopts.enc_params.tb_num = istr.tb_num;
let ret_eparams = ret_eparams.unwrap();
//todo check for params mismatch
- let cvt = match (&oopts.enc_params.format, &ret_eparams.format) {
+ let cvt = match (&iformat, &ret_eparams.format) {
(NACodecTypeInfo::Video(svinfo), NACodecTypeInfo::Video(dvinfo)) => {
if svinfo == dvinfo && !forced_out {
OutputConvert::None
return;
}
+ if let Some("imgseq") = transcoder.input_fmt.as_deref() {
+ let mut isdc = ImgSeqDemuxerCreator::new(transcoder.input_name.as_str());
+ parse_and_apply_options!(isdc, &transcoder.demux_opts, "input");
+ let isd = if let Ok(ctx) = isdc.open() {
+ ctx
+ } else {
+ println!("failed to create image sequence demuxer!");
+ return;
+ };
+ let mut dmx = DemuxerObject::create_imgseq(isd);
+ transcode(transcoder, full_reg, &mut dmx);
+ return;
+ }
+
let res = File::open(transcoder.input_name.as_str());
if res.is_err() {
println!("error opening input");
println!("cannot find demuxer for '{}'", transcoder.input_name.as_str());
return;
}
+ parse_and_apply_options!(dmx, &transcoder.demux_opts, "input");
+ transcode(transcoder, full_reg, &mut dmx);
+}
+
+fn transcode(mut transcoder: Transcoder, full_reg: FullRegister, dmx: &mut DemuxerObject) {
let duration = dmx.get_duration();
let duration_string = if duration != 0 { format_time(duration) } else { String::new() };
- parse_and_apply_options!(dmx, &transcoder.demux_opts, "input");
for i in 0..dmx.get_num_streams() {
let s = dmx.get_stream(i).unwrap();
let info = s.get_info();