X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=src%2Fmain.rs;h=0a36cc88da1c09579c9ec8da73ee75e675ce04c0;hb=HEAD;hp=81993116df0b57c915dd5629443e7c2e98ad24be;hpb=79eb70eb2b30e67eeb7db8becd6f837320ea498f;p=nihav-encoder.git diff --git a/src/main.rs b/src/main.rs index 8199311..ee6ba25 100644 --- a/src/main.rs +++ b/src/main.rs @@ -189,6 +189,7 @@ struct Transcoder { calc_len: bool, nframes: Vec, + global_tb: (u32, u32), } macro_rules! parse_and_apply_options { @@ -588,6 +589,10 @@ impl Transcoder { _ => {}, }; } + if self.global_tb != (0, 0) { + oopts.enc_params.tb_num = self.global_tb.0; + oopts.enc_params.tb_den = self.global_tb.1; + } if oopts.enc_params.tb_num == 0 { oopts.enc_params.tb_num = istr.tb_num; oopts.enc_params.tb_den = istr.tb_den; @@ -622,7 +627,8 @@ impl Transcoder { } }, (NACodecTypeInfo::Audio(sainfo), NACodecTypeInfo::Audio(dainfo)) => { - if sainfo == dainfo { + let icodec = istr.get_info().get_name(); + if (sainfo == dainfo) && (icodec != "pcm" || oopts.enc_name.as_str() == "pcm") { OutputConvert::None } else { let dchmap = match dainfo.channels { @@ -674,8 +680,13 @@ println!("encoder {} is not supported by output (expected {})", istr.id, istr.ge } let mut encoder = (enc_create.unwrap())(); oopts.enc_params.format = istr.get_info().get_properties(); - oopts.enc_params.tb_num = istr.tb_num; - oopts.enc_params.tb_den = istr.tb_den; + if self.global_tb != (0, 0) { + oopts.enc_params.tb_num = self.global_tb.0; + oopts.enc_params.tb_den = self.global_tb.1; + } else { + oopts.enc_params.tb_num = istr.tb_num; + oopts.enc_params.tb_den = istr.tb_den; + } let ret_eparams = encoder.negotiate_format(&oopts.enc_params); if ret_eparams.is_err() { println!("cannot negotiate encoding parameters"); @@ -787,7 +798,7 @@ println!("can't generate default channel map for {} channels", dainfo.channels); let mut found_vid = false; for (iidx, istr) in src_sm.iter().enumerate() { - if istr.get_media_type() == StreamType::Video && !found_vid { + if istr.get_media_type() == StreamType::Video { match self.register_output_stream("any", istr, iidx, out_sm, enc_reg) { RegisterResult::Ok => found_vid = true, RegisterResult::Failed => return false, @@ -804,7 +815,7 @@ println!("can't generate default channel map for {} channels", dainfo.channels); let mut found_aud = false; for (iidx, istr) in src_sm.iter().enumerate() { - if istr.get_media_type() == StreamType::Audio && !found_aud { + if istr.get_media_type() == StreamType::Audio { match self.register_output_stream("any", istr, iidx, out_sm, enc_reg) { RegisterResult::Ok => found_aud = true, RegisterResult::Failed => return false, @@ -1022,6 +1033,7 @@ fn main() { let full_reg = FullRegister::new(); let mut transcoder = Transcoder::new(); + let mut use_video_tb = false; let mut arg_idx = 1; let mut printed_info = false; @@ -1173,6 +1185,9 @@ fn main() { "--calc-len" => { transcoder.calc_len = true; }, + "--use-video-tb" => { + use_video_tb = true; + }, "--verbose" | "-v" => transcoder.verbose = 1, "-vv" => transcoder.verbose = 2, "-v-" => transcoder.verbose = 0, @@ -1258,6 +1273,9 @@ fn main() { let max_id = sm.iter().fold(0u32, |id, strm| id.max(strm.id)); for stream in sm.iter() { let mut newstream = (*stream).clone(); + if use_video_tb && transcoder.global_tb == (0, 0) && newstream.get_media_type() == StreamType::Video { + transcoder.global_tb = newstream.get_timebase(); + } newstream.id += start; ism.add_stream(newstream); }