X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdecklink%2Fconsumer%2Fdecklink_consumer.cpp;h=7699f7fd846894dcb91150690de41776013fca30;hb=ef45ae47b4f50ef057041b5122d0f34c1659cc11;hp=601d875175c1a61da4864983787a1f73d062de1b;hpb=3374990d131089eb0e773c9281a274949352286e;p=casparcg diff --git a/modules/decklink/consumer/decklink_consumer.cpp b/modules/decklink/consumer/decklink_consumer.cpp index 601d87517..7699f7fd8 100644 --- a/modules/decklink/consumer/decklink_consumer.cpp +++ b/modules/decklink/consumer/decklink_consumer.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -64,29 +65,48 @@ struct configuration class decklink_frame : public IDeckLinkVideoFrame { - const safe_ptr frame_; - const core::video_format_desc format_desc_; + const std::shared_ptr frame_; + const core::video_format_desc format_desc_; + + bool key_only_; + std::vector> key_data_; public: - decklink_frame(const safe_ptr& frame, const core::video_format_desc& format_desc) + decklink_frame(const safe_ptr& frame, const core::video_format_desc& format_desc, bool key_only) : frame_(frame) - , format_desc_(format_desc){} + , format_desc_(format_desc) + , key_only_(key_only){} - STDMETHOD (QueryInterface(REFIID, LPVOID*)) {return E_NOINTERFACE;} - STDMETHOD_(ULONG, AddRef()) {return 1;} - STDMETHOD_(ULONG, Release()) {return 1;} - - STDMETHOD_(long, GetWidth()) {return format_desc_.width;} - STDMETHOD_(long, GetHeight()) {return format_desc_.height;} - STDMETHOD_(long, GetRowBytes()) {return format_desc_.width*4;} - STDMETHOD_(BMDPixelFormat, GetPixelFormat()){return bmdFormat8BitBGRA;} - STDMETHOD_(BMDFrameFlags, GetFlags()) {return bmdFrameFlagDefault;} + STDMETHOD (QueryInterface(REFIID, LPVOID*)) {return E_NOINTERFACE;} + STDMETHOD_(ULONG, AddRef()) {return 1;} + STDMETHOD_(ULONG, Release()) {return 1;} + + STDMETHOD_(long, GetWidth()) {return format_desc_.width;} + STDMETHOD_(long, GetHeight()) {return format_desc_.height;} + STDMETHOD_(long, GetRowBytes()) {return format_desc_.width*4;} + STDMETHOD_(BMDPixelFormat, GetPixelFormat()) {return bmdFormat8BitBGRA;} + STDMETHOD_(BMDFrameFlags, GetFlags()) {return bmdFrameFlagDefault;} STDMETHOD(GetBytes(void** buffer)) { static std::vector zeros(1920*1080*4, 0); - *buffer = const_cast(frame_->image_data().begin()); if(static_cast(frame_->image_data().size()) != format_desc_.size) + { *buffer = zeros.data(); + return S_OK; + } + + if(!key_only_) + *buffer = const_cast(frame_->image_data().begin()); + else + { + if(key_data_.empty()) + { + key_data_.resize(frame_->image_data().size()); + fast_memshfl(key_data_.data(), frame_->image_data().begin(), frame_->image_data().size(), 0x0F0F0F0F, 0x0B0B0B0B, 0x07070707, 0x03030303); + } + *buffer = key_data_.data(); + } + return S_OK; } @@ -96,7 +116,7 @@ public: struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLinkAudioOutputCallback, boost::noncopyable { - const configuration config_; + const configuration config_; CComPtr decklink_; CComQIPtr output_; @@ -349,7 +369,7 @@ public: void schedule_next_video(const safe_ptr& frame) { - frame_container_.push_back(std::make_shared(frame, format_desc_)); + frame_container_.push_back(std::make_shared(frame, format_desc_, config_.key_only)); if(FAILED(output_->ScheduleVideoFrame(frame_container_.back().get(), (frames_scheduled_++) * format_desc_.duration, format_desc_.duration, format_desc_.time_scale))) CASPAR_LOG(error) << print() << L" Failed to schedule video.";