]> git.sesse.net Git - casparcg/blob - core/producer/image/image_producer.cpp
2.0.0.2:
[casparcg] / core / producer / image / image_producer.cpp
1 #include "../../StdAfx.h"\r
2 \r
3 #include "image_producer.h"\r
4 #include "image_loader.h"\r
5 \r
6 #include "../../frame/frame_factory.h"\r
7 #include "../../frame/frame_format.h"\r
8 #include "../../server.h"\r
9 #include "../../../common/utility/find_file.h"\r
10 #include "../../../common/utility/memory.h"\r
11 \r
12 #include <boost/assign.hpp>\r
13 \r
14 using namespace boost::assign;\r
15 \r
16 namespace caspar { namespace core { namespace image{\r
17 \r
18 struct image_producer : public frame_producer\r
19 {\r
20         image_producer(const std::wstring& filename, const frame_format_desc& format_desc) : format_desc_(format_desc), filename_(filename)     {}\r
21 \r
22         ~image_producer()\r
23         {\r
24                 if(factory_)\r
25                         factory_->release_frames(this);\r
26         }\r
27 \r
28         gpu_frame_ptr get_frame(){return frame_;}\r
29 \r
30         void initialize(const frame_factory_ptr& factory)\r
31         {\r
32                 factory_ = factory;\r
33                 auto bitmap = load_image(filename_);\r
34                 if(FreeImage_GetWidth(bitmap.get()) != format_desc_.width || FreeImage_GetHeight(bitmap.get()) == format_desc_.height)\r
35                 {\r
36                         bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Rescale(bitmap.get(), format_desc_.width, format_desc_.width, FILTER_BICUBIC), FreeImage_Unload);\r
37                         if(!bitmap)\r
38                                 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));\r
39                 }\r
40 \r
41                 FreeImage_FlipVertical(bitmap.get());\r
42                 frame_ = factory->create_frame(format_desc_, this);\r
43                 common::aligned_parallel_memcpy(frame_->data(), FreeImage_GetBits(bitmap.get()), frame_->size());\r
44         }\r
45 \r
46         const frame_format_desc& get_frame_format_desc() const { return format_desc_; } \r
47 \r
48         frame_factory_ptr factory_;\r
49         std::wstring filename_;\r
50         frame_format_desc format_desc_;\r
51         gpu_frame_ptr frame_;\r
52 };\r
53 \r
54 frame_producer_ptr create_image_producer(const  std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
55 {\r
56         std::wstring filename = params[0];\r
57         std::wstring resultFilename = common::find_file(server::media_folder() + filename, list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg"));\r
58         if(!resultFilename.empty())\r
59                 return std::make_shared<image_producer>(resultFilename, format_desc);\r
60 \r
61         return nullptr;\r
62 }\r
63 \r
64 }}}