]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: - decklink: Fixed shutdown deadlock.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 26 Mar 2011 13:56:42 +0000 (13:56 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 26 Mar 2011 13:56:42 +0000 (13:56 +0000)
         - channel: Added preliminary SET MODE support.

git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@579 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/utility/tweener.h
core/channel.cpp
core/channel.h
modules/decklink/consumer/decklink_consumer.cpp
protocol/amcp/AMCPCommandsImpl.cpp
shell/caspar.config

index 7de2ed701419edbc21ec1725150d71dc1bda76cc..3ae1e6b2134a29f93f6267580e78c4e6b2508c0c 100644 (file)
@@ -357,6 +357,7 @@ inline tweener_t get_tweener(std::wstring name = L"linear")
        std::transform(name.begin(), name.end(), name.begin(), std::tolower);\r
 \r
        static const std::unordered_map<std::wstring, tweener_t> tweens = boost::assign::map_list_of    \r
+               (L"",                                   ease_none                  )    \r
                (L"linear",                             ease_none                  )    \r
                (L"easenone",                   ease_none                  )\r
                (L"easeinquad",                 ease_in_quad       )\r
@@ -403,7 +404,7 @@ inline tweener_t get_tweener(std::wstring name = L"linear")
        auto it = tweens.find(name);\r
        if(it == tweens.end())\r
        {\r
-               CASPAR_LOG(warning) << L" Invalid tween: " << name << L" fallback to \"linear\".";\r
+               CASPAR_LOG(warning) << L"Invalid tween: " << name << L" fallback to \"linear\".";\r
                it = tweens.find(L"linear");\r
        }\r
 \r
index a34abec802bec050e7e9bbb3658fbad1e3dcf3d3..e90510c86574be03357c8381dc8406a915657f1d 100644 (file)
@@ -57,6 +57,7 @@ frame_producer_device& channel::producer() { return *impl_->producer_;}
 frame_mixer_device& channel::mixer() { return *impl_->mixer_;} \r
 frame_consumer_device& channel::consumer() { return *impl_->consumer_;} \r
 const video_format_desc& channel::get_video_format_desc() const{return impl_->format_desc_;}\r
+void channel::set_video_format_desc(const video_format_desc& format_desc){impl_ = make_safe<implementation>(impl_->index_, format_desc);}\r
 std::wstring channel::print() const { return impl_->print();}\r
 \r
 }}
\ No newline at end of file
index ce895debfe9e9f4cc8679df5cf349060698201be..b416a6cb2aab8ea52caa194832ab7b647b069c95 100644 (file)
@@ -32,6 +32,7 @@ public:
        frame_consumer_device& consumer();\r
 \r
        const video_format_desc& get_video_format_desc() const;\r
+       void set_video_format_desc(const video_format_desc& format_desc);\r
 \r
        std::wstring print() const;\r
 \r
index c02721bfa527dd0cf056df85b04ca8206cea3acd..0976838e770101aa33be94623d959db2c7a7eb43 100644 (file)
@@ -64,6 +64,7 @@ struct decklink_output : public IDeckLinkVideoOutputCallback, public IDeckLinkAu
        const printer   parent_printer_;\r
        std::wstring    model_name_;\r
        const size_t    device_index_;\r
+       tbb::atomic<bool> is_running_;\r
 \r
        std::shared_ptr<diagnostics::graph> graph_;\r
        timer perf_timer_;\r
@@ -100,6 +101,7 @@ public:
                , audio_scheduled_(0)\r
                , format_desc_(format_desc)\r
        {\r
+               is_running_ = true;\r
                format_desc_ = format_desc;\r
                CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
                if(FAILED(pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator)))\r
@@ -195,7 +197,11 @@ public:
        }\r
 \r
        ~decklink_output()\r
-       {                       \r
+       {               \r
+               is_running_ = false;\r
+               video_frame_buffer_.try_push(core::read_frame::empty());\r
+               audio_frame_buffer_.try_push(core::read_frame::empty());\r
+\r
                if(output_ != nullptr) \r
                {\r
                        output_->StopScheduledPlayback(0, nullptr, 0);\r
@@ -212,9 +218,13 @@ public:
        \r
        virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted (IDeckLinkVideoFrame* /*completedFrame*/, BMDOutputFrameCompletionResult /*result*/)\r
        {\r
+               if(!is_running_)\r
+                       return S_OK;\r
+\r
                safe_ptr<const core::read_frame> frame;         \r
                video_frame_buffer_.pop(frame);         \r
                schedule_next_video(frame);\r
+\r
                return S_OK;\r
        }\r
 \r
@@ -225,9 +235,13 @@ public:
                \r
        virtual HRESULT STDMETHODCALLTYPE RenderAudioSamples (BOOL /*preroll*/)\r
        {\r
+               if(!is_running_)\r
+                       return S_OK;\r
+\r
                safe_ptr<const core::read_frame> frame;\r
                audio_frame_buffer_.pop(frame);\r
                schedule_next_audio(frame);\r
+\r
                return S_OK;\r
        }\r
 \r
index e07002da3c4e4d22798c503f1de09023c9379f1c..a8df18ae0c76559827c51b8c168edf17db2a8368 100644 (file)
@@ -1137,10 +1137,14 @@ bool SetCommand::DoExecute()
 \r
        if(name == TEXT("MODE"))\r
        {\r
-               //if(this->GetChannel()->consumer().SetVideoFormat(value)) TODO\r
-               //      this->SetReplyString(TEXT("202 SET MODE OK\r\n"));\r
-               //else\r
-                       this->SetReplyString(TEXT("501 SET MODE FAILED\r\n"));\r
+               auto format_desc = core::video_format_desc::get(value);\r
+               if(format_desc.format != core::video_format::invalid)\r
+               {\r
+                       GetChannel()->set_video_format_desc(format_desc);\r
+                       SetReplyString(TEXT("202 SET MODE OK\r\n"));\r
+               }\r
+               else\r
+                       SetReplyString(TEXT("501 SET MODE FAILED\r\n"));\r
        }\r
        else\r
        {\r
index b518723582a00351950636de759cdaf1279e36ce..ca35444b6afa5321d1d6137dcefaeeae188699a9 100644 (file)
           <windowed>true</windowed>\r
         </ogl>\r
         <audio/>\r
-        <!--decklink>\r
+        <decklink>\r
           <device>1</device>\r
           <embedded-audio>true</embedded-audio>\r
           <internal-key>false</internal-key>\r
-        </decklink-->\r
+        </decklink>\r
         <!--<bluefish>\r
           <device>1</device>\r
           <embedded-audio>false</embedded-audio>\r