]> git.sesse.net Git - casparcg/blobdiff - core/producer/frame_producer.cpp
2.1.0: -transition_producer: Fixed problem with unpausing paused source clip.
[casparcg] / core / producer / frame_producer.cpp
index bfc00d4e338ae4cef9c1a97386fd81364ba5d018..f4984bc83031f0c5ba76c0803433b66543ff8dc7 100644 (file)
@@ -46,25 +46,100 @@ void register_producer_factory(const producer_factory_t& factory)
        g_factories.push_back(factory);\r
 }\r
 \r
-boost::unique_future<std::wstring> frame_producer::call(const std::wstring&) \r
+struct frame_producer_base::impl\r
+{\r
+       tbb::atomic<uint32_t>   frame_number_;\r
+       tbb::atomic<bool>               paused_;\r
+       frame_producer_base&    self_;\r
+       draw_frame                              last_frame_;\r
+\r
+       impl(frame_producer_base& self)\r
+               : self_(self)\r
+               , last_frame_(draw_frame::empty())\r
+       {\r
+               frame_number_ = 0;\r
+               paused_ = false;\r
+       }\r
+       \r
+       draw_frame receive()\r
+       {\r
+               if(paused_)\r
+                       return self_.last_frame();\r
+\r
+               auto frame = draw_frame::push(self_.receive_impl());\r
+               if(frame == draw_frame::late())\r
+                       return frame;\r
+\r
+               ++frame_number_;\r
+\r
+               return last_frame_ = frame;\r
+       }\r
+\r
+       void paused(bool value)\r
+       {\r
+               paused_ = value;\r
+       }\r
+\r
+       draw_frame last_frame() const\r
+       {\r
+               return draw_frame::still(last_frame_);\r
+       }\r
+};\r
+\r
+frame_producer_base::frame_producer_base() : impl_(new impl(*this))\r
+{\r
+}\r
+\r
+frame_producer_base::frame_producer_base(frame_producer_base& self) : impl_(new impl(self))\r
+{\r
+}\r
+\r
+draw_frame frame_producer_base::receive()\r
+{\r
+       return impl_->receive();\r
+}\r
+\r
+void frame_producer_base::paused(bool value)\r
+{\r
+       impl_->paused(value);\r
+}\r
+\r
+draw_frame frame_producer_base::last_frame() const\r
+{\r
+       return impl_->last_frame();\r
+}\r
+\r
+boost::unique_future<std::wstring> frame_producer_base::call(const std::wstring&) \r
 {\r
        BOOST_THROW_EXCEPTION(not_supported());\r
 }\r
 \r
+uint32_t frame_producer_base::nb_frames() const\r
+{\r
+       return std::numeric_limits<uint32_t>::max();\r
+}\r
+\r
+uint32_t frame_producer_base::frame_number() const\r
+{\r
+       return impl_->frame_number_;\r
+}\r
+\r
 const spl::shared_ptr<frame_producer>& frame_producer::empty() \r
 {\r
        class empty_frame_producer : public frame_producer\r
        {\r
        public:\r
                empty_frame_producer(){}\r
-               virtual draw_frame receive(int){return draw_frame::empty();}\r
-               virtual draw_frame last_frame() const{return draw_frame::empty();}\r
-               virtual void set_frame_factory(const spl::shared_ptr<frame_factory>&){}\r
-               virtual uint32_t nb_frames() const {return 0;}\r
-               virtual std::wstring print() const { return L"empty";}\r
-               virtual void subscribe(const monitor::observable::observer_ptr& o){}\r
-               virtual void unsubscribe(const monitor::observable::observer_ptr& o){}  \r
-               virtual std::wstring name() const {return L"empty";}\r
+               draw_frame receive() override{return draw_frame::empty();}\r
+               void paused(bool value) override{}\r
+               uint32_t nb_frames() const override {return 0;}\r
+               std::wstring print() const override { return L"empty";}\r
+               void subscribe(const monitor::observable::observer_ptr& o) override{}\r
+               void unsubscribe(const monitor::observable::observer_ptr& o) override{} \r
+               std::wstring name() const override {return L"empty";}\r
+               uint32_t frame_number() const override {return 0;}\r
+               boost::unique_future<std::wstring> call(const std::wstring& params) override{BOOST_THROW_EXCEPTION(not_supported());}\r
+               draw_frame last_frame() const {return draw_frame::empty();}\r
        \r
                boost::property_tree::wptree info() const override\r
                {\r
@@ -118,16 +193,18 @@ public:
                }).detach(); \r
        }\r
        \r
-       draw_frame      receive(int flags) override                                                                                                                                                             {return producer_->receive(flags);}\r
-       draw_frame      last_frame() const override                                                                                                                                                             {return producer_->last_frame();}\r
+       draw_frame      receive() override                                                                                                                                                                                                              {return producer_->receive();}\r
        std::wstring                                                                            print() const override                                                                                                                  {return producer_->print();}\r
+       void                                                                                            paused(bool value) override                                                                                                             {producer_->paused(value);}\r
        std::wstring                                                                            name() const override                                                                                                                   {return producer_->name();}\r
+       uint32_t                                                                                        frame_number() const override                                                                                                   {return producer_->frame_number();}\r
        boost::property_tree::wptree                                            info() const override                                                                                                                   {return producer_->info();}\r
        boost::unique_future<std::wstring>                                      call(const std::wstring& str) override                                                                                  {return producer_->call(str);}\r
        void                                                                                            leading_producer(const spl::shared_ptr<frame_producer>& producer) override              {return producer_->leading_producer(producer);}\r
        uint32_t                                                                                        nb_frames() const override                                                                                                              {return producer_->nb_frames();}\r
-       virtual void subscribe(const monitor::observable::observer_ptr& o)                                                                                                                                                      {return producer_->subscribe(o);}\r
-       virtual void unsubscribe(const monitor::observable::observer_ptr& o)                                                                                                                                            {return producer_->unsubscribe(o);}\r
+       class draw_frame                                                                        last_frame() const                                                                                                                              {return producer_->last_frame();}\r
+       void                                                                                            subscribe(const monitor::observable::observer_ptr& o)                                                   {return producer_->subscribe(o);}\r
+       void                                                                                            unsubscribe(const monitor::observable::observer_ptr& o)                                                 {return producer_->unsubscribe(o);}\r
 };\r
 \r
 spl::shared_ptr<core::frame_producer> create_destroy_proxy(spl::shared_ptr<core::frame_producer> producer)\r