X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=x264_encoder.h;h=bb9f1dc066dd43b0b544b744452a1c93251a56da;hb=7188db27a931607ed0388b10b351164c37cf04ee;hp=e146cd2b2b6a3044a5ab20d3d9195fa05f831e32;hpb=dcbd18f44037f097b26aed93fde11392906d86ea;p=nageru diff --git a/x264_encoder.h b/x264_encoder.h index e146cd2..bb9f1dc 100644 --- a/x264_encoder.h +++ b/x264_encoder.h @@ -27,22 +27,33 @@ extern "C" { #include "x264.h" +#include } class Mux; +class X264SpeedControl; class X264Encoder { public: - X264Encoder(Mux *httpd); // Does not take ownership. + X264Encoder(AVOutputFormat *oformat); // Does not take ownership. // Called after the last frame. Will block; once this returns, // the last data is flushed. ~X264Encoder(); + // Must be called before first frame. Does not take ownership. + void set_mux(Mux *mux) { this->mux = mux; } + // is taken to be raw NV12 data of WIDTHxHEIGHT resolution. // Does not block. void add_frame(int64_t pts, int64_t duration, const uint8_t *data); + std::string get_global_headers() const { return global_headers; } + + void change_bitrate(unsigned rate_kbit) { + new_bitrate_kbit = rate_kbit; + } + private: struct QueuedFrame { int64_t pts, duration; @@ -58,10 +69,17 @@ private: std::unique_ptr frame_pool; Mux *mux = nullptr; + bool wants_global_headers; + + std::string global_headers; + std::string buffered_sei; // Will be output before first frame, if any. std::thread encoder_thread; std::atomic should_quit{false}; x264_t *x264; + std::unique_ptr speed_control; + + std::atomic new_bitrate_kbit{0}; // 0 for no change. // Protects everything below it. std::mutex mu;