]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 20 Jan 2011 08:01:43 +0000 (08:01 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 20 Jan 2011 08:01:43 +0000 (08:01 +0000)
core/producer/color/color_producer.cpp
core/producer/decklink/decklink_producer.cpp
core/producer/ffmpeg/ffmpeg_producer.cpp
core/producer/flash/flash_producer.cpp
core/producer/frame_producer_device.cpp
core/producer/transition/transition_producer.cpp

index b82a49eee10b46ca7567b76c527b3b1296895b37..3e131713d50a48797226aee150f63fee59ac3e4d 100644 (file)
@@ -40,8 +40,6 @@ public:
                if(color.length() != 9 || color[0] != '#')\r
                        BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("color") << arg_value_info(narrow(color)) << msg_info("Invalid color code"));\r
        }\r
-       \r
-       virtual safe_ptr<draw_frame> receive() { return frame_; }\r
 \r
        virtual void initialize(const safe_ptr<frame_factory>& frame_factory)\r
        {\r
@@ -52,6 +50,8 @@ public:
                frame_ = std::move(frame);\r
        }\r
        \r
+       virtual safe_ptr<draw_frame> receive() { return frame_; }\r
+       \r
        virtual std::wstring print() const { return + L"color[" + color_str_ + L"]"; }\r
 };\r
 \r
index 9be90964fba2e38ed12faa69a89f5fba991d60d7..2f4cf80562ccf127fea84a8e7250e7ac5b0714ec 100644 (file)
@@ -59,6 +59,7 @@ class decklink_input : public IDeckLinkInputCallback
 \r
        CComPtr<IDeckLink>                      decklink_;\r
        CComQIPtr<IDeckLinkInput>       input_;\r
+       IDeckLinkDisplayMode*           d_mode_;\r
 \r
        std::shared_ptr<frame_factory> frame_factory_;\r
 \r
@@ -68,9 +69,8 @@ class decklink_input : public IDeckLinkInputCallback
 \r
 public:\r
 \r
-       decklink_input(size_t device_index, const video_format_desc& format_desc, const std::shared_ptr<frame_factory>& frame_factory)\r
+       decklink_input(const video_format_desc& format_desc, size_t device_index, const std::shared_ptr<frame_factory>& frame_factory)\r
                : device_index_(device_index)\r
-               , format_desc_(format_desc)\r
                , frame_factory_(frame_factory)\r
                , head_(draw_frame::empty())\r
                , tail_(draw_frame::empty())\r
@@ -94,10 +94,14 @@ public:
                if(pModelName != nullptr)\r
                        CASPAR_LOG(info) << "decklink_producer: Modelname: " << pModelName;\r
                \r
-               unsigned long decklinkVideoFormat = GetDecklinkVideoFormat(format_desc_.format);\r
+               unsigned long decklinkVideoFormat = GetDecklinkVideoFormat(format_desc.format);\r
                if(decklinkVideoFormat == ULONG_MAX) \r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("decklink_producer: Card does not support requested videoformat."));\r
 \r
+               d_mode_ = get_display_mode((BMDDisplayMode)decklinkVideoFormat);\r
+               if(d_mode_ == nullptr) \r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("decklink_producer: Card does not support requested videoformat."));\r
+\r
                BMDDisplayModeSupport displayModeSupport;\r
                if(FAILED(input_->DoesSupportVideoMode((BMDDisplayMode)decklinkVideoFormat, bmdFormat8BitYUV, &displayModeSupport)))\r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("decklink_producer: Card does not support requested videoformat."));\r
@@ -128,8 +132,9 @@ 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
+               d_mode_ = newDisplayMode;\r
                return S_OK;\r
        }\r
 \r
@@ -145,13 +150,13 @@ public:
 \r
                pixel_format_desc desc;\r
                desc.pix_fmt = pixel_format::ycbcr;\r
