From: ronag Date: Sat, 3 Sep 2011 13:41:45 +0000 (+0000) Subject: 2.0. decklink_producer: Fixed audio regression bug. Improved params. Added nb_frames... X-Git-Tag: 2.0.1~26 X-Git-Url: https://git.sesse.net/?p=casparcg;a=commitdiff_plain;h=bb129b7e3c7537ed6b1c2183cd69479c3d5496da 2.0. decklink_producer: Fixed audio regression bug. Improved params. Added nb_frames through LENGTH param. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1331 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- diff --git a/modules/decklink/producer/decklink_producer.cpp b/modules/decklink/producer/decklink_producer.cpp index f57347966..420256641 100644 --- a/modules/decklink/producer/decklink_producer.cpp +++ b/modules/decklink/producer/decklink_producer.cpp @@ -124,7 +124,7 @@ public: << msg_info(narrow(print()) + " Could not enable video input.") << boost::errinfo_api_function("EnableVideoInput")); - if(FAILED(input_->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType32bitInteger, 2))) + if(FAILED(input_->EnableAudioInput(bmdAudioSampleRate48kHz, bmdAudioSampleType32bitInteger, format_desc_.audio_channels))) BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Could not enable audio input.") << boost::errinfo_api_function("EnableAudioInput")); @@ -195,7 +195,7 @@ public: { auto sample_frame_count = audio->GetSampleFrameCount(); auto audio_data = reinterpret_cast(bytes); - muxer_.push(std::make_shared(audio_data, audio_data + sample_frame_count*sizeof(int32_t))); + muxer_.push(std::make_shared(audio_data, audio_data + sample_frame_count*format_desc_.audio_channels)); } else muxer_.push(std::make_shared(frame_factory_->get_video_format_desc().audio_samples_per_frame, 0)); @@ -241,16 +241,25 @@ public: class decklink_producer_proxy : public core::frame_producer { - safe_ptr last_frame_; - com_context context_; + safe_ptr last_frame_; + com_context context_; + const int64_t length_; public: - explicit decklink_producer_proxy(const safe_ptr& frame_factory, const core::video_format_desc& format_desc, size_t device_index, const std::wstring& filter_str = L"") + explicit decklink_producer_proxy(const safe_ptr& frame_factory, const core::video_format_desc& format_desc, size_t device_index, const std::wstring& filter_str, int64_t length) : context_(L"decklink_producer[" + boost::lexical_cast(device_index) + L"]") , last_frame_(core::basic_frame::empty()) + , length_(length) { context_.reset([&]{return new decklink_producer(format_desc, device_index, frame_factory, filter_str);}); } + + ~decklink_producer_proxy() + { + auto str = print(); + context_.reset(); + CASPAR_LOG(info) << str << L" Successfully Uninitialized."; + } virtual safe_ptr receive(int) { @@ -265,6 +274,11 @@ public: return disable_audio(last_frame_); } + virtual int64_t nb_frames() const + { + return length_; + } + std::wstring print() const { return context_->print(); @@ -276,28 +290,19 @@ safe_ptr create_decklink_producer(const safe_ptr 1) - device_index = lexical_cast_or_default(params[1], 1); - - core::video_format_desc format_desc = core::video_format_desc::get(L"PAL"); - if(params.size() > 2) - { - auto desc = core::video_format_desc::get(params[2]); - if(desc.format != core::video_format::invalid) - format_desc = desc; - } + auto device_index = core::get_param(L"DEVICE", params, 1); + auto filter_str = core::get_param(L"FILTER", params, L""); + auto length = core::get_param(L"LENGTH", params, std::numeric_limits::max()); - std::wstring filter_str = L""; + boost::replace_all(filter_str, L"DEINTERLACE", L"YADIF=0:-1"); + boost::replace_all(filter_str, L"DEINTERLACE_BOB", L"YADIF=1:-1"); - auto filter_it = std::find(params.begin(), params.end(), L"FILTER"); - if(filter_it != params.end()) - { - if(++filter_it != params.end()) - filter_str = *filter_it; - } + auto format_desc = core::video_format_desc::get(core::get_param(L"FORMAT", params, L"INVALID")); - return make_safe(frame_factory, format_desc, device_index, filter_str); + if(format_desc.format == core::video_format::invalid) + format_desc = frame_factory->get_video_format_desc(); + + return make_safe(frame_factory, format_desc, device_index, filter_str, length); } } \ No newline at end of file