]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 26 Aug 2011 13:04:32 +0000 (13:04 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 26 Aug 2011 13:04:32 +0000 (13:04 +0000)
modules/decklink/consumer/decklink_consumer.cpp

index dce653a55babb88ed30bedc7fa6eba18a61f7e79..d0949fd807a1ef4b43e5aa8650a32e0ca2ddd70c 100644 (file)
@@ -65,6 +65,7 @@ struct configuration
 \r
 class decklink_frame : public IDeckLinkVideoFrame\r
 {\r
+       tbb::atomic<int>                                                                                        ref_count_;\r
        std::shared_ptr<core::read_frame>                                                       frame_;\r
        const core::video_format_desc                                                           format_desc_;\r
 \r
@@ -74,11 +75,23 @@ public:
        decklink_frame(const safe_ptr<core::read_frame>& frame, const core::video_format_desc& format_desc, bool key_only)\r
                : frame_(frame)\r
                , format_desc_(format_desc)\r
-               , key_only_(key_only){}\r
+               , key_only_(key_only)\r
+       {\r
+               ref_count_ = 0;\r
+       }\r
        \r
        STDMETHOD (QueryInterface(REFIID, LPVOID*))             {return E_NOINTERFACE;}\r
-       STDMETHOD_(ULONG,                       AddRef())                       {return 1;}\r
-       STDMETHOD_(ULONG,                       Release())                      {return 1;}\r
+       STDMETHOD_(ULONG,                       AddRef())                       \r
+       {\r
+               return ++ref_count_;\r
+       }\r
+       STDMETHOD_(ULONG,                       Release())                      \r
+       {\r
+               --ref_count_;\r
+               if(ref_count_ == 0)\r
+                       delete this;\r
+               return ref_count_;\r
+       }\r
 \r
        STDMETHOD_(long,                        GetWidth())                     {return format_desc_.width;}        \r
     STDMETHOD_(long,                   GetHeight())            {return format_desc_.height;}        \r
@@ -138,7 +151,6 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLink
 \r
        size_t                                                          preroll_count_;\r
                \r
-       std::list<std::shared_ptr<IDeckLinkVideoFrame>> frame_container_; // Must be std::list in order to guarantee that pointers are always valid.\r
        boost::circular_buffer<std::vector<int16_t>>    audio_container_;\r
 \r
        tbb::concurrent_bounded_queue<std::shared_ptr<core::read_frame>> video_frame_buffer_;\r
@@ -305,11 +317,6 @@ public:
                        else if(result == bmdOutputFrameFlushed)\r
                                graph_->add_tag("flushed-frame");\r
 \r
-                       frame_container_.erase(std::find_if(frame_container_.begin(), frame_container_.end(), [&](const std::shared_ptr<IDeckLinkVideoFrame>& frame)\r
-                       {\r
-                               return frame.get() == completed_frame;\r
-                       }));\r
-\r
                        std::shared_ptr<core::read_frame> frame;        \r
                        video_frame_buffer_.pop(frame);                                 \r
                        schedule_next_video(make_safe(frame));  \r
@@ -370,8 +377,8 @@ public:
                        \r
        void schedule_next_video(const safe_ptr<core::read_frame>& frame)\r
        {\r
-               frame_container_.push_back(std::make_shared<decklink_frame>(frame, format_desc_, config_.key_only));\r
-               if(FAILED(output_->ScheduleVideoFrame(frame_container_.back().get(), (frames_scheduled_++) * format_desc_.duration, format_desc_.duration, format_desc_.time_scale)))\r
+               CComPtr<IDeckLinkVideoFrame> frame2(new decklink_frame(frame, format_desc_, config_.key_only));\r
+               if(FAILED(output_->ScheduleVideoFrame(frame2, (frames_scheduled_++) * format_desc_.duration, format_desc_.duration, format_desc_.time_scale)))\r
                        CASPAR_LOG(error) << print() << L" Failed to schedule video.";\r
 \r
                graph_->update_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5);\r