From ca2a0dd8be9ff84feed947b9d89330c7db6eed3c Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Mon, 29 Jul 2019 12:11:43 -0400
Subject: [PATCH] preview: fix when using avframe

Change-Id: I6f5dfc7858ce60274963053f35e217b3af0a709a
---
 src/directrenderer.cpp | 19 +++++++++++++++++++
 src/directrenderer.h   |  1 +
 src/newvideo.cpp       |  3 +++
 3 files changed, 23 insertions(+)

diff --git a/src/directrenderer.cpp b/src/directrenderer.cpp
index 94351572..d51e989e 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 ddddcada..e2514c67 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 05869fe6..fd000b7a 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
-- 
GitLab