diff --git a/source/encoders/encoder-ffmpeg.cpp b/source/encoders/encoder-ffmpeg.cpp index a25f29a..134c356 100644 --- a/source/encoders/encoder-ffmpeg.cpp +++ b/source/encoders/encoder-ffmpeg.cpp @@ -928,7 +928,7 @@ void ffmpeg_instance::parse_ffmpeg_commandline(std::string_view text) } } -ffmpeg_factory::ffmpeg_factory(const AVCodec* codec) : _avcodec(codec) +ffmpeg_factory::ffmpeg_factory(ffmpeg_manager* manager, const AVCodec* codec) : _avcodec(codec) { // Generate default identifier. { @@ -958,7 +958,7 @@ ffmpeg_factory::ffmpeg_factory(const AVCodec* codec) : _avcodec(codec) } // Find any available handlers for this codec. - if (_handler = ffmpeg_manager::instance()->get_handler(_avcodec->name); _handler) { + if (_handler = manager->get_handler(_avcodec->name); _handler) { // Override any found info with the one specified by the handler. _handler->adjust_info(this, _avcodec, _id, _name, _codec); @@ -1165,7 +1165,7 @@ ffmpeg_manager::ffmpeg_manager() : _factories(), _handlers(), _debug_handler() #ifdef ENABLE_ENCODER_FFMPEG_DNXHR register_handler("dnxhd", ::std::make_shared()); #endif - + // Encoders void* iterator = nullptr; for (const AVCodec* codec = av_codec_iterate(&iterator); codec != nullptr; codec = av_codec_iterate(&iterator)) { @@ -1175,7 +1175,7 @@ ffmpeg_manager::ffmpeg_manager() : _factories(), _handlers(), _debug_handler() if ((codec->type == AVMediaType::AVMEDIA_TYPE_AUDIO) || (codec->type == AVMediaType::AVMEDIA_TYPE_VIDEO)) { try { - _factories.emplace(codec, std::make_shared(codec)); + _factories.emplace(codec, std::make_shared(this, codec)); } catch (const std::exception& ex) { DLOG_ERROR("Failed to register encoder '%s': %s", codec->name, ex.what()); } @@ -1210,11 +1210,10 @@ bool ffmpeg_manager::has_handler(std::string_view codec) return (_handlers.find(codec.data()) != _handlers.end()); } - std::shared_ptr ffmpeg_manager::instance() { static std::weak_ptr winst; - static std::mutex mtx; + static std::mutex mtx; std::unique_lock lock(mtx); auto instance = winst.lock(); diff --git a/source/encoders/encoder-ffmpeg.hpp b/source/encoders/encoder-ffmpeg.hpp index 1c86102..f5e39ac 100644 --- a/source/encoders/encoder-ffmpeg.hpp +++ b/source/encoders/encoder-ffmpeg.hpp @@ -29,7 +29,9 @@ extern "C" { } namespace streamfx::encoder::ffmpeg { + class ffmpeg_instance; class ffmpeg_factory; + class ffmpeg_manager; class ffmpeg_instance : public obs::encoder_instance { ffmpeg_factory* _factory; @@ -117,7 +119,7 @@ namespace streamfx::encoder::ffmpeg { std::shared_ptr _handler; public: - ffmpeg_factory(const AVCodec* codec); + ffmpeg_factory(ffmpeg_manager* manager, const AVCodec* codec); virtual ~ffmpeg_factory(); const char* get_name() override;