From e4e76dae8fdd55d3ecd0582396ba6efaf2654438 Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Thu, 3 Oct 2019 20:10:03 +0200 Subject: [PATCH] ui/nvenc: Override lag in frames to use Max. B-Frames --- source/ui/nvenc_h264_handler.cpp | 6 ++++++ source/ui/nvenc_h264_handler.hpp | 3 +++ source/ui/nvenc_hevc_handler.cpp | 6 ++++++ source/ui/nvenc_hevc_handler.hpp | 3 +++ source/ui/nvenc_shared.cpp | 11 +++++++++++ source/ui/nvenc_shared.hpp | 3 +++ 6 files changed, 32 insertions(+) diff --git a/source/ui/nvenc_h264_handler.cpp b/source/ui/nvenc_h264_handler.cpp index 2aa14f7..c3105a0 100644 --- a/source/ui/nvenc_h264_handler.cpp +++ b/source/ui/nvenc_h264_handler.cpp @@ -85,6 +85,12 @@ void obsffmpeg::ui::nvenc_h264_handler::override_visible_name(const AVCodec*, st name = "H.264/AVC Encoder (NVidia NVENC)"; } +void obsffmpeg::ui::nvenc_h264_handler::override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{ + nvenc::override_lag_in_frames(lag, settings, codec, context); +} + void obsffmpeg::ui::nvenc_h264_handler::get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) { diff --git a/source/ui/nvenc_h264_handler.hpp b/source/ui/nvenc_h264_handler.hpp index 1b3712e..006d8bc 100644 --- a/source/ui/nvenc_h264_handler.hpp +++ b/source/ui/nvenc_h264_handler.hpp @@ -36,6 +36,9 @@ namespace obsffmpeg { public: virtual void override_visible_name(const AVCodec* codec, std::string& name) override; + virtual void override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) override; + virtual void get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) override; diff --git a/source/ui/nvenc_hevc_handler.cpp b/source/ui/nvenc_hevc_handler.cpp index 0540a3a..e01588d 100644 --- a/source/ui/nvenc_hevc_handler.cpp +++ b/source/ui/nvenc_hevc_handler.cpp @@ -87,6 +87,12 @@ void obsffmpeg::ui::nvenc_hevc_handler::override_visible_name(const AVCodec*, st name = "H.265/HEVC Encoder (NVidia NVENC)"; } +void obsffmpeg::ui::nvenc_hevc_handler::override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{ + nvenc::override_lag_in_frames(lag, settings, codec, context); +} + void obsffmpeg::ui::nvenc_hevc_handler::get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) { diff --git a/source/ui/nvenc_hevc_handler.hpp b/source/ui/nvenc_hevc_handler.hpp index 6b711ee..e66ea63 100644 --- a/source/ui/nvenc_hevc_handler.hpp +++ b/source/ui/nvenc_hevc_handler.hpp @@ -36,6 +36,9 @@ namespace obsffmpeg { public: virtual void override_visible_name(const AVCodec* codec, std::string& name) override; + virtual void override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) override; + virtual void get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context) override; diff --git a/source/ui/nvenc_shared.cpp b/source/ui/nvenc_shared.cpp index 389572b..0d3ea71 100644 --- a/source/ui/nvenc_shared.cpp +++ b/source/ui/nvenc_shared.cpp @@ -131,6 +131,17 @@ std::map obsffmpeg::nvenc::b_ref_mode_to_opt{ {b_ref_mode::MIDDLE, "middle"}, }; +void obsffmpeg::nvenc::override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context) +{ + // With NVENC, the number of frames lagged before we get our first + // packet is determined by the number of b-frames. Threads, lookahead + // frames and various other settings are ignored. + // The minimum number of lagged frames is 1. + + lag = 1ull + static_cast(context->max_b_frames); +} + void obsffmpeg::nvenc::get_defaults(obs_data_t* settings, const AVCodec*, AVCodecContext*) { obs_data_set_default_int(settings, ST_PRESET, static_cast(preset::DEFAULT)); diff --git a/source/ui/nvenc_shared.hpp b/source/ui/nvenc_shared.hpp index 2b6f8d2..577ed59 100644 --- a/source/ui/nvenc_shared.hpp +++ b/source/ui/nvenc_shared.hpp @@ -75,6 +75,9 @@ namespace obsffmpeg { extern std::map b_ref_mode_to_opt; + void override_lag_in_frames(size_t& lag, obs_data_t* settings, const AVCodec* codec, + AVCodecContext* context); + void get_defaults(obs_data_t* settings, const AVCodec* codec, AVCodecContext* context); void get_properties_pre(obs_properties_t* props, const AVCodec* codec);