]> git.sesse.net Git - casparcg/blobdiff - modules/image/consumer/image_consumer.cpp
2.0. Updated namespaces.
[casparcg] / modules / image / consumer / image_consumer.cpp
index 75b2f3e5d253638feac8263935db058eacafcfbd..bee70d1fc2143fef6d05130fa4d027b5876eae48 100644 (file)
 \r
 #include <FreeImage.h>\r
 \r
-namespace caspar {\r
+#include <vector>\r
+\r
+namespace caspar { namespace image {\r
        \r
 struct image_consumer : public core::frame_consumer\r
 {\r
-       core::video_format_desc format_desc_;\r
-       size_t counter_;\r
+       core::video_format_desc                                 format_desc_;\r
+       std::vector<safe_ptr<core::read_frame>> frames_;\r
 public:\r
-       image_consumer() : counter_(0)\r
-       {\r
-       }\r
 \r
        virtual void initialize(const core::video_format_desc& format_desc)\r
        {\r
@@ -54,35 +53,32 @@ public:
        \r
        virtual bool send(const safe_ptr<core::read_frame>& frame)\r
        {                               \r
-               if(counter_ < core::consumer_buffer_depth())\r
-                       ++counter_;\r
-               else if(counter_ == core::consumer_buffer_depth())\r
+               frames_.push_back(frame);\r
+\r
+               if(frames_.size() < core::consumer_buffer_depth())\r
+                       return true;\r
+\r
+               auto my_frame = frames_.front();\r
+               boost::thread async([=]\r
                {\r
-                       boost::thread async([=]\r
+                       try\r
                        {\r
-                               try\r
-                               {\r
-                                       auto filename = narrow(env::data_folder()) +  boost::posix_time::to_iso_string(boost::posix_time::second_clock::local_time()) + ".png";\r
-\r
-                                       auto bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Allocate(format_desc_.width, format_desc_.height, 32), FreeImage_Unload);\r
-                                       memcpy(FreeImage_GetBits(bitmap.get()), frame->image_data().begin(), frame->image_size());\r
-                                       FreeImage_FlipVertical(bitmap.get());\r
-                                       FreeImage_Save(FIF_PNG, bitmap.get(), filename.c_str(), 0);\r
-                               }\r
-                               catch(...)\r
-                               {\r
-                                       CASPAR_LOG_CURRENT_EXCEPTION();\r
-                               }\r
-                       });\r
-                       async.detach();\r
-\r
-                       return false;\r
-               }\r
-\r
-               return true;\r
-       }\r
+                               auto filename = narrow(env::data_folder()) +  boost::posix_time::to_iso_string(boost::posix_time::second_clock::local_time()) + ".png";\r
+\r
+                               auto bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Allocate(format_desc_.width, format_desc_.height, 32), FreeImage_Unload);\r
+                               memcpy(FreeImage_GetBits(bitmap.get()), my_frame->image_data().begin(), my_frame->image_size());\r
+                               FreeImage_FlipVertical(bitmap.get());\r
+                               FreeImage_Save(FIF_PNG, bitmap.get(), filename.c_str(), 0);\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       }\r
+               });\r
+               async.detach();\r
 \r
-       virtual size_t buffer_depth() const{return 3;}\r
+               return false;\r
+       }\r
 \r
        virtual std::wstring print() const\r
        {\r
@@ -95,7 +91,7 @@ public:
        }\r
 };\r
 \r
-safe_ptr<core::frame_consumer> create_image_consumer(const std::vector<std::wstring>& params)\r
+safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>& params)\r
 {\r
        if(params.size() < 1 || params[0] != L"IMAGE")\r
                return core::frame_consumer::empty();\r
@@ -103,5 +99,4 @@ safe_ptr<core::frame_consumer> create_image_consumer(const std::vector<std::wstr
        return make_safe<image_consumer>();\r
 }\r
 \r
-\r
-}\r
+}}\r