-               desc.planes.push_back(pixel_format_desc::plane(format_desc_.width,   format_desc_.height, 1));\r
-               desc.planes.push_back(pixel_format_desc::plane(format_desc_.width/2, format_desc_.height, 1));\r
-               desc.planes.push_back(pixel_format_desc::plane(format_desc_.width/2, format_desc_.height, 1));                  \r
+               desc.planes.push_back(pixel_format_desc::plane(d_mode_->GetWidth(),   d_mode_->GetHeight(), 1));\r
+               desc.planes.push_back(pixel_format_desc::plane(d_mode_->GetWidth()/2, d_mode_->GetHeight(), 1));\r
+               desc.planes.push_back(pixel_format_desc::plane(d_mode_->GetWidth()/2, d_mode_->GetHeight(), 1));                        \r
                auto frame = frame_factory_->create_frame(desc);\r
 \r
                unsigned char* data = reinterpret_cast<unsigned char*>(bytes);\r
-               int frame_size = (format_desc_.width * 16 / 8) * format_desc_.height;\r
+               int frame_size = (d_mode_->GetWidth() * 16 / 8) * d_mode_->GetHeight();\r
 \r
                // Convert to planar YUV422\r
                unsigned char* y  = frame->image_data(0).begin();\r
@@ -175,6 +180,22 @@ public:
                return S_OK;\r
        }\r
 \r
+       IDeckLinkDisplayMode* get_display_mode(BMDDisplayMode mode)\r
+       {       \r
+               CComPtr<IDeckLinkDisplayModeIterator>   iterator;\r
+               IDeckLinkDisplayMode*                                   d_mode;\r
+       \r
+               if (input_->GetDisplayModeIterator(&iterator) != S_OK)\r
+                       return nullptr;\r
+\r
+               while (iterator->Next(&d_mode) == S_OK)\r
+               {\r
+                       if(d_mode->GetDisplayMode() == mode)\r
+                               return d_mode;\r
+               }\r
+               return nullptr;\r
+       }\r
+\r
        safe_ptr<draw_frame> get_frame()\r
        {\r
                frame_buffer_.try_pop(tail_);\r
@@ -188,16 +209,16 @@ class decklink_producer : public frame_producer
 {\r
        executor executor_;\r
        \r
-       const video_format_desc format_desc_;\r
        const size_t device_index_;\r
 \r
        std::unique_ptr<decklink_input> input_;\r
-               \r
+       \r
+       const video_format_desc format_desc_;\r
 public:\r
 \r
-       explicit decklink_producer(const video_format_desc format_desc, size_t device_index)\r
-               : device_index_(device_index)\r
-               , format_desc_(format_desc){}\r
+       explicit decklink_producer(const video_format_desc& format_desc, size_t device_index)\r
+               : format_desc_(format_desc) \r
+               , device_index_(device_index){}\r
 \r
        ~decklink_producer()\r
        {       \r
@@ -206,21 +227,21 @@ public:
                        input_ = nullptr;\r
                });\r
        }\r
-       \r
-       virtual safe_ptr<draw_frame> receive()\r
-       {\r
-               return input_->get_frame();\r
-       }\r
 \r
        virtual void initialize(const safe_ptr<frame_factory>& frame_factory)\r
        {\r
                executor_.start();\r
                executor_.invoke([=]\r
                {\r
-                       input_.reset(new decklink_input(device_index_, format_desc_, frame_factory));\r
+                       input_.reset(new decklink_input(format_desc_, device_index_, frame_factory));\r
                });\r
        }\r
        \r
+       virtual safe_ptr<draw_frame> receive()\r
+       {\r
+               return input_->get_frame();\r
+       }\r
+       \r
        virtual std::wstring print() const { return + L"decklink"; }\r
 };\r
 \r
