X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=x264_speed_control.h;h=b45e6c6de285c90e866293f0aa95e52258601b2a;hb=5cd2e667b7531777991c98dc6d3249e95b98314c;hp=84eb090380850f8264ed224a3f26a987a0f80ebf;hpb=68f62f5ff04a411e1da95e4119817ab08f27f4e4;p=nageru diff --git a/x264_speed_control.h b/x264_speed_control.h index 84eb090..b45e6c6 100644 --- a/x264_speed_control.h +++ b/x264_speed_control.h @@ -43,10 +43,9 @@ // one does not need to patch x264 to use it in Nageru. It still could do with // some cleanup, but it's much, much better than just using a static preset. -#include #include -#include -#include +#include +#include extern "C" { #include "x264.h" @@ -80,20 +79,30 @@ public: void before_frame(float new_buffer_fill, int new_buffer_size, float f_uspf); void after_frame(); + // x264 seemingly has an issue where x264_encoder_reconfig() is not reflected + // immediately in x264_encoder_parameters(). Since speed control keeps calling + // those two all the time, any changes you make outside X264SpeedControl + // could be overridden. Thus, to make changes to encoder parameters, you should + // instead set a function here, which will be called every time parameters + // are modified. + void set_config_override_function(std::function override_func) + { + this->override_func = override_func; + } + private: void set_buffer_size(int new_buffer_size); int dither_preset(float f); void apply_preset(int new_preset); - int64_t mdate(); // Current time in microseconds. // Not owned by us. x264_t *x264; float f_speed; - // all times are in usec - int64_t timestamp; // when was speedcontrol last invoked - int64_t cpu_time_last_frame = 0; // time spent encoding the previous frame + // all times that are not std::chrono::* are in usec + std::chrono::steady_clock::time_point timestamp; // when was speedcontrol last invoked + std::chrono::steady_clock::duration cpu_time_last_frame{std::chrono::seconds{0}}; // time spent encoding the previous frame int64_t buffer_size; // assumed application-side buffer of frames to be streamed (measured in microseconds), int64_t buffer_fill; // where full = we don't have to hurry int64_t compensation_period; // how quickly we try to return to the target buffer fullness @@ -112,4 +121,6 @@ private: double avg_preset; int den; } stat; + + std::function override_func = nullptr; };