X-Git-Url: https://git.nihav.org/?p=nihav-encoder.git;a=blobdiff_plain;f=src%2Fmain.rs;fp=src%2Fmain.rs;h=e033dfd1040cd3d7b5eb965b351e1c8d926ce309;hp=1958bedc7ac40d31be12bf095721d11461958be0;hb=6f6ba7bfe78bfbd3eff7145bf98839b21213df04;hpb=fd03a232220da2f5eca07bcc3e0229089cca1e3e diff --git a/src/main.rs b/src/main.rs index 1958bed..e033dfd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,8 @@ mod null; mod acvt; use crate::acvt::*; +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; let ds = (ms % 1000) / 100; @@ -316,7 +318,7 @@ impl Transcoder { }, "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::(); @@ -331,7 +333,7 @@ impl Transcoder { }, "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::(); @@ -346,7 +348,7 @@ impl Transcoder { }, "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::(); @@ -361,7 +363,7 @@ impl Transcoder { }, "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::(); @@ -377,7 +379,7 @@ impl Transcoder { // 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::(); @@ -502,8 +504,35 @@ impl Transcoder { } 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; @@ -517,7 +546,7 @@ impl Transcoder { 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