encoder: Cleanup and refactor for stability

This commit is contained in:
Michael Fabian 'Xaymar' Dirks
2019-11-11 23:24:19 +01:00
parent 05d8e74088
commit 81164d0f43
2 changed files with 34 additions and 12 deletions
+26 -11
View File
@@ -772,16 +772,20 @@ std::shared_ptr<AVFrame> obsffmpeg::encoder::pop_used_frame()
} }
obsffmpeg::encoder::encoder(obs_data_t* settings, obs_encoder_t* encoder, bool is_texture_encode) 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<encoder_factory*>(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. // Find a handler
_factory = reinterpret_cast<encoder_factory*>(obs_encoder_get_type_data(_self));
_codec = _factory->get_avcodec();
_handler = obsffmpeg::find_codec_handler(_codec->name); _handler = obsffmpeg::find_codec_handler(_codec->name);
// Initialize GPU Stuff
if (is_texture_encode) { if (is_texture_encode) {
#ifdef WIN32 #ifdef WIN32
auto gctx = obsffmpeg::obs_graphics();
if (gs_get_device_type() == GS_DEVICE_DIRECT3D_11) {
_hwapi = std::make_shared<obsffmpeg::hwapi::d3d11>(); _hwapi = std::make_shared<obsffmpeg::hwapi::d3d11>();
}
#endif #endif
_hwinst = _hwapi->create_from_obs(); _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_init_packet(&_current_packet);
av_new_packet(&_current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size. av_new_packet(&_current_packet, 8 * 1024 * 1024); // 8 MB precached Packet size.
if (!is_texture_encode) { if (is_texture_encode) {
initialize_sw(settings);
} else {
try {
initialize_hw(settings); initialize_hw(settings);
} catch (...) { } else {
throw obsffmpeg::unsupported_gpu_exception("Initializing hardware context failed."); initialize_sw(settings);
}
} }
// Log Encoder info // Log Encoder info
@@ -1343,3 +1343,18 @@ bool obsffmpeg::encoder::encode_avframe(std::shared_ptr<AVFrame> frame, encoder_
return true; 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;
}
+7
View File
@@ -151,5 +151,12 @@ namespace obsffmpeg {
bool encode_avframe(std::shared_ptr<AVFrame> frame, struct encoder_packet* packet, bool encode_avframe(std::shared_ptr<AVFrame> frame, struct encoder_packet* packet,
bool* received_packet); bool* received_packet);
public: // Handler API
bool is_hardware_encode();
const AVCodec* get_avcodec();
const AVCodecContext* get_avcodeccontext();
}; };
} // namespace obsffmpeg } // namespace obsffmpeg