]> git.nihav.org Git - nihav-encoder.git/commitdiff
retrieve last (possibly unsynchronised) packets at the end
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 17 Mar 2025 17:55:15 +0000 (18:55 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 17 Mar 2025 17:55:15 +0000 (18:55 +0100)
src/main.rs

index 8c456b363b6ac9bc4eb8af43abda2bf683a24392..92ee64c7c87eb615d1aacdec45245942bf9f8e55 100644 (file)
@@ -110,7 +110,7 @@ macro_rules! parse_id {
     }
 }
 
-fn retrieve_packets(transcoder: &mut Transcoder, mux: &mut Muxer, vdata_size: &mut usize, adata_size: &mut usize) -> bool {
+fn retrieve_packets(transcoder: &mut Transcoder, mux: &mut Muxer, vdata_size: &mut usize, adata_size: &mut usize, end: bool) -> bool {
     while let Some(pkt) = transcoder.queue.get_packet() {
         if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) {
             return false;
@@ -126,6 +126,23 @@ fn retrieve_packets(transcoder: &mut Transcoder, mux: &mut Muxer, vdata_size: &m
             return false;
         }
     }
+    if end {
+        while let Some(pkt) = transcoder.queue.get_last_packet() {
+            if transcoder.end != NATimePoint::None && !pkt.ts.less_than(transcoder.end) {
+                return false;
+            }
+            let pkt_size = pkt.get_buffer().len();
+            match pkt.get_stream().get_media_type() {
+                StreamType::Video => { *vdata_size += pkt_size; },
+                StreamType::Audio => { *adata_size += pkt_size; },
+                _ => {},
+            };
+            if mux.mux_frame(pkt).is_err() {
+                println!("error muxing packet");
+                return false;
+            }
+        }
+    }
     true
 }
 
@@ -632,7 +649,7 @@ fn main() {
             },
         };
 
-        if !retrieve_packets(&mut transcoder, &mut mux, &mut vdata_size, &mut adata_size) {
+        if !retrieve_packets(&mut transcoder, &mut mux, &mut vdata_size, &mut adata_size, false) {
             break;
         }
     }
@@ -661,7 +678,7 @@ fn main() {
         };
     }
 
-    retrieve_packets(&mut transcoder, &mut mux, &mut vdata_size, &mut adata_size);
+    retrieve_packets(&mut transcoder, &mut mux, &mut vdata_size, &mut adata_size, true);
 
     if transcoder.verbose > 0 {
         println!();