use NAPacketiser::attach_stream() where appropriate
[nihav-encoder.git] / src / main.rs
index 81993116df0b57c915dd5629443e7c2e98ad24be..ee6ba25f478e53a0877c76f8c7ae2ac38bd576c5 100644 (file)
@@ -189,6 +189,7 @@ struct Transcoder {
 
     calc_len:       bool,
     nframes:        Vec<usize>,
+    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);
         }