X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mux.h;h=c6c442100c58b18c481754747693b54c8571bcbc;hb=4720dea1574992cdf28c0896c8fbca867978ba90;hp=b60b02a88585c470b9c934d1ea8b0f69f3ebb13c;hpb=3372c3c549a92e9bd904220e324d31422dc22303;p=nageru diff --git a/mux.h b/mux.h index b60b02a..c6c4421 100644 --- a/mux.h +++ b/mux.h @@ -6,13 +6,33 @@ extern "C" { #include #include -#include } +#include +#include +#include #include -#include +#include +#include #include +struct MuxMetrics { + // “written” will usually be equal video + audio + mux overhead, + // except that there could be buffered packets that count in audio or video + // but not yet in written. + std::atomic metric_video_bytes{0}, metric_audio_bytes{0}, metric_written_bytes{0}; + + // Registers in global_metrics. + void init(const std::vector> &labels); + + void reset() + { + metric_video_bytes = 0; + metric_audio_bytes = 0; + metric_written_bytes = 0; + } +}; + class Mux { public: enum Codec { @@ -20,8 +40,12 @@ public: CODEC_NV12, // Uncompressed 4:2:0. }; - // Takes ownership of avctx. - Mux(AVFormatContext *avctx, int width, int height, Codec video_codec, const std::string &video_extradata, const AVCodecParameters *audio_codecpar, int time_base); + // 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.) + // Does not take ownership of ; elements in there, if any, + // will be added to. + 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, const std::vector &metrics); ~Mux(); void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); @@ -45,6 +69,9 @@ private: std::vector plugged_packets; // Protected by . AVStream *avstream_video, *avstream_audio; + + std::function write_callback; + std::vector metrics; }; #endif // !defined(_MUX_H)