X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mux.h;h=b3ea0120736e13c8cecd2daad5dc0975cd584df3;hb=319b807ceede52e45cf07f712259b1a42ec3cc54;hp=2eb8eeaa45f1472f471488736b9638ce382b2407;hpb=8348925c4cb0d7a73b07db03c6bc6d55fa0631b8;p=nageru diff --git a/mux.h b/mux.h index 2eb8eea..b3ea012 100644 --- a/mux.h +++ b/mux.h @@ -9,11 +9,9 @@ extern "C" { #include } -class KeyFrameSignalReceiver { -public: - // Needs to automatically turn the flag off again after actually receiving data. - virtual void signal_keyframe() = 0; -}; +#include +#include +#include class Mux { public: @@ -23,14 +21,30 @@ public: }; // Takes ownership of avctx. can be nullptr. - Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const AVCodec *codec_audio, int time_base, int bit_rate, KeyFrameSignalReceiver *keyframe_signal_receiver); + Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const std::string &video_extradata, const AVCodecParameters *audio_codecpar, int time_base); ~Mux(); 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: - AVFormatContext *avctx; + void write_packet_or_die(const AVPacket &pkt); // Must be called with held. + + 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)