]> 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>
Sat, 29 Oct 2011 12:23:20 +0000 (12:23 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sat, 29 Oct 2011 12:23:20 +0000 (12:23 +0000)
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp

index 0367bb6cceaaa9d8d9cff0c8024f6c15d5e7454d..fa3a94cb9b763f22406a720b93ba0a93df1539a0 100644 (file)
@@ -50,18 +50,15 @@ using namespace Concurrency;
 \r
 namespace caspar { namespace bluefish { \r
                        \r
-struct bluefish_consumer : public Concurrency::agent, boost::noncopyable\r
+struct bluefish_consumer : boost::noncopyable\r
 {\r
-       unbounded_buffer<safe_ptr<core::read_frame>> frames_;\r
-       overwrite_buffer<std::exception_ptr>            exception_;\r
-\r
-       safe_ptr<CBlueVelvet4>                                          blue_;\r
+       const safe_ptr<CBlueVelvet4>                            blue_;\r
        const unsigned int                                                      device_index_;\r
        const core::video_format_desc                           format_desc_;\r
 \r
        const std::wstring                                                      model_name_;\r
 \r
-       safe_ptr<diagnostics::graph>                            graph_;\r
+       const safe_ptr<diagnostics::graph>                      graph_;\r
        boost::timer                                                            frame_timer_;\r
        boost::timer                                                            tick_timer_;\r
        boost::timer                                                            sync_timer_;    \r
@@ -72,9 +69,6 @@ struct bluefish_consumer : public Concurrency::agent, boost::noncopyable
        \r
        const bool                                                                      embedded_audio_;\r
        const bool                                                                      key_only_;\r
-       \r
-       governor                                                                        governor_;\r
-       tbb::atomic<bool>                                                       is_running_;\r
 public:\r
        bluefish_consumer(const core::video_format_desc& format_desc, unsigned int device_index, bool embedded_audio, bool key_only) \r
                : blue_(create_blue(device_index))\r
@@ -84,14 +78,12 @@ public:
                , vid_fmt_(get_video_mode(*blue_, format_desc))\r
                , embedded_audio_(embedded_audio)\r
                , key_only_(key_only)\r
-               , governor_(1)\r
        {\r
                graph_->add_guide("tick-time", 0.5);\r
                graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f));   \r
                graph_->add_guide("frame-time", 0.5f);  \r
                graph_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
-               graph_->set_color("sync-time", diagnostics::color(0.5f, 1.0f, 0.2f));\r
-               graph_->set_color("input-buffer", diagnostics::color(1.0f, 1.0f, 0.0f));\r
+               graph_->set_color("sync-time", diagnostics::color(1.0f, 0.3f, 0.5f));\r
                graph_->set_text(print());\r
                diagnostics::register_graph(graph_);\r
                        \r
@@ -162,18 +154,12 @@ public:
                {\r
                        return std::make_shared<blue_dma_buffer>(format_desc_.size, n++);\r
                });\r
-\r
-               is_running_ = true;\r
-               start();\r
-                                                               \r
+                                                                               \r
                CASPAR_LOG(info) << print() << L" Successfully Initialized.";\r
        }\r
 \r
        ~bluefish_consumer()\r
        {\r
-               is_running_ = false;\r
-               governor_.cancel();\r
-               agent::wait(this);\r
                try\r
                {                       \r
                        disable_video_output();\r
@@ -206,99 +192,76 @@ public:
        \r
        void send(const safe_ptr<core::read_frame>& frame)\r
        {       \r
-               if(exception_.has_value())\r
-                       std::rethrow_exception(exception_.value());\r
-\r
-               auto ticket = governor_.acquire();\r
-               Concurrency::send(frames_, safe_ptr<core::read_frame>(frame.get(), [frame, ticket](core::read_frame*){}));\r
-       }\r
-       \r
-       virtual void run()\r
-       {\r
                static std::vector<int16_t> silence(MAX_HANC_BUFFER_SIZE, 0);\r
-               \r
-               try\r
-               {\r
-                       while(is_running_)\r
-                       {\r
-                               auto frame = receive(frames_);\r
 \r
-                               const size_t audio_samples       = format_desc_.audio_samples_per_frame;\r
-                               const size_t audio_nchannels = format_desc_.audio_channels;\r
+               const size_t audio_samples       = format_desc_.audio_samples_per_frame;\r
+               const size_t audio_nchannels = format_desc_.audio_channels;\r
 \r
-                               frame_timer_.restart();\r
+               frame_timer_.restart();\r
                                \r
-                               // Copy to local buffers\r
-\r
-                               if(!frame->image_data().empty())\r
-                               {\r
-                                       if(key_only_)                                           \r
-                                               fast_memshfl(reserved_frames_.front()->image_data(), frame->image_data().begin(), frame->image_data().size(), 0x0F0F0F0F, 0x0B0B0B0B, 0x07070707, 0x03030303);\r
-                                       else\r
-                                               fast_memcpy(reserved_frames_.front()->image_data(), frame->image_data().begin(), frame->image_data().size());\r
-                               }\r
-                               else\r
-                                       fast_memclr(reserved_frames_.front()->image_data(), reserved_frames_.front()->image_size());\r
+               // Copy to local buffers\r
+\r
+               if(!frame->image_data().empty())\r
+               {\r
+                       if(key_only_)                                           \r
+                               fast_memshfl(reserved_frames_.front()->image_data(), frame->image_data().begin(), frame->image_data().size(), 0x0F0F0F0F, 0x0B0B0B0B, 0x07070707, 0x03030303);\r
+                       else\r
+                               fast_memcpy(reserved_frames_.front()->image_data(), frame->image_data().begin(), frame->image_data().size());\r
+               }\r
+               else\r
+                       fast_memclr(reserved_frames_.front()->image_data(), reserved_frames_.front()->image_size());\r
                                                                \r
-                               // Sync\r
+               // Sync\r
 \r
-                               sync_timer_.restart();\r
-                               unsigned long n_field = 0;\r
-                               {\r
-                                       scoped_oversubcription_token oversubscribe;\r
-                                       blue_->wait_output_video_synch(UPD_FMT_FRAME, n_field);\r
-                               }\r
-                               graph_->update_value("sync-time", static_cast<float>(sync_timer_.elapsed()*format_desc_.fps*0.5));\r
+               sync_timer_.restart();\r
+               unsigned long n_field = 0;\r
+               {\r
+                       scoped_oversubcription_token oversubscribe;\r
+                       blue_->wait_output_video_synch(UPD_FMT_FRAME, n_field);\r
+               }\r
+               graph_->update_value("sync-time", static_cast<float>(sync_timer_.elapsed()*format_desc_.fps*0.5));\r
 \r
-                               // Send and display\r
+               // Send and display\r
 \r
-                               if(embedded_audio_)\r
-                               {               \r
-                                       auto frame_audio          = core::audio_32_to_16_sse(frame->audio_data());\r
-                                       auto frame_audio_data = frame_audio.size() != audio_samples ? silence.data() : frame_audio.data();      \r
+               if(embedded_audio_)\r
+               {               \r
+                       auto frame_audio          = core::audio_32_to_16_sse(frame->audio_data());\r
+                       auto frame_audio_data = frame_audio.size() != audio_samples ? silence.data() : frame_audio.data();      \r
 \r
-                                       encode_hanc(reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()), frame_audio_data, audio_samples, audio_nchannels);\r
+                       encode_hanc(reinterpret_cast<BLUE_UINT32*>(reserved_frames_.front()->hanc_data()), frame_audio_data, audio_samples, audio_nchannels);\r
                                                                \r
-                                       blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()), \r
-                                                                                                       reserved_frames_.front()->image_size(), \r
-                                                                                                       nullptr, \r
-                                                                                                       BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
-\r
-                                       blue_->system_buffer_write_async(reserved_frames_.front()->hanc_data(),\r
-                                                                                                       reserved_frames_.front()->hanc_size(), \r
-                                                                                                       nullptr,                 \r
-                                                                                                       BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_HANC));\r
-\r
-                                       if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image_HANC(reserved_frames_.front()->id()))))\r
-                                               CASPAR_LOG(warning) << print() << TEXT(" render_buffer_update failed.");\r
-                               }\r
-                               else\r
-                               {\r
-                                       blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()),\r
-                                                                                                       reserved_frames_.front()->image_size(), \r
-                                                                                                       nullptr,                 \r
-                                                                                                       BlueImage_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
-                       \r
-                                       if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image(reserved_frames_.front()->id()))))\r
-                                               CASPAR_LOG(warning) << print() << TEXT(" render_buffer_update failed.");\r
-                               }\r
-\r
-                               std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
-                               \r
-                               graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
-\r
-                               graph_->update_value("tick-time", static_cast<float>(tick_timer_.elapsed()*format_desc_.fps*0.5));\r
-                               tick_timer_.restart();                          \r
-                       }\r
+                       blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()), \r
+                                                                                       reserved_frames_.front()->image_size(), \r
+                                                                                       nullptr, \r
+                                                                                       BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
+\r
+                       blue_->system_buffer_write_async(reserved_frames_.front()->hanc_data(),\r
+                                                                                       reserved_frames_.front()->hanc_size(), \r
+                                                                                       nullptr,                 \r
+                                                                                       BlueImage_HANC_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_HANC));\r
+\r
+                       if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image_HANC(reserved_frames_.front()->id()))))\r
+                               CASPAR_LOG(warning) << print() << TEXT(" render_buffer_update failed.");\r
                }\r
