+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_unref(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)
+{
+ if (keyframe_signal_receiver) {
+ if (pkt.flags & AV_PKT_FLAG_KEY) {
+ av_write_frame(avctx, nullptr);
+ keyframe_signal_receiver->signal_keyframe();
+ }
+ }
+ if (av_write_frame(avctx, const_cast<AVPacket *>(&pkt)) < 0) {
+ fprintf(stderr, "av_interleaved_write_frame() failed\n");
+ exit(1);
+ }
+}
+