]> git.sesse.net Git - casparcg/commitdiff
decklink_producer: Fixed a problem with audio-cadence checking when running producer...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 7 Feb 2012 17:35:58 +0000 (17:35 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Tue, 7 Feb 2012 17:35:58 +0000 (17:35 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@2291 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/decklink/producer/decklink_producer.cpp

index e4c8d9c8b9ea33183dbcf0772437ff322cd09625..fe088040aa778ee2ea9066c5fd28ebe9fbbaff33 100644 (file)
@@ -79,40 +79,43 @@ namespace caspar { namespace decklink {
                \r
 class decklink_producer : boost::noncopyable, public IDeckLinkInputCallback\r
 {      \r
+       safe_ptr<diagnostics::graph>                                                            graph_;\r
+       boost::timer                                                                                            tick_timer_;\r
+       boost::timer                                                                                            frame_timer_;\r
+\r
        CComPtr<IDeckLink>                                                                                      decklink_;\r
        CComQIPtr<IDeckLinkInput>                                                                       input_;\r
+       CComQIPtr<IDeckLinkAttributes >                                                         attributes_;\r
        \r
        const std::wstring                                                                                      model_name_;\r
-       const core::video_format_desc                                                           format_desc_;\r
        const size_t                                                                                            device_index_;\r
-\r
-       safe_ptr<diagnostics::graph>                                                            graph_;\r
-       boost::timer                                                                                            tick_timer_;\r
-       boost::timer                                                                                            frame_timer_;\r
-               \r
+       const std::wstring                                                                                      filter_;\r
+       \r
+       core::video_format_desc                                                                         format_desc_;\r
+       std::vector<size_t>                                                                                     audio_cadence_;\r
+       boost::circular_buffer<size_t>                                                          sync_buffer_;\r
+       ffmpeg::frame_muxer                                                                                     muxer_;\r
+                       \r
        tbb::atomic<int>                                                                                        hints_;\r
        safe_ptr<core::frame_factory>                                                           frame_factory_;\r
-       std::vector<size_t>                                                                                     audio_cadence_;\r
 \r
        tbb::concurrent_bounded_queue<safe_ptr<core::basic_frame>>      frame_buffer_;\r
 \r
-       std::exception_ptr                                                                                      exception_;\r
-               \r
-       ffmpeg::frame_muxer                                                                                     muxer_;\r
-\r
-       boost::circular_buffer<size_t>                                                          sync_buffer_;\r
+       std::exception_ptr                                                                                      exception_;             \r
 \r
 public:\r
        decklink_producer(const core::video_format_desc& format_desc, size_t device_index, const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filter)\r
                : decklink_(get_device(device_index))\r
                , input_(decklink_)\r
+               , attributes_(decklink_)\r
                , model_name_(get_model_name(decklink_))\r
-               , format_desc_(format_desc)\r
                , device_index_(device_index)\r
-               , frame_factory_(frame_factory)\r
-               , audio_cadence_(frame_factory->get_video_format_desc().audio_cadence)\r
+               , filter_(filter)\r
+               , format_desc_(format_desc)\r
+               , audio_cadence_(format_desc.audio_cadence)\r
                , muxer_(format_desc.fps, frame_factory, filter)\r
                , sync_buffer_(format_desc.audio_cadence.size())\r
+               , frame_factory_(frame_factory)\r
        {               \r
                hints_ = 0;\r
                frame_buffer_.set_capacity(2);\r
@@ -126,9 +129,9 @@ public:
                diagnostics::register_graph(graph_);\r
                \r
                auto display_mode = get_display_mode(input_, format_desc_.format, bmdFormat8BitYUV, bmdVideoInputFlagDefault);\r
-               \r
+                               \r
                // NOTE: bmdFormat8BitARGB is currently not supported by any decklink card. (2011-05-08)\r
-               if(FAILED(input_->EnableVideoInput(display_mode, bmdFormat8BitYUV, 0))) \r
+               if(FAILED(input_->EnableVideoInput(display_mode, bmdFormat8BitYUV, bmdVideoInputFlagDefault))) \r
                        BOOST_THROW_EXCEPTION(caspar_exception() \r
                                                                        << msg_info(narrow(print()) + " Could not enable video input.")\r
                                                                        << boost::errinfo_api_function("EnableVideoInput"));\r
@@ -162,7 +165,7 @@ public:
        virtual ULONG STDMETHODCALLTYPE         AddRef ()                                                       {return 1;}\r
        virtual ULONG STDMETHODCALLTYPE         Release ()                                                      {return 1;}\r
                \r
-       virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents /*notificationEvents*/, IDeckLinkDisplayMode* newDisplayMode, BMDDetectedVideoInputFormatFlags /*detectedSignalFlags*/)\r
+       virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents notificationEvents, IDeckLinkDisplayMode* newDisplayMode, BMDDetectedVideoInputFormatFlags /*detectedSignalFlags*/)\r
        {\r
                return S_OK;\r
        }\r
@@ -260,7 +263,7 @@ public:
        \r
        std::wstring print() const\r
        {\r
-               return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"]";\r
+               return model_name_ + L" [" + boost::lexical_cast<std::wstring>(device_index_) + L"|" + format_desc_.name + L"]";\r
        }\r
 };\r
        \r
@@ -317,7 +320,9 @@ safe_ptr<core::frame_producer> create_producer(const safe_ptr<core::frame_factor
        if(params.empty() || !boost::iequals(params[0], "decklink"))\r
                return core::frame_producer::empty();\r
 \r
-       auto device_index       = get_param(L"DEVICE", params, 1);\r
+       auto device_index       = get_param(L"DEVICE", params, -1);\r
+       if(device_index == -1)\r
+               device_index = boost::lexical_cast<int>(params.at(1));\r
        auto filter_str         = get_param(L"FILTER", params);         \r
        auto length                     = get_param(L"LENGTH", params, std::numeric_limits<uint32_t>::max());   \r
        auto format_desc        = core::video_format_desc::get(get_param(L"FORMAT", params, L"INVALID"));\r