]> git.sesse.net Git - nageru/blobdiff - mux.h
Add back manual interleaving, but this time in Mux.
[nageru] / mux.h
diff --git a/mux.h b/mux.h
index 47855f728ae82b5d09d9a180c0035fc59d770027..45eab34a3d12390ed69e1367b798f5383cced118 100644 (file)
--- a/mux.h
+++ b/mux.h
@@ -10,6 +10,7 @@ extern "C" {
 }
 
 #include <mutex>
+#include <queue>
 #include <vector>
 
 class KeyFrameSignalReceiver {
@@ -42,11 +43,25 @@ public:
        void unplug();
 
 private:
+       void add_interleaved_packet(const AVPacket &pkt);  // Must be called with <mu> held.
+       void write_packet_with_signal(const AVPacket &pkt);  // Must be called with <mu> held.
+
        std::mutex mu;
        AVFormatContext *avctx;  // Protected by <mu>.
        int plug_count = 0;  // Protected by <mu>.
        std::vector<AVPacket *> plugged_packets;  // Protected by <mu>.
 
+       // We need to do our own interleaving since we do explicit flushes
+       // before each keyframe. This queue contains every packet that we
+       // couldn't send yet, in add order. Essentially, we can't send a packet
+       // before we know we cannot receive an earlier (dts-wise) packet
+       // from another stream. This means that this queue will either contain
+       // video packets only or audio packets only, and as soon as a packet
+       // of the other type comes in, we can empty the flush the queue up
+       // to that point.
+       // Protected by <mu>.
+       std::queue<AVPacket *> waiting_packets;
+
        AVStream *avstream_video, *avstream_audio;
        KeyFrameSignalReceiver *keyframe_signal_receiver;
 };