index 1b66316ffbed44bd522ed8e64dfb7a0084a04c4c..0ddb9a31cf60337ac1f6ce6e90795741c21168f5 100644 (file)
@@ -33,8 +33,6 @@ struct ffmpeg_producer : public frame_producer
        \r
        safe_ptr<draw_frame>                            last_frame_;\r
 \r
-       video_format_desc                                       format_desc_;\r
-\r
 public:\r
        explicit ffmpeg_producer(const std::wstring& filename, bool loop) \r
                : filename_(filename)\r
@@ -45,7 +43,6 @@ public:
 \r
        virtual void initialize(const safe_ptr<frame_factory>& frame_factory)\r
        {\r
-               format_desc_ = frame_factory->get_video_format_desc();\r
                video_decoder_.initialize(frame_factory);\r
        }\r
                \r
index c70f455f637c0186d6bdfdb8e1947fa6432d0a3c..48391d9f656abe0f296f3003d8d6552973636e41 100644 (file)
@@ -191,6 +191,14 @@ struct flash_producer::implementation
                        renderer_ = nullptr;\r
                });\r
        }\r
+       \r
+       virtual void initialize(const safe_ptr<frame_factory>& frame_factory)\r
+       {\r
+               frame_factory_ = frame_factory;\r
+               frame_buffer_.set_capacity(static_cast<size_t>(frame_factory->get_video_format_desc().fps/2.0));\r
+               while(frame_buffer_.try_push(draw_frame::empty())){}\r
+               executor_.start();\r
+       }\r
 \r
        virtual safe_ptr<draw_frame> receive()\r
        {               \r
@@ -219,14 +227,6 @@ struct flash_producer::implementation
                return tail_;\r
        }\r
        \r
-       virtual void initialize(const safe_ptr<frame_factory>& frame_factory)\r
-       {\r
-               frame_factory_ = frame_factory;\r
-               frame_buffer_.set_capacity(static_cast<size_t>(frame_factory->get_video_format_desc().fps/2.0));\r
-               while(frame_buffer_.try_push(draw_frame::empty())){}\r
-               executor_.start();\r
-       }\r
-       \r
        void param(const std::wstring& param) \r
        {       \r
                executor_.begin_invoke([=]\r
index 72d280f8bf1432187ea3cf1bd20738d151f02c7d..6084c9aac7a834cd0a1aa86b63b3e68d3a570ae8 100644 (file)
@@ -160,7 +160,7 @@ public:
 \r
        void swap_output(frame_producer_device& other)\r
        {\r
-               tbb::spin_mutex::scoped_lock lock1(output_mutex_);              \r
+               tbb::spin_mutex::scoped_lock lock1(output_mutex_);\r
                tbb::spin_mutex::scoped_lock lock2(other.impl_->output_mutex_);\r
                output_.swap(other.impl_->output_);\r
        }\r
index d0e89e31e04b8eaa1c578062c3afd59c47977dcc..83db4452d0e9903479e0970a0831f929f5f53ac4 100644 (file)
@@ -47,7 +47,13 @@ struct transition_producer::implementation : boost::noncopyable
                , info_(info)\r
                , dest_producer_(dest)\r
                , source_producer_(frame_producer::empty()){}\r
-               \r
+                               \r
+       void initialize(const safe_ptr<frame_factory>& frame_factory)\r
+       {\r
+               dest_producer_->initialize(frame_factory);\r
+               frame_factory_ = frame_factory;\r
+       }\r
+\r
        safe_ptr<frame_producer> get_following_producer() const\r
        {\r
                return dest_producer_;\r
@@ -148,12 +154,6 @@ struct transition_producer::implementation : boost::noncopyable
 \r
                return draw_frame(std::move(my_src_frame), std::move(my_dest_frame));\r
        }\r
-               \r
-       void initialize(const safe_ptr<frame_factory>& frame_factory)\r
-       {\r
-               dest_producer_->initialize(frame_factory);\r
-               frame_factory_ = frame_factory;\r
-       }\r
 \r
        std::wstring print() const\r
        {\r