From 81164d0f43836a256d5b60f36e75aaae5b10a98d Mon Sep 17 00:00:00 2001 From: Michael Fabian 'Xaymar' Dirks Date: Mon, 11 Nov 2019 23:24:19 +0100 Subject: [PATCH] encoder: Cleanup and refactor for stability --- source/encoder.cpp | 39 +++++++++++++++++++++++++++------------ source/encoder.hpp | 7 +++++++ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/source/encoder.cpp b/source/encoder.cpp index 47dfd6c..1732d64 100644 --- a/source/encoder.cpp +++ b/source/encoder.cpp @@ -772,16 +772,20 @@ std::shared_ptr obsffmpeg::encoder::pop_used_frame() } obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool is_texture_encode) - : _self(encoder), _lag_in_frames(0), _count_send_frames(0), _have_first_frame(false) + : _self(encoder), _factory(reinterpret_cast(obs_encoder_get_type_data(_self))), + _codec(_factory->get_avcodec()), _context(nullptr), _lag_in_frames(0), _count_send_frames(0), + _have_first_frame(false) { - // Initial set up. - _factory = reinterpret_cast(obs_encoder_get_type_data(_self)); - _codec = _factory->get_avcodec(); + // Find a handler _handler = obsffmpeg::find_codec_handler(_codec->name); + // Initialize GPU Stuff if (is_texture_encode) { #ifdef WIN32 - _hwapi = std::make_shared(); + auto gctx = obsffmpeg::obs_graphics(); + if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) { + _hwapi = std::make_shared(); + } #endif _hwinst = _hwapi->create_from_obs(); } @@ -797,14 +801,10 @@ obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool i av_init_packet(&_current_packet); av_new_packet(&_current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size. - if (!is_texture_encode) { - initialize_sw(settings); + if (is_texture_encode) { + initialize_hw(settings); } else { - try { - initialize_hw(settings); - } catch (...) { - throw obsffmpeg::unsupported_gpu_exception("Initializing hardware context failed."); - } + initialize_sw(settings); } // Log Encoder info @@ -1343,3 +1343,18 @@ bool obsffmpeg::encoder::encode_avframe(std::shared_ptr frame, encoder_ return true; } + +bool obsffmpeg::encoder::is_hardware_encode() +{ + return _hwinst != nullptr; +} + +const AVCodec* obsffmpeg::encoder::get_avcodec() +{ + return _codec; +} + +const AVCodecContext* obsffmpeg::encoder::get_avcodeccontext() +{ + return _context; +} diff --git a/source/encoder.hpp b/source/encoder.hpp index 356a12d..d20db0a 100644 --- a/source/encoder.hpp +++ b/source/encoder.hpp @@ -151,5 +151,12 @@ namespace obsffmpeg { bool encode_avframe(std::shared_ptr frame, struct encoder_packet* packet, bool* received_packet); + + public: // Handler API + bool is_hardware_encode(); + + const AVCodec* get_avcodec(); + + const AVCodecContext* get_avcodeccontext(); }; } // namespace obsffmpeg