From 4cac28a8a36e5006e8685e107dbb7cbfd15d0c4a Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Thu, 3 Oct 2019 20:09:34 +0200 Subject: [PATCH] ui/handler, encoder: Allow overriding lag in frames The lag in frames is not dictated by the number of threads being used by some encoders. At least for hardware encoders, the expected frame lag in real time encoding is 1 + the number of bframes --- source/encoder.cpp | 5 ++++- source/encoder.hpp | 4 ++-- source/ui/handler.cpp | 4 ++++ source/ui/handler.hpp | 3 +++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/source/encoder.cpp b/source/encoder.cpp index 037fa61..eaee9a2 100644 --- a/source/encoder.cpp +++ b/source/encoder.cpp @@ -878,6 +878,9 @@ bool obsffmpeg::encoder::update(obs_data_t* settings) nullptr, "=", ";"); } + if (_handler) + _handler->override_lag_in_frames(_lag_in_frames, settings, _codec, _context); + // Handler Logging if (_handler) _handler->log_options(settings, _codec, _context); @@ -1102,7 +1105,7 @@ bool obsffmpeg::encoder::encode_avframe(std::shared_ptr frame, encoder_ bool sent_frame = false; bool recv_packet = false; - bool should_lag = (_lag_in_frames - _count_send_frames) <= 0; + bool should_lag = (_count_send_frames >= _lag_in_frames); auto loop_begin = std::chrono::high_resolution_clock::now(); auto loop_end = loop_begin + std::chrono::milliseconds(50); diff --git a/source/encoder.hpp b/source/encoder.hpp index b7c83c2..6014d7d 100644 --- a/source/encoder.hpp +++ b/source/encoder.hpp @@ -94,8 +94,8 @@ namespace obsffmpeg { ffmpeg::swscale _swscale; AVPacket _current_packet; - int64_t _lag_in_frames; - int64_t _count_send_frames; + size_t _lag_in_frames; + size_t _count_send_frames; // Extra Data bool _have_first_frame; diff --git a/source/ui/handler.cpp b/source/ui/handler.cpp index 38e9a74..fa68976 100644 --- a/source/ui/handler.cpp +++ b/source/ui/handler.cpp @@ -29,6 +29,10 @@ void obsffmpeg::ui::handler::override_colorformat(AVPixelFormat& target_format, const AVCodec* codec, AVCodecContext* context) {} +void obsffmpeg::ui::handler::override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{} + void obsffmpeg::ui::handler::get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) {} void obsffmpeg::ui::handler::get_properties(obs_properties_t* props, const AVCodec* codec, AVCodecContext* context) {} diff --git a/source/ui/handler.hpp b/source/ui/handler.hpp index ae2e7a2..b5fcff5 100644 --- a/source/ui/handler.hpp +++ b/source/ui/handler.hpp @@ -47,6 +47,9 @@ namespace obsffmpeg { virtual void override_colorformat(AVPixelFormat& target_format, obs_data_t* settings, const AVCodec* codec, AVCodecContext* context); + virtual void override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context); + virtual void get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context); virtual void get_properties(obs_properties_t* props, const AVCodec* codec,