X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mux.h;h=47855f728ae82b5d09d9a180c0035fc59d770027;hb=ab03e5e6f24b1651b4ca7df95e20aa5786939209;hp=47ff775d8cdf2d0faa2148ae1b55100d2bbcd8b1;hpb=acc9fe1e6be3e7b1c95f44e45728ec3beae576b0;p=nageru diff --git a/mux.h b/mux.h index 47ff775..47855f7 100644 --- a/mux.h +++ b/mux.h @@ -9,28 +9,46 @@ extern "C" { #include } -class PacketDestination { +#include +#include + +class KeyFrameSignalReceiver { public: - virtual ~PacketDestination() {} - virtual void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts) = 0; + // Needs to automatically turn the flag off again after actually receiving data. + virtual void signal_keyframe() = 0; }; -class Mux : public PacketDestination { +class Mux { public: enum Codec { CODEC_H264, CODEC_NV12, // Uncompressed 4:2:0. }; - // Takes ownership of avctx. - Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const AVCodec *codec_audio, int time_base, int bit_rate); + // Takes ownership of avctx. can be nullptr. + Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const std::string &video_extradata, const AVCodecContext *audio_ctx, int time_base, KeyFrameSignalReceiver *keyframe_signal_receiver); ~Mux(); - void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts) override; + void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); + + // As long as the mux is plugged, it will not actually write anything to disk, + // just queue the packets. Once it is unplugged, the packets are reordered by pts + // and written. This is primarily useful if you might have two different encoders + // writing to the mux at the same time (because one is shutting down), so that + // pts might otherwise come out-of-order. + // + // You can plug and unplug multiple times; only when the plug count reaches zero, + // something will actually happen. + void plug(); + void unplug(); private: - bool seen_keyframe = false; - AVFormatContext *avctx; + std::mutex mu; + AVFormatContext *avctx; // Protected by . + int plug_count = 0; // Protected by . + std::vector plugged_packets; // Protected by . + AVStream *avstream_video, *avstream_audio; + KeyFrameSignalReceiver *keyframe_signal_receiver; }; #endif // !defined(_MUX_H)