find_package(ImageMagick COMPONENTS Magick++)
IF(${ImageMagick_Magick++_FOUND}) add_subdirectory(imagemagick) ENDIF()
include_directories(${ImageMagick_Magick++_INCLUDE_DIR})
and change linking to this:
target_link_libraries(${MODULE} ${LIBNAME} ${ImageMagick_Magick++_LIBRARY})
#ifndef DUMMYMODULE_H_ #define DUMMYMODULE_H_ #include "yuri/io/BasicIOThread.h" namespace yuri { namespace imagemagick_module { using yuri::log::Log; using yuri::config::Parameter; using yuri::config::Parameters; using yuri::io::pThreadBase; class ImageMagickSource: public yuri::io::BasicIOThread { public: IO_THREAD_GENERATOR_DECLARATION static shared_ptr<Parameters> configure(); virtual ~ImageMagickSource(); private: ImageMagickSource(Log &log_,pThreadBase parent,Parameters ¶meters); virtual bool step(); virtual bool set_param(Parameter& param); }; } /* namespace dummy_module */ } /* namespace yuri */
The only difference between this and the DummyModule.h is (except for the name) that we removed the attribute dummy_name.
Not for the cpp file:
#include "ImageMagickSource.h" #include "yuri/config/RegisteredClass.h" #include "Magick++.h" #include <map> namespace yuri { namespace imagemagick_module { REGISTER("imagemagick_source",ImageMagickSource) IO_THREAD_GENERATOR(ImageMagickSource) using namespace yuri::io; shared_ptr<Parameters> ImageMagickSource::configure() { shared_ptr<Parameters> p = BasicIOThread::configure(); p->set_description("Image loader based on ImageMagick."); p->set_max_pipes(1,1); return p; } ImageMagickSource::ImageMagickSource(Log &log_,pThreadBase parent,Parameters ¶meters): BasicIOThread(log_,parent,1,1,std::string("ImageMagickSource")) { IO_THREAD_INIT("ImageMagickSource") } ImageMagickSource::~ImageMagickSource() { } bool ImageMagickSource::step() { pBasicFrame frame = in[0]->pop_frame(); if (!frame) return true; if (frame->get_planes_count()>1) { log[warning] << "Input frame has more than 1 plane, ignoring them\n"; } try { Magick::Blob blob(PLANE_RAW_DATA(frame,0),PLANE_SIZE(frame,0)); Magick::Image image(blob); image.modifyImage(); yuri::size_t width = image.columns(); yuri::size_t height = image.rows(); log[debug] << "Loaded image " << width << "x" <<height <<"\n"; pBasicFrame out_frame = allocate_empty_frame(YURI_FMT_RGB24,width,height); image.write(0,0,width,height,"RGB",Magick::CharPixel,PLANE_RAW_DATA(out_frame,0)); push_raw_video_frame(0,out_frame); } catch (std::exception& e) { log[error] << "Exception during decoding: " << e.what() << "\n"; } return true; } bool ImageMagickSource::set_param(Parameter& param) { return BasicIOThread::set_param(param); } } /* namespace dummy_module */ } /* namespace yuri */
The only relevant changes are in the step() method.
That's all, this is working code for imagemagick_source module! Look at the actual version in source distribution, there are some minor enhancements, but this was the first version.