diff --git a/src/directrenderer.cpp b/src/directrenderer.cpp index 94351572b33af40043a7688b721b278d35e0233a..d51e989e79c271aa5e1d34c87f5d8fd8ccb46193 100644 --- a/src/directrenderer.cpp +++ b/src/directrenderer.cpp @@ -49,6 +49,7 @@ public: DRing::SinkTarget::FrameBufferPtr requestFrameBuffer(std::size_t bytes); void onNewFrame(DRing::SinkTarget::FrameBufferPtr buf); void onNewAVFrame(std::unique_ptr<DRing::VideoFrame> frame); + void configureTarget(bool useAVFrame); DRing::SinkTarget target; DRing::AVSinkTarget av_target; @@ -98,6 +99,10 @@ void Video::DirectRenderer::stopRendering () Video::Renderer::d_ptr->m_isRendering = false; emit stopped(); } +void Video::DirectRenderer::configureTarget(bool useAVFrame) +{ + d_ptr->configureTarget(useAVFrame); +} DRing::SinkTarget::FrameBufferPtr Video::DirectRendererPrivate::requestFrameBuffer(std::size_t bytes) { @@ -110,6 +115,20 @@ DRing::SinkTarget::FrameBufferPtr Video::DirectRendererPrivate::requestFrameBuff return std::move(daemonFramePtr_); } +void Video::DirectRendererPrivate::configureTarget(bool useAVFrame) +{ + using namespace std::placeholders; + if (useAVFrame) { + target.pull = nullptr; + target.push = nullptr; + av_target.push = std::bind(&Video::DirectRendererPrivate::onNewAVFrame, this, _1); + return; + } + target.pull = std::bind(&Video::DirectRendererPrivate::requestFrameBuffer, this, _1); + target.push = std::bind(&Video::DirectRendererPrivate::onNewFrame, this, _1); + av_target.push = nullptr; +} + void Video::DirectRendererPrivate::onNewFrame(DRing::SinkTarget::FrameBufferPtr buf) { if (not q_ptr->isRendering()) diff --git a/src/directrenderer.h b/src/directrenderer.h index ddddcada8ed04960c44c552dd17110c012533c04..e2514c6733373215ffbcafc845b11e997cbc1c71 100644 --- a/src/directrenderer.h +++ b/src/directrenderer.h @@ -52,6 +52,7 @@ public: virtual ColorSpace colorSpace() const override; virtual lrc::api::video::Frame currentFrame() const override; virtual std::unique_ptr<AVFrame, void(*)(AVFrame*)> currentAVFrame() const override; + void configureTarget(bool useAVFrame); public Q_SLOTS: virtual void startRendering() override; diff --git a/src/newvideo.cpp b/src/newvideo.cpp index 05869fe622766f54b83510b9a1aded5008c8fd74..fd000b7ad9f637b98a572c6164272a61f524909e 100644 --- a/src/newvideo.cpp +++ b/src/newvideo.cpp @@ -138,6 +138,9 @@ Renderer::isRendering() const void Renderer::useAVFrame(bool useAVFrame) { pimpl_->usingAVFrame_ = useAVFrame; +#ifdef ENABLE_LIBWRAP + pimpl_->renderer->configureTarget(useAVFrame); +#endif; } std::string