+ {
+ lock_guard<mutex> lock(mu);
+ if (plug_count > 0) {
+ plugged_packets.push_back(av_packet_clone(&pkt_copy));
+ } else {
+ add_interleaved_packet(pkt_copy);
+ }
+ }
+
+ av_packet_unref(&pkt_copy);
+}
+
+void Mux::add_interleaved_packet(const AVPacket &pkt)
+{
+ if (waiting_packets.empty() || waiting_packets.front()->stream_index == pkt.stream_index) {
+ // We could still get packets of the other type with earlier pts/dts,
+ // so we'll have to queue and wait.
+ waiting_packets.push(av_packet_clone(const_cast<AVPacket *>(&pkt)));
+ return;
+ }
+
+ // Flush all the queued packets that are supposed to go before this.
+ PacketBefore before(avctx);
+ while (!waiting_packets.empty() && !before(&pkt, waiting_packets.front())) {
+ AVPacket *queued_pkt = waiting_packets.front();
+ waiting_packets.pop();
+ write_packet_with_signal(*queued_pkt);
+ av_packet_free(&queued_pkt);
+ }
+
+ if (waiting_packets.empty()) {
+ waiting_packets.push(av_packet_clone(const_cast<AVPacket *>(&pkt)));
+ } else {
+ write_packet_with_signal(pkt);
+ }
+}
+
+void Mux::write_packet_with_signal(const AVPacket &pkt)
+{