]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@1921...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 21 Dec 2011 16:10:36 +0000 (16:10 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Wed, 21 Dec 2011 16:10:36 +0000 (16:10 +0000)
core/producer/channel/channel_producer.cpp

index 392ddb31cc82eff0b803c7ee1d9bf07d5424e553..ae1c0c81721ee079b7f427ca67f63eb803e7c5d9 100644 (file)
@@ -49,7 +49,7 @@ public:
        channel_consumer() \r
        {\r
                is_running_ = true;\r
-               frame_buffer_.set_capacity(2);\r
+               frame_buffer_.set_capacity(3);\r
        }\r
 \r
        ~channel_consumer()\r
@@ -129,12 +129,14 @@ class channel_producer : public frame_producer
 \r
        std::queue<safe_ptr<basic_frame>>       frame_buffer_;\r
        safe_ptr<basic_frame>                           last_frame_;\r
+       uint64_t                                                        frame_number_;\r
 \r
 public:\r
        explicit channel_producer(const safe_ptr<frame_factory>& frame_factory, const safe_ptr<video_channel>& channel) \r
                : frame_factory_(frame_factory)\r
                , consumer_(make_safe<channel_consumer>())\r
                , last_frame_(basic_frame::empty())\r
+               , frame_number_(0)\r
        {\r
                channel->output()->add(consumer_);\r
                CASPAR_LOG(info) << print() << L" Initialized";\r
@@ -152,16 +154,7 @@ public:
        {\r
                auto format_desc = consumer_->get_video_format_desc();\r
 \r
-               bool half_speed = std::abs(format_desc.fps / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01;\r
-               \r
-               if(half_speed && frame_buffer_.size() >= 2)\r
-               {                               \r
-                       frame_buffer_.pop();\r
-                       auto frame = frame_buffer_.front();\r
-                       frame_buffer_.pop();\r
-                       return last_frame_ = frame;\r
-               }\r
-               else if(!frame_buffer_.empty())\r
+               if(frame_buffer_.size() > 1)\r
                {\r
                        auto frame = frame_buffer_.front();\r
                        frame_buffer_.pop();\r
@@ -171,8 +164,16 @@ public:
                auto read_frame = consumer_->receive();\r
                if(!read_frame || read_frame->image_data().empty())\r
                        return basic_frame::late();             \r
+\r
+               frame_number_++;\r
                \r
                core::pixel_format_desc desc;\r
+               bool double_speed = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - format_desc.fps) < 0.01;               \r
+               bool half_speed = std::abs(format_desc.fps / 2.0 - frame_factory_->get_video_format_desc().fps) < 0.01;\r
+\r
+               if(half_speed && frame_number_ % 2 == 0)\r
+                       return receive(0);\r
+\r
                desc.pix_fmt = core::pixel_format::bgra;\r
                desc.planes.push_back(core::pixel_format_desc::plane(format_desc.width, format_desc.height, 4));\r
                auto frame = frame_factory_->create_frame(this, desc);\r
@@ -182,8 +183,6 @@ public:
 \r
                frame_buffer_.push(frame);      \r
                \r
-               bool double_speed = std::abs(frame_factory_->get_video_format_desc().fps / 2.0 - format_desc.fps) < 0.01;\r
-\r
                if(double_speed)        \r
                        frame_buffer_.push(frame);\r
 \r