X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=httpd.h;h=695c7082cd36436b8bbf345f48fd53681f924a33;hb=72d11df3520d1afd8929b167dfa7eabdbe8eed63;hp=d546feec22180ab4c9bf7fe10be417d9f7b6dff5;hpb=6ebc7f7bd501d1115bf164ce3e1c22db326798c2;p=nageru diff --git a/httpd.h b/httpd.h index d546fee..695c708 100644 --- a/httpd.h +++ b/httpd.h @@ -16,8 +16,8 @@ #include #include #include +#include #include -#include struct MHD_Connection; @@ -29,9 +29,19 @@ extern "C" { class HTTPD { public: - HTTPD(const char *output_filename, int width, int height); + enum PacketDestination { + DESTINATION_FILE_ONLY, + DESTINATION_HTTP_ONLY, + DESTINATION_FILE_AND_HTTP + }; + + HTTPD(int width, int height); void start(int port); - void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); + void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts, PacketDestination destination); + + // You can only have one going at the same time. + void open_output_file(const std::string &filename); + void close_output_file(); private: static int answer_to_connection_thunk(void *cls, MHD_Connection *connection, @@ -46,13 +56,23 @@ private: static void free_stream(void *cls); + static void request_completed_thunk(void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe); + + void request_completed(struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe); + class Mux { public: - Mux(AVFormatContext *avctx, int width, int height); // Takes ownership of avctx. + enum Codec { + CODEC_H264, + CODEC_NV12, // Uncompressed 4:2:0. + }; + + Mux(AVFormatContext *avctx, int width, int height, Codec video_codec); // Takes ownership of avctx. ~Mux(); void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); private: + bool seen_keyframe = false; AVFormatContext *avctx; AVStream *avstream_video, *avstream_audio; }; @@ -70,15 +90,16 @@ private: static int write_packet_thunk(void *opaque, uint8_t *buf, int buf_size); int write_packet(uint8_t *buf, int buf_size); - std::unique_ptr mux; - std::mutex buffer_mutex; std::condition_variable has_buffered_data; std::deque buffered_data; // Protected by . size_t used_of_buffered_data = 0; // How many bytes of the first element of that is already used. Protected by . + + std::unique_ptr mux; // Must come last to be destroyed before buffered_data, since the destructor can write bytes. }; - std::vector streams; // Not owned. + std::mutex streams_mutex; + std::set streams; // Not owned. int width, height; std::unique_ptr file_mux; // To local disk.