X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=core%2Fproducer%2Fcolor%2Fcolor_producer.cpp;h=75a621dc96dee7535c388b576ad9cb73be29a566;hb=abb09c14ed54439162869c71be4832b681dc1120;hp=f91c1072783dd4af92c8ad9105a6007324386b7e;hpb=5bee5deb850c0744be543105f04e880012b6012a;p=casparcg diff --git a/core/producer/color/color_producer.cpp b/core/producer/color/color_producer.cpp index f91c10727..75a621dc9 100644 --- a/core/producer/color/color_producer.cpp +++ b/core/producer/color/color_producer.cpp @@ -23,11 +23,15 @@ #include "color_producer.h" -#include "../frame/basic_frame.h" -#include "../frame/frame_factory.h" -#include "../../mixer/write_frame.h" +#include +#include +#include +#include +#include +#include -#include +#include +#include #include @@ -35,41 +39,57 @@ namespace caspar { namespace core { -class color_producer : public frame_producer +class color_producer : public frame_producer_impl { - safe_ptr frame_; - const std::wstring color_str_; + monitor::basic_subject event_subject_; + + draw_frame frame_; + const std::wstring color_str_; public: - explicit color_producer(const safe_ptr& frame_factory, const std::wstring& color) + explicit color_producer(const spl::shared_ptr& frame_factory, const std::wstring& color) : color_str_(color) , frame_(create_color_frame(this, frame_factory, color)) - {} + { + CASPAR_LOG(info) << print() << L" Initialized"; + } // frame_producer - virtual safe_ptr receive(int) override + draw_frame receive_impl() override { - return frame_; - } + event_subject_ << monitor::event("color") % color_str_; - virtual safe_ptr last_frame() const override - { - return frame_; + return frame_; } - - virtual std::wstring print() const override + + std::wstring print() const override { return L"color[" + color_str_ + L"]"; } + std::wstring name() const override + { + return L"color"; + } + boost::property_tree::wptree info() const override { boost::property_tree::wptree info; - info.add(L"type", L"color-producer"); + info.add(L"type", L"color"); info.add(L"color", color_str_); return info; } + + void subscribe(const monitor::observable::observer_ptr& o) override + { + return event_subject_.subscribe(o); + } + + void unsubscribe(const monitor::observable::observer_ptr& o) override + { + return event_subject_.unsubscribe(o); + } }; std::wstring get_hex_color(const std::wstring& str) @@ -113,7 +133,7 @@ std::wstring get_hex_color(const std::wstring& str) return str; } -safe_ptr create_color_producer(const safe_ptr& frame_factory, const std::vector& params) +spl::shared_ptr create_color_producer(const spl::shared_ptr& frame_factory, const std::vector& params) { if(params.size() < 0) return core::frame_producer::empty(); @@ -122,29 +142,27 @@ safe_ptr create_color_producer(const safe_ptr(frame_factory, color2); + return spl::make_shared(frame_factory, color2); } -safe_ptr create_color_frame(void* tag, const safe_ptr& frame_factory, const std::wstring& color) + +draw_frame create_color_frame(void* tag, const spl::shared_ptr& frame_factory, const std::wstring& color) { auto color2 = get_hex_color(color); if(color2.length() != 9 || color2[0] != '#') - BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color2)) << msg_info("Invalid color.")); + BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(color2) << msg_info("Invalid color.")); - core::pixel_format_desc desc; - desc.pix_fmt = pixel_format::bgra; + core::pixel_format_desc desc(pixel_format::bgra); desc.planes.push_back(core::pixel_format_desc::plane(1, 1, 4)); auto frame = frame_factory->create_frame(tag, desc); // Read color from hex-string and write to frame pixel. - auto& value = *reinterpret_cast(frame->image_data().begin()); + auto& value = *reinterpret_cast(frame.image_data(0).begin()); std::wstringstream str(color2.substr(1)); if(!(str >> std::hex >> value) || !str.eof()) - BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color2)) << msg_info("Invalid color.")); - - frame->commit(); - - return frame; + BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(color2) << msg_info("Invalid color.")); + + return core::draw_frame(std::move(frame)); } }} \ No newline at end of file