-               catch(...)\r
+               else\r
                {\r
-                       Concurrency::send(exception_, std::current_exception());\r
+                       blue_->system_buffer_write_async(const_cast<uint8_t*>(reserved_frames_.front()->image_data()),\r
+                                                                                       reserved_frames_.front()->image_size(), \r
+                                                                                       nullptr,                 \r
+                                                                                       BlueImage_DMABuffer(reserved_frames_.front()->id(), BLUE_DATA_IMAGE));\r
+                       \r
+                       if(BLUE_FAIL(blue_->render_buffer_update(BlueBuffer_Image(reserved_frames_.front()->id()))))\r
+                               CASPAR_LOG(warning) << print() << TEXT(" render_buffer_update failed.");\r
                }\r
 \r
-               done();\r
-       }\r
+               std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
+                               \r
+               graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
 \r
+               graph_->update_value("tick-time", static_cast<float>(tick_timer_.elapsed()*format_desc_.fps*0.5));\r
+               tick_timer_.restart();                          \r
+       }\r
+       \r
        void encode_hanc(BLUE_UINT32* hanc_data, void* audio_data, size_t audio_samples, size_t audio_nchannels)\r
        {       \r
                const auto sample_type = AUDIO_CHANNEL_16BIT | AUDIO_CHANNEL_LITTLEENDIAN;\r
index bf8b36de5d8a0b1d9e6407d8ddc47d4b6c65d8a4..7db20744fbcb0a9a02d3966c61f6694e7fe873f6 100644 (file)
@@ -399,6 +399,7 @@ public:
                if(!is_running_)\r
                        BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Is not running."));\r
                \r
+               Concurrency::scoped_oversubcription_token oversubscribe;                \r
                if(config_.embedded_audio)\r
                        audio_frame_buffer_.push(frame);        \r
                video_frame_buffer_.push(frame);        \r
@@ -445,7 +446,6 @@ public:
        \r
        virtual bool send(const safe_ptr<core::read_frame>& frame)\r
        {\r
-               Concurrency::scoped_oversubcription_token oversubscribe;\r
                context_->send(frame);\r
                return true;\r
        }\r