]> git.sesse.net Git - casparcg/blob - modules/image/producer/image_scroll_producer.cpp
2.0.0.2: Added copyright notice to all files.
[casparcg] / modules / image / producer / image_scroll_producer.cpp
1 /*\r
2 * copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 *  This file is part of CasparCG.\r
5 *\r
6 *    CasparCG is free software: you can redistribute it and/or modify\r
7 *    it under the terms of the GNU General Public License as published by\r
8 *    the Free Software Foundation, either version 3 of the License, or\r
9 *    (at your option) any later version.\r
10 *\r
11 *    CasparCG is distributed in the hope that it will be useful,\r
12 *    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 *    GNU General Public License for more details.\r
15 \r
16 *    You should have received a copy of the GNU General Public License\r
17 *    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
18 *\r
19 */\r
20 //#include "image_scroll_producer.h"\r
21 //\r
22 //#include "image_loader.h"\r
23 //\r
24 //#include "../../mixer/basic_frame.h"\r
25 //#include "../../mixer/basic_frame.h"\r
26 //#include "../../video_format.h"\r
27 //#include "../../mixer/frame_mixer_device.h"\r
28 //#include "../../configuration.h"\r
29 //\r
30 //#include <tbb/parallel_for.h>\r
31 //#include <tbb/parallel_invoke.h>\r
32 //#include <tbb/scalable_allocator.h>\r
33 //\r
34 //#include <boost/assign.hpp>\r
35 //#include <boost/algorithm/string/case_conv.hpp>\r
36 //\r
37 //using namespace boost::assign;\r
38 //\r
39 //namespace caspar { namespace core { namespace image{\r
40 //\r
41 //enum direction\r
42 //{\r
43 //      Up, Down, Left, Right\r
44 //};\r
45 //\r
46 //struct image_scroll_producer : public frame_producer\r
47 //{\r
48 //      static const int DEFAULT_SCROLL_SPEED = 50;\r
49 //\r
50 //      image_scroll_producer(const std::wstring& filename, const std::vector<std::wstring>& params) \r
51 //              : speed_(image_scroll_producer::DEFAULT_SCROLL_SPEED), direction_(direction::Up), offset_(0), filename_(filename)\r
52 //      {\r
53 //              auto pos = filename.find_last_of(L'_');\r
54 //              if(pos != std::wstring::npos && pos + 1 < filename.size())\r
55 //              {\r
56 //                      std::wstring speedStr = filename.substr(pos + 1);\r
57 //                      pos = speedStr.find_first_of(L'.');\r
58 //                      if(pos != std::wstring::npos)\r
59 //                      {\r
60 //                              speedStr = speedStr.substr(0, pos);             \r
61 //                              speed_ = lexical_cast_or_default<int>(speedStr, image_scroll_producer::DEFAULT_SCROLL_SPEED);\r
62 //                      }\r
63 //              }\r
64 //\r
65 //              loop_ = std::find(params.begin(), params.end(), L"LOOP") != params.end();\r
66 //      }\r
67 //\r
68 //      void load_and_pad_image(const std::wstring& filename)\r
69 //      {\r
70 //              auto pBitmap = load_image(filename);\r
71 //\r
72 //              size_t width = FreeImage_GetWidth(pBitmap.get());\r
73 //              size_t height = FreeImage_GetHeight(pBitmap.get());\r
74 //\r
75 //              image_width_ = std::max(width, format_desc_.width);\r
76 //              image_height_ = std::max(height, format_desc_.height);\r
77 //\r
78 //              image_ = std::shared_ptr<unsigned char>(static_cast<unsigned char*>(scalable_aligned_malloc(image_width_*image_height_*4, 16)));\r
79 //              std::fill_n(image_.get(), image_width_*image_height_*4, 0);\r
80 //\r
81 //              unsigned char* pBits = FreeImage_GetBits(pBitmap.get());\r
82 //              \r
83 //              for (size_t i = 0; i < height; ++i)\r
84 //                      std::copy_n(&pBits[i* width * 4], width * 4, &image_.get()[i * image_width_ * 4]);\r
85 //      }\r
86 //\r
87 //      basic_frame do_receive()\r
88 //      {\r
89 //              auto frame = frame_factory_->create_frame(format_desc_.width, format_desc_.height);\r
90 //              std::fill(frame.image_data().begin(), frame.image_data().end(), 0);\r
91 //\r
92 //              const int delta_x = direction_ == direction::Left ? speed_ : -speed_;\r
93 //              const int delta_y = direction_ == direction::Up ? speed_ : -speed_;\r
94 //\r
95 //              unsigned char* frame_data = frame.image_data().begin();\r
96 //              unsigned char* image_data = image_.get();\r
97 //      \r
98 //              if (direction_ == direction::Up || direction_ == direction::Down)\r
99 //              {\r
100 //                      tbb::parallel_for(static_cast<size_t>(0), format_desc_.height, static_cast<size_t>(1), [&](size_t i)\r
101 //                      {\r
102 //                              int srcRow = i + offset_;\r
103 //                              int dstInxex = i * format_desc_.width * 4;\r
104 //                              int srcIndex = srcRow * format_desc_.width * 4;\r
105 //                              int size = format_desc_.width * 4;\r
106 //\r
107 //                              std::copy_n(&image_data[srcIndex], size, &frame_data[dstInxex]);\r
108 //                      });                             \r
109 //                      \r
110 //                      offset_ += delta_y;\r
111 //              }\r
112 //              else\r
113 //              {\r
114 //                      tbb::parallel_for(static_cast<size_t>(0), format_desc_.height, static_cast<size_t>(1), [&](size_t i)\r
115 //                      {\r
116 //                              int correctOffset = offset_;\r
117 //                              int dstIndex = i * format_desc_.width * 4;\r
118 //                              int srcIndex = (i * image_width_ + correctOffset) * 4;\r
119 //                      \r
120 //                              int stopOffset = std::min<int>(correctOffset + format_desc_ .width, image_width_);\r
121 //                              int size = (stopOffset - correctOffset) * 4;\r
122 //\r
123 //                              std::copy_n(&image_data[srcIndex], size, &frame_data[dstIndex]);\r
124 //                      });\r
125 //\r
126 //                      offset_ += delta_x;\r
127 //              }\r
128 //\r
129 //              return std::move(frame);\r
130 //      }\r
131 //              \r
132 //      safe_ptr<basic_frame> receive()\r
133 //      {               \r
134 //              if(format_desc_.mode != video_mode::progressive)                                \r
135 //              {\r
136 //                      basic_frame frame1;\r
137 //                      basic_frame frame2;\r
138 //                      tbb::parallel_invoke([&]{ frame1 = std::move(do_receive()); }, [&]{ frame2 = std::move(do_receive()); });\r
139 //                      return basic_frame::interlace(std::move(frame1), std::move(frame2), format_desc_.mode);\r
140 //              }                       \r
141 //\r
142 //              return receive();       \r
143 //      }\r
144 //      \r
145 //      void initialize(const safe_ptr<frame_factory>& frame_factory)\r
146 //      {\r
147 //              frame_factory_ = frame_factory;\r
148 //              format_desc_ = frame_factory_->get_video_format_desc();\r
149 //                              \r
150 //              if(image_width_ - format_desc_.width > image_height_ - format_desc_.height)\r
151 //                      direction_ = speed_ < 0 ? direction::Right : direction::Left;\r
152 //              else\r
153 //                      direction_ = speed_ < 0 ? direction::Down : direction::Up;\r
154 //\r
155 //              if (direction_ == direction::Down)\r
156 //                      offset_ = image_height_ - format_desc_.height;\r
157 //              else if (direction_ == direction::Right)\r
158 //                      offset_ = image_width_ - format_desc_.width;\r
159 //\r
160 //              speed_ = static_cast<int>(abs(static_cast<double>(speed_) / format_desc_.fps));\r
161 //              \r
162 //              load_and_pad_image(filename_);\r
163 //      }\r
164 //      \r
165 //\r
166 //      std::wstring print() const\r
167 //      {\r
168 //              return L"image_scroll_producer. filename: " + filename_;\r
169 //      }\r
170 //\r
171 //      const video_format_desc& get_video_format_desc() const { return format_desc_; } \r
172 //      \r
173 //      int image_width_;\r
174 //      int image_height_;\r
175 //      int speed_;\r
176 //      int offset_;\r
177 //      direction direction_;\r
178 //\r
179 //      tbb::atomic<bool> loop_;\r
180 //      std::shared_ptr<unsigned char> image_;\r
181 //      video_format_desc format_desc_;\r
182 //\r
183 //      std::wstring filename_;\r
184 //\r
185 //      safe_ptr<frame_mixer_device> frame_factory_;\r
186 //};\r
187 //\r
188 //safe_ptr<frame_producer> create_image_scroll_producer(const std::vector<std::wstring>& params)\r
189 //{\r
190 //      static const std::vector<std::wstring> extensions = list_of(L"spng")(L"stga")(L"sbmp")(L"sjpg")(L"sjpeg");\r
191 //      std::wstring filename = configuration::media_folder() + L"\\" + params[0];\r
192 //      \r
193 //      auto ext = std::find_if(extensions.begin(), extensions.end(), [&](const std::wstring& ex) -> bool\r
194 //              {                                       \r
195 //                      return boost::filesystem::is_regular_file(boost::filesystem::wpath(filename).replace_extension(ex));\r
196 //              });\r
197 //\r
198 //      if(ext == extensions.end())\r
199 //              return nullptr;\r
200 //\r
201 //      return std::make_shared<image_scroll_producer>(filename + L"." + *ext, params);\r
202 //}\r
203 //\r
204 //}}}