1 #include "../../StdAfx.h"
\r
3 #include "image_producer.h"
\r
4 #include "image_loader.h"
\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
12 #include <boost/assign.hpp>
\r
14 using namespace boost::assign;
\r
16 namespace caspar { namespace core { namespace image{
\r
18 struct image_producer : public frame_producer
\r
20 image_producer(const std::wstring& filename, const frame_format_desc& format_desc) : format_desc_(format_desc), filename_(filename) {}
\r
25 factory_->release_frames(this);
\r
28 gpu_frame_ptr render_frame(){return frame_;}
\r
30 void initialize(const frame_factory_ptr& 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
36 bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Rescale(bitmap.get(), format_desc_.width, format_desc_.width, FILTER_BICUBIC), FreeImage_Unload);
\r
38 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
\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()), format_desc_.size);
\r
46 const frame_format_desc& get_frame_format_desc() const { return format_desc_; }
\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
54 frame_producer_ptr create_image_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)
\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