]> 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         gpu_frame_ptr get_frame(){return frame_;}\r
23 \r
24         void initialize(const frame_factory_ptr& factory)\r
25         {\r
26                 auto bitmap = load_image(filename_);\r
27                 if(FreeImage_GetWidth(bitmap.get()) != format_desc_.width || FreeImage_GetHeight(bitmap.get()) == format_desc_.height)\r
28                 {\r
29                         bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Rescale(bitmap.get(), format_desc_.width, format_desc_.width, FILTER_BICUBIC), FreeImage_Unload);\r
30                         if(!bitmap)\r
31                                 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));\r
32                 }\r
33 \r
34                 FreeImage_FlipVertical(bitmap.get());\r
35                 frame_ = factory->create_frame(format_desc_);\r
36                 common::aligned_memcpy(frame_->data(), FreeImage_GetBits(bitmap.get()), frame_->size());\r
37         }\r
38 \r
39         const frame_format_desc& get_frame_format_desc() const { return format_desc_; } \r
40 \r
41         std::wstring filename_;\r
42         frame_format_desc format_desc_;\r
43         gpu_frame_ptr frame_;\r
44 };\r
45 \r
46 frame_producer_ptr create_image_producer(const  std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
47 {\r
48         std::wstring filename = params[0];\r
49         std::wstring resultFilename = common::find_file(server::media_folder() + filename, list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg"));\r
50         if(!resultFilename.empty())\r
51                 return std::make_shared<image_producer>(resultFilename, format_desc);\r
52 \r
53         return nullptr;\r
54 }\r
55 \r
56 }}}