X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=httpd.h;fp=httpd.h;h=21d8746172adc5231820a8c6a676d6bf08ef8ff0;hb=8348925c4cb0d7a73b07db03c6bc6d55fa0631b8;hp=11f15bd81fd9314433edf72e4da19d6e6e2bcb39;hpb=279aed5eebe0e50790c31b439ac39cace38ca746;p=nageru diff --git a/httpd.h b/httpd.h index 11f15bd..21d8746 100644 --- a/httpd.h +++ b/httpd.h @@ -1,11 +1,7 @@ #ifndef _HTTPD_H #define _HTTPD_H -// A class dealing with stream output to HTTP. Since we generally have very few outputs -// (end clients are not meant to connect directly to our stream; it should be -// transcoded by something else and then sent to a reflector), we don't need to -// care a lot about performance. Thus, we solve this by the simplest possible -// way, namely having one ffmpeg mux per output. +// A class dealing with stream output to HTTP. #include #include @@ -20,19 +16,17 @@ struct MHD_Connection; -extern "C" { -#include -#include -#include -} +class HTTPD { +public: + HTTPD(); -#include "mux.h" + // Should be called before start(). + void set_header(const std::string &data) { + header = data; + } -class HTTPD : public PacketDestination { -public: - HTTPD(int width, int height); void start(int port); - void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts) override; + void add_data(const char *buf, size_t size, bool keyframe); private: static int answer_to_connection_thunk(void *cls, MHD_Connection *connection, @@ -54,29 +48,27 @@ private: class Stream { public: - Stream(AVOutputFormat *oformat, int width, int height, int time_base, int bit_rate); - static ssize_t reader_callback_thunk(void *cls, uint64_t pos, char *buf, size_t max); ssize_t reader_callback(uint64_t pos, char *buf, size_t max); - void add_packet(const AVPacket &pkt, int64_t pts, int64_t dts); + enum DataType { + DATA_TYPE_HEADER, + DATA_TYPE_KEYFRAME, + DATA_TYPE_OTHER + }; + void add_data(const char *buf, size_t size, DataType data_type); private: - static int write_packet_thunk(void *opaque, uint8_t *buf, int buf_size); - int write_packet(uint8_t *buf, int buf_size); - 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. + size_t seen_keyframe = false; }; std::mutex streams_mutex; std::set streams; // Not owned. - - int width, height; + std::string header; }; #endif // !defined(_HTTPD_H)