]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: image_mixer: Reduced latency.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 22 May 2011 19:56:00 +0000 (19:56 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 22 May 2011 19:56:00 +0000 (19:56 +0000)
         ffmpeg_input: Sleep thread when there is alrdy enough packets.

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

core/core.vcxproj.filters
core/mixer/audio/audio_mixer.cpp
core/mixer/frame_mixer_device.cpp
core/mixer/image/image_mixer.cpp
core/mixer/read_frame.cpp
core/mixer/read_frame.h
modules/ffmpeg/producer/input.cpp
modules/ffmpeg/tbb_avcodec.cpp

index 04b3903a167c0e73297083d20a56f26557109bcd..3ae4332ea4e1ad5b02152cbbcf6b1b7164133eef 100644 (file)
@@ -75,9 +75,6 @@
     <ClInclude Include="producer\frame\frame_factory.h">\r
       <Filter>producer\frame</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="mixer\frame_mixer_device.h">\r
-      <Filter>mixer</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="mixer\image\image_kernel.h">\r
       <Filter>mixer\image</Filter>\r
     </ClInclude>\r
     <ClInclude Include="mixer\write_frame.h">\r
       <Filter>mixer</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="mixer\frame_mixer_device.h">\r
+      <Filter>mixer</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClCompile Include="producer\transition\transition_producer.cpp">\r
index ee0fe7c9b6e51fa800c7d86fc7860861ee10793d..bfe61002884542f7cbb5b04b140aba0dc69903ce 100644 (file)
@@ -39,8 +39,7 @@ public:
        {\r
                transform_stack_.push(core::audio_transform());\r
 \r
-               // 2 frames delay\r
-               audio_data_.push_back(std::vector<short>());\r
+               // frame delay\r
                audio_data_.push_back(std::vector<short>());\r
        }\r
        \r
index 790552422c65e7eafa9a7994bc6b4c26651c4c44..38e1e73704e5ad19fe0d430c5dd91dd12f5a24d4 100644 (file)
@@ -117,7 +117,7 @@ public:
                diag_->set_color("frame-time", diagnostics::color(1.0f, 0.0f, 0.0f));\r
                diag_->set_color("tick-time", diagnostics::color(0.1f, 0.7f, 0.8f));\r
                diag_->set_color("input-buffer", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
-               executor_.set_capacity(2);      \r
+               executor_.set_capacity(1);      \r
                executor_.begin_invoke([]\r
                {\r
                        SetThreadPriority(GetCurrentThread(), ABOVE_NORMAL_PRIORITY_CLASS);\r
@@ -186,14 +186,13 @@ public:
                \r
        void send(const std::map<int, safe_ptr<core::basic_frame>>& frames)\r
        {                       \r
-               executor_.begin_invoke([=]\r
+               executor_.invoke([=]\r
                {               \r
                        diag_->set_value("input-buffer", static_cast<float>(executor_.size())/static_cast<float>(executor_.capacity()));        \r
                        frame_timer_.restart();\r
 \r
-                       auto image_future = mix_image(frames);\r
+                       auto image = mix_image(frames);\r
                        auto audio = mix_audio(frames);\r
-                       auto image = image_future.get();\r
 \r
                        diag_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*format_desc_.fps*0.5));\r
 \r
index aac3d865bc7e347535a7a85c3151ea9a179c1056..5cfe5bc10b2a0bb7d1b2c23c7ae5d4e1bd82e158 100644 (file)
@@ -61,9 +61,7 @@ struct image_mixer::implementation : boost::noncopyable
        std::vector<std::vector<render_item>>   render_queue_;\r
        \r
        image_kernel kernel_;\r
-               \r
-       safe_ptr<host_buffer>   read_buffer_;\r
-       \r
+                       \r
        safe_ptr<device_buffer> draw_buffer_;\r
        safe_ptr<device_buffer> write_buffer_;\r
 \r
@@ -76,7 +74,6 @@ struct image_mixer::implementation : boost::noncopyable
 public:\r
        implementation(const core::video_format_desc& format_desc) \r
                : format_desc_(format_desc)\r
-               , read_buffer_(ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only))\r
                , draw_buffer_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
                , write_buffer_ (ogl_device::create_device_buffer(format_desc.width, format_desc.height, 4))\r
                , local_key_buffer_(ogl_device::create_device_buffer(format_desc.width, format_desc.height, 1))\r
@@ -137,12 +134,8 @@ public:
 \r
        boost::unique_future<safe_ptr<const host_buffer>> render()\r
        {\r
-               auto result = ogl_device::begin_invoke([=]() -> safe_ptr<const host_buffer>\r
-               {\r
-                       read_buffer_->map(); // Might block.\r
-                       return read_buffer_;\r
-               });\r
-                       \r
+               auto result = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
+                                       \r
                ogl_device::begin_invoke([=]\r
                {\r
                        local_key_ = false;\r
@@ -174,13 +167,16 @@ public:
 \r
                        // Start transfer from device to host.\r
 \r
-                       read_buffer_ = ogl_device::create_host_buffer(format_desc_.size, host_buffer::read_only);\r
-                       draw_buffer_->write(*read_buffer_);\r
+                       draw_buffer_->write(*result);\r
 \r
                        std::swap(draw_buffer_, write_buffer_);\r
                });\r
-\r
-               return std::move(result);\r
+               \r
+               return ogl_device::begin_invoke([=]() -> safe_ptr<const host_buffer>\r
+               {\r
+                       result->map(); // Might block.\r
+                       return result;\r
+               });\r
        }\r
        \r
        void draw(const render_item& item)\r
index 02b31e5b1b114f6f707646fd65d15cfe5b5a2e97..492449246ad130ff7fcdce298cddb524c3c38cbc 100644 (file)
@@ -27,23 +27,30 @@ namespace caspar { namespace core {
                                                                                                                                                                                                                                                                                                                        \r
 struct read_frame::implementation : boost::noncopyable\r
 {\r
-       safe_ptr<const host_buffer> image_data_;\r
+       boost::unique_future<safe_ptr<const host_buffer>> image_data_;\r
        std::vector<short> audio_data_;\r
 \r
 public:\r
-       implementation(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data) \r
+       implementation(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data) \r
                : image_data_(std::move(image_data))\r
                , audio_data_(std::move(audio_data)){}  \r
 };\r
 \r
-read_frame::read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data) : impl_(new implementation(std::move(image_data), std::move(audio_data))){}\r
+read_frame::read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data) \r
+       : impl_(new implementation(std::move(image_data), std::move(audio_data))){}\r
+read_frame::read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data) \r
+{\r
+       boost::promise<safe_ptr<const host_buffer>> p;\r
+       p.set_value(std::move(image_data));\r
+       impl_.reset(new implementation(std::move(p.get_future()), std::move(audio_data)));\r
+}\r
 \r
 const boost::iterator_range<const unsigned char*> read_frame::image_data() const\r
 {\r
-       if(!impl_->image_data_->data())\r
+       if(!impl_->image_data_.get()->data())\r
                return boost::iterator_range<const unsigned char*>();\r
-       auto ptr = static_cast<const unsigned char*>(impl_->image_data_->data());\r
-       return boost::iterator_range<const unsigned char*>(ptr, ptr + impl_->image_data_->size());\r
+       auto ptr = static_cast<const unsigned char*>(impl_->image_data_.get()->data());\r
+       return boost::iterator_range<const unsigned char*>(ptr, ptr + impl_->image_data_.get()->size());\r
 }\r
 const boost::iterator_range<const short*> read_frame::audio_data() const\r
 {\r
index 73fc15045c3c60b22d2f2dc3d7f52da777e2f593..5bfbef5c69f92a6860b4193557fe2426db704298 100644 (file)
@@ -25,6 +25,7 @@
 \r
 #include <boost/noncopyable.hpp>\r
 #include <boost/range/iterator_range.hpp>\r
+#include <boost/thread.hpp>\r
 \r
 #include <memory>\r
 #include <vector>\r
@@ -35,6 +36,7 @@ class read_frame : boost::noncopyable
 {\r
        read_frame(){}\r
 public:\r
+       read_frame(boost::unique_future<safe_ptr<const host_buffer>>&& image_data, std::vector<short>&& audio_data);\r
        read_frame(safe_ptr<const host_buffer>&& image_data, std::vector<short>&& audio_data);\r
 \r
        virtual const boost::iterator_range<const unsigned char*> image_data() const;\r
index 421b9cb0658eb9b38814a4ef90a42349669b7cb0..9869acb7052d880b4fc9dfacdce7b195dcf1c9e9 100644 (file)
@@ -237,7 +237,7 @@ private:
        void read_file()\r
        {               \r
                if(audio_stream_.size() > 4 && video_stream_.size() > 4)\r
-                       boost::this_thread::yield(); // There are enough packets, no hurry.\r
+                       Sleep(5); // There are enough packets, no hurry.\r
 \r
                try\r
                {\r
index 14d6588b051f460a7c3835a0c27238c8b5787344..eb2841f8543ccd4c714d6054fde5701ae3d53c4a 100644 (file)
@@ -76,6 +76,9 @@ void thread_init(AVCodecContext* s)
 \r
 void thread_free(AVCodecContext* s)\r
 {\r
+       if(!s->thread_opaque)\r
+               return;\r
+\r
        s->thread_opaque = nullptr;\r
 \r
        CASPAR_LOG(info) << "Released ffmpeg tbb context.";\r