X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=mux.h;h=ddf97fe92a591d86ec6dbebd9614cf32fa9a0846;hb=refs%2Fheads%2Fmultichannel_audio;hp=45eab34a3d12390ed69e1367b798f5383cced118;hpb=db03cd080a4b38d76b85d3acf88a1bac0e84e734;p=nageru diff --git a/mux.h b/mux.h index 45eab34..ddf97fe 100644 --- a/mux.h +++ b/mux.h @@ -6,19 +6,14 @@ extern "C" { #include #include -#include } +#include +#include #include -#include +#include #include -class KeyFrameSignalReceiver { -public: - // Needs to automatically turn the flag off again after actually receiving data. - virtual void signal_keyframe() = 0; -}; - class Mux { public: enum Codec { @@ -26,8 +21,10 @@ public: CODEC_NV12, // Uncompressed 4:2:0. }; - // 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); + // Takes ownership of avctx. will be called every time + // a write has been made to the video stream (id 0), with the pts of + // the just-written frame. (write_callback can be nullptr.) + Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const std::string &video_extradata, const AVCodecParameters *audio_codecpar, int time_base, std::function write_callback); ~Mux(); void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); @@ -43,27 +40,16 @@ public: void unplug(); private: - void add_interleaved_packet(const AVPacket &pkt); // Must be called with held. - void write_packet_with_signal(const AVPacket &pkt); // Must be called with held. + 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 . - // 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 . - std::queue waiting_packets; - AVStream *avstream_video, *avstream_audio; - KeyFrameSignalReceiver *keyframe_signal_receiver; + + std::function write_callback; }; #endif // !defined(_MUX_H)