// Copyright (c) 2012-2017 VideoStitch SAS // Copyright (c) 2018 stitchEm #pragma once #include "frameBuffer.hpp" #include "stereoOutput.hpp" #include "stitchOutput.hpp" #include "libvideostitch/gpu_device.hpp" #include "libvideostitch/controller.hpp" #include "libvideostitch/output.hpp" #include #include namespace VideoStitch { namespace Core { /** * A StitchOutput implementation that writes a video frame synchronously to a writer. * * Not thread safe. */ class BlockingSourceOutput : public ExtractOutput::Pimpl, WriterPusher { public: static Potential create(std::shared_ptr surface, const std::vector>& renderers, const std::vector>& writers, int source) { std::unique_ptr bso(new BlockingSourceOutput(surface, renderers, writers, source)); FAIL_RETURN(GPU::useDefaultBackendDevice()); Potential frameBuffer = SourceFrameBuffer::create(surface, writers); FAIL_RETURN(frameBuffer.status()); bso->delegate = frameBuffer.release(); return bso.release(); } virtual ~BlockingSourceOutput() { delete delegate; } Status pushVideo(mtime_t date) override; virtual GPU::Surface& acquireFrame(mtime_t date, GPU::Stream& stream) override; virtual bool setRenderers(const std::vector>& r) override { return WriterPusher::setRenderers(r); } virtual bool addRenderer(std::shared_ptr r) override { return WriterPusher::addRenderer(r); } virtual bool removeRenderer(const std::string& id) override { return WriterPusher::removeRenderer(id); } virtual bool setWriters(const std::vector>& ws) override { return WriterPusher::setWriters(ws); } virtual bool addWriter(std::shared_ptr w) override { return WriterPusher::addWriter(w); } virtual bool removeWriter(const std::string& id) override { return WriterPusher::removeWriter(id); } virtual bool updateWriter(const std::string& id, const Ptv::Value& config) override { return WriterPusher::updateWriter(id, config); } private: BlockingSourceOutput(std::shared_ptr surface, const std::vector>& renderers, const std::vector>& writers, int source) : Pimpl(surface->getWidth(), surface->getHeight(), source), WriterPusher(surface->getWidth(), surface->getHeight(), writers) { setRenderers(renderers); } SourceFrameBuffer* delegate; }; class BlockingStitchOutput : public StitchOutput::Pimpl, WriterPusher { public: static Potential create(std::shared_ptr surface, const std::vector>& renderers, const std::vector>& writers) { std::unique_ptr bso(new BlockingStitchOutput(surface, renderers, writers)); FAIL_RETURN(GPU::useDefaultBackendDevice()); Potential frameBuffer = PanoFrameBuffer::create(surface, writers); FAIL_RETURN(frameBuffer.status()); bso->delegate = frameBuffer.release(); return bso.release(); } virtual ~BlockingStitchOutput() { delete delegate; } Status pushVideo(mtime_t date) override; virtual PanoSurface& acquireFrame(mtime_t) override; virtual bool setRenderers(const std::vector>& r) override { return WriterPusher::setRenderers(r); } virtual bool addRenderer(std::shared_ptr r) override { return WriterPusher::addRenderer(r); } virtual bool removeRenderer(const std::string& id) override { return WriterPusher::removeRenderer(id); } virtual void setCompositor(const std::shared_ptr& c) override { WriterPusher::setCompositor(c); } virtual bool setWriters(const std::vector>& ws) override { return WriterPusher::setWriters(ws); } virtual bool addWriter(std::shared_ptr w) override { return WriterPusher::addWriter(w); } virtual bool removeWriter(const std::string& id) override { return WriterPusher::removeWriter(id); } virtual bool updateWriter(const std::string& id, const Ptv::Value& config) override { return WriterPusher::updateWriter(id, config); } private: BlockingStitchOutput(std::shared_ptr surface, const std::vector>& renderers, const std::vector>& writers) : Pimpl(surface->getWidth(), surface->getHeight()), WriterPusher(surface->getWidth(), surface->getHeight(), writers) { setRenderers(renderers); } PanoFrameBuffer* delegate; }; /** * @brief A StereoOutput that writes a stereoscopic frame synchronously to a writer. * * Not thread safe. */ class BlockingStereoOutput : public StitcherOutput::Pimpl, StereoWriterPusher { public: static Potential create(std::shared_ptr surf, const std::vector>& renderers, const std::vector>& writers); virtual ~BlockingStereoOutput() { delete left; delete right; } Status pushVideo(mtime_t date, Eye eye) override; virtual PanoSurface& acquireLeftFrame(mtime_t) override; virtual PanoSurface& acquireRightFrame(mtime_t) override; virtual bool setRenderers(const std::vector>& r) override { return StereoWriterPusher::setRenderers(r); } virtual bool addRenderer(std::shared_ptr r) override { return StereoWriterPusher::addRenderer(r); } virtual bool removeRenderer(const std::string& id) override { return StereoWriterPusher::removeRenderer(id); } virtual bool setWriters(const std::vector>& ws) override { return StereoWriterPusher::setWriters(ws); } virtual bool addWriter(std::shared_ptr w) override { return StereoWriterPusher::addWriter(w); } virtual bool removeWriter(const std::string& id) override { return StereoWriterPusher::removeWriter(id); } virtual bool updateWriter(const std::string& id, const Ptv::Value& config) override { return StereoWriterPusher::updateWriter(id, config); } protected: BlockingStereoOutput(std::shared_ptr surf, const std::vector>& renderers, const std::vector>& writers) : Pimpl(surf->getWidth(), surf->getHeight()), StereoWriterPusher(surf->getWidth(), surf->getHeight(), writers) { setRenderers(renderers); } private: StereoFrameBuffer* left; StereoFrameBuffer* right; }; } // namespace Core } // namespace VideoStitch