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
22 gpu_frame_ptr get_frame(){return frame_;}
\r
24 void initialize(const frame_factory_ptr& factory)
\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
29 bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Rescale(bitmap.get(), format_desc_.width, format_desc_.width, FILTER_BICUBIC), FreeImage_Unload);
\r
31 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));
\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
39 const frame_format_desc& get_frame_format_desc() const { return format_desc_; }
\r
41 std::wstring filename_;
\r
42 frame_format_desc format_desc_;
\r
43 gpu_frame_ptr frame_;
\r
46 frame_producer_ptr create_image_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)
\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