]> git.sesse.net Git - casparcg/commitdiff
[layer_producer] Fixed serious bug where a circular reference of layer producers...
authorHelge Norberg <helge.norberg@svt.se>
Tue, 31 Jan 2017 09:11:23 +0000 (10:11 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Tue, 31 Jan 2017 09:11:23 +0000 (10:11 +0100)
CHANGELOG
modules/reroute/producer/layer_producer.cpp

index 630a12148748762f10ba7f39d376d5be3e8a3b87..765a1c5d13eac85d08736fdd1f659fe820bc316e 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -51,6 +51,9 @@ Producers
     + Fixed bug where only URL:s with . in them where recognized.\r
   o Image producer:\r
     + Added LENGTH parameter to allow for queueing with LOADBG AUTO.\r
+  o Layer producer:\r
+    + Fixed serious bug where a circular reference of layer producers caused a\r
+      stack overflow and server crash.\r
 \r
 Mixer\r
 -----\r
index 53a9b40c32a0b237da6853b9e2a4543aacae3581..9b5bad96c10234327b517674966cc7bd26214a69 100644 (file)
@@ -41,7 +41,7 @@
 namespace caspar { namespace reroute {
 
 class layer_consumer : public core::write_frame_consumer
-{      
+{
        tbb::concurrent_bounded_queue<core::draw_frame> frame_buffer_;
        semaphore                                                                               frames_available_ { 0 };
        int                                                                                             frames_delay_;
@@ -108,7 +108,7 @@ public:
                : layer_(layer)
                , consumer_(spl::make_shared<layer_consumer>(frames_delay))
                , channel_(channel)
-               , last_frame_(core::draw_frame::empty())
+               , last_frame_(core::draw_frame::late())
                , frame_number_(0)
        {
                pixel_constraints_.width.set(channel->video_format_desc().width);
@@ -125,7 +125,7 @@ public:
        }
 
        // frame_producer
-                       
+
        core::draw_frame receive_impl() override
        {
                auto consumer_frame = consumer_->receive();
@@ -134,7 +134,12 @@ public:
 
                frame_number_++;
                return last_frame_ = consumer_frame;
-       }       
+       }
+
+       core::draw_frame last_frame() override
+       {
+               return last_frame_;
+       }
 
        std::wstring print() const override
        {