]> git.sesse.net Git - casparcg/commitdiff
- Added possibility for consumers to *not* affect the presentation time (adjustments...
authorHelge Norberg <helge.norberg@svt.se>
Wed, 10 Dec 2014 12:19:31 +0000 (13:19 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Wed, 10 Dec 2014 12:19:31 +0000 (13:19 +0100)
- Fixed streaming_consumer sometimes crashing the server during destruction.

13 files changed:
core/consumer/frame_consumer.cpp
core/consumer/frame_consumer.h
core/consumer/output.cpp
core/producer/channel/channel_producer.cpp
modules/bluefish/consumer/bluefish_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp
modules/decklink/util/util.h
modules/ffmpeg/consumer/ffmpeg_consumer.cpp
modules/ffmpeg/consumer/streaming_consumer.cpp
modules/image/consumer/image_consumer.cpp
modules/newtek/consumer/newtek_ivga_consumer.cpp
modules/oal/consumer/oal_consumer.cpp
modules/ogl/consumer/ogl_consumer.cpp

index 95ef47d65038ba10c416885f551969dc1b76b64e..74f239bde5de2d97eaeb514db347b66c633c7c02 100644 (file)
@@ -132,7 +132,7 @@ public:
                return consumer_->has_synchronization_clock();\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
                return consumer_->buffer_depth();\r
        }\r
@@ -157,7 +157,7 @@ const safe_ptr<frame_consumer>& frame_consumer::empty()
                virtual int64_t presentation_frame_age_millis() const { return 0; }\r
                virtual std::wstring print() const override {return L"empty";}\r
                virtual bool has_synchronization_clock() const override {return false;}\r
-               virtual size_t buffer_depth() const override {return 0;};\r
+               virtual int buffer_depth() const override {return 0;};\r
                virtual int index() const{return -1;}\r
                virtual boost::property_tree::wptree info() const override\r
                {\r
index 267d3dfa0e3b1cd956e13fca20ec3c9a40cc4d27..cbdf5fe70a52439124b10497e6e918ba099183df 100644 (file)
@@ -48,7 +48,7 @@ struct frame_consumer : boost::noncopyable
        virtual std::wstring print() const = 0;\r
        virtual boost::property_tree::wptree info() const = 0;\r
        virtual bool has_synchronization_clock() const {return true;}\r
-       virtual size_t buffer_depth() const = 0;\r
+       virtual int buffer_depth() const = 0; // -1 to not participate in frame presentation synchronization\r
        virtual int index() const = 0;\r
 \r
        static const safe_ptr<frame_consumer>& empty();\r
index d722e43cb3c02efc2cf0eead41625ece06afa60d..ad2111afb0576df8c788deeee199966e0483f4b4 100644 (file)
@@ -156,25 +156,30 @@ public:
                });\r
        }\r
        \r
-       std::map<int, size_t> buffer_depths_snapshot() const\r
+       std::map<int, int> buffer_depths_snapshot() const\r
        {\r
-               std::map<int, size_t> result;\r
+               std::map<int, int> result;\r
 \r
                BOOST_FOREACH(auto& consumer, consumers_)\r
                        result.insert(std::make_pair(\r
                                        consumer.first,\r
                                        consumer.second->buffer_depth()));\r
 \r
-               return std::move(result);\r
+               return result;\r
        }\r
 \r
-       std::pair<size_t, size_t> minmax_buffer_depth(\r
-                       const std::map<int, size_t>& buffer_depths) const\r
+       std::pair<int, int> minmax_buffer_depth(\r
+                       const std::map<int, int>& buffer_depths) const\r
        {               \r
                if(consumers_.empty())\r
                        return std::make_pair(0, 0);\r
                \r
-               auto depths = buffer_depths | boost::adaptors::map_values; \r
+               auto depths = buffer_depths\r
+                               | boost::adaptors::map_values\r
+                               | boost::adaptors::filtered([](int v) { return v >= 0; });\r
+\r
+               if (depths.empty())\r
+                       return std::make_pair(0, 0);\r
                \r
                return std::make_pair(\r
                                *boost::range::min_element(depths),\r
@@ -220,7 +225,8 @@ public:
                                for (auto it = consumers_.begin(); it != consumers_.end();)\r
                                {\r
                                        auto consumer   = it->second;\r
-                                       auto frame              = frames_.at(buffer_depths[it->first]-minmax.first);\r
+                                       auto depth              = buffer_depths[it->first];\r
+                                       auto frame              = depth < 0 ? frames_.back() : frames_.at(depth - minmax.first);\r
 \r
                                        send_to_consumers_delays_[it->first] = frame->get_age_millis();\r
                                                \r
@@ -251,7 +257,8 @@ public:
                                for (auto result_it = send_results.begin(); result_it != send_results.end(); ++result_it)\r
                                {\r
                                        auto consumer           = consumers_.at(result_it->first);\r
-                                       auto frame                      = frames_.at(buffer_depths[result_it->first]-minmax.first);\r
+                                       auto depth                      = buffer_depths[result_it->first];\r
+                                       auto frame                      = depth < 0 ? frames_.back() : frames_.at(depth - minmax.first);\r
                                        auto& result_future     = result_it->second;\r
                                                \r
                                        try\r
index 3e033acdefefb37370c2546ac26f69cc0b31e7a5..d983daf2b14c6c476251b885b53c6d04e8e24803 100644 (file)
@@ -131,9 +131,9 @@ public:
                return false;\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
-               return 1;\r
+               return -1;\r
        }\r
 \r
        virtual int index() const override\r
index aa354394429b853cc3412091ed601dc05fecc6c9..e2877bbeabc48d000f4f81a7ab5c6e37b96881d3 100644 (file)
@@ -422,7 +422,7 @@ public:
                return info;\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
                return 1;\r
        }\r
index 8bc541088270d088447da25ec7ba3538ffad1964..c2c6dbe027aa9daf7d414398b92fa34920318a3b 100644 (file)
@@ -587,7 +587,7 @@ public:
                return info;\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
                return config_.buffer_depth();\r
        }\r
index 11b90f90460a856d1a7d3525f666285911808430..f9e54052e48a1a41d3df9861aa1865f3e716aba6 100644 (file)
@@ -359,7 +359,7 @@ struct configuration
        {\r
        }\r
        \r
-       size_t buffer_depth() const\r
+       int buffer_depth() const\r
        {\r
                return base_buffer_depth + (latency == low_latency ? 0 : 1) + (embedded_audio ? 1 : 0);\r
        }\r
index 95321f34f334ad3662cd67d6a1bd189a1e5f7ef1..8d631af770102bc1a9458b90117c3f5e08b153cb 100644 (file)
@@ -730,9 +730,9 @@ public:
                return false;\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
-               return 1;\r
+               return -1;\r
        }\r
 \r
        virtual int index() const override\r
index 75759b407d44f7302fd1db7ee0cb8a256a0a9de6..92b37f3f8358ed25f052353d158e1f363176aac5 100644 (file)
@@ -126,8 +126,8 @@ public:
                , video_pts_(0)
                , audio_pts_(0)
                , executor_(print())
-               , audio_encoder_executor_(print() + L" video_encoder")
-               , video_encoder_executor_(print() + L" audio_encoder")
+               , audio_encoder_executor_(print() + L" audio_encoder")
+               , video_encoder_executor_(print() + L" video_encoder")
                , write_executor_(print() + L" io")
        {               
                abort_request_ = false; 
@@ -158,24 +158,26 @@ public:
        {
                if(oc_)
                {
-                       encode_video(nullptr, nullptr);
-                       encode_audio(nullptr, nullptr);                 
+                       video_encoder_executor_.begin_invoke([&] { encode_video(nullptr, nullptr); });
+                       audio_encoder_executor_.begin_invoke([&] { encode_audio(nullptr, nullptr); });
+
+                       video_encoder_executor_.stop();
+                       audio_encoder_executor_.stop();
+                       video_encoder_executor_.join();
+                       audio_encoder_executor_.join();
 
                        video_graph_.reset();
                        audio_graph_.reset();
-                       
-                       video_encoder_executor_.wait();
-                       audio_encoder_executor_.wait();
-                       
                        video_st_.reset();
                        audio_st_.reset();
 
                        write_packet(nullptr, nullptr);
 
-                       write_executor_.wait();
-                                       
+                       write_executor_.stop();
+                       write_executor_.join();
+
                        FF(av_write_trailer(oc_.get()));
-                                               
+
                        if (!(oc_->oformat->flags & AVFMT_NOFILE) && oc_->pb)
                                avio_close(oc_->pb);
 
@@ -420,7 +422,7 @@ public:
 
        std::wstring print() const override
        {
-               return L"ffmpeg_consumer[" + widen(path_.string()) + L"]";
+               return L"streaming_consumer[" + widen(path_.string()) + L"]";
        }
        
        virtual boost::property_tree::wptree info() const override
@@ -433,9 +435,9 @@ public:
                return false;
        }
 
-       size_t buffer_depth() const override
+       int buffer_depth() const override
        {
-               return 0;
+               return -1;
        }
 
        int index() const override
@@ -881,11 +883,11 @@ private:
                                in_video_format_.width, 
                                in_video_format_.height, 
                                1));
-               }               
 
-               FF(av_buffersrc_add_frame(
-                       video_graph_in_, 
-                       src_av_frame.get()));
+                       FF(av_buffersrc_add_frame(
+                               video_graph_in_, 
+                               src_av_frame.get()));
+               }               
 
                int ret = 0;
 
@@ -987,11 +989,11 @@ private:
                                src_av_frame->nb_samples, 
                                static_cast<AVSampleFormat>(src_av_frame->format), 
                                16));                                   
-               }
                
-               FF(av_buffersrc_add_frame(
-                       audio_graph_in_, 
-                       src_av_frame.get()));
+                       FF(av_buffersrc_add_frame(
+                               audio_graph_in_, 
+                               src_av_frame.get()));
+               }
 
                int ret = 0;
 
index 412c91958f000c89ebb0fd2f77c726558552950d..b8c029ec4c70bd0ac995a7c0cb8218d7ea84106b 100644 (file)
@@ -129,9 +129,9 @@ public:
                return info;\r
        }\r
 \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
-               return 0;\r
+               return -1;\r
        }\r
 \r
        virtual int index() const override\r
index cc075c7a9373ddd563d49979e55ce25b656b5138..0fbea962b39efa60e0bf1a6973649d34a848f7ab 100644 (file)
@@ -148,9 +148,9 @@ public:
                return info;
        }
 
-       virtual size_t buffer_depth() const override
+       virtual int buffer_depth() const override
        {
-               return 0;
+               return -1;
        }
        
        virtual int index() const override
index e33d741179600838c515b86132293dc4161ef4cf..9ebf9561f20997ff399fccba4405803065a01640 100644 (file)
@@ -154,7 +154,7 @@ public:
                return info;
        }
        
-       virtual size_t buffer_depth() const override
+       virtual int buffer_depth() const override
        {
                return 6;
        }
index 976209598fcfe871f240e2a7125f17ba722a90c6..7a02d13ec03754dea9a2d2b4ff301c07403e4768 100644 (file)
@@ -581,7 +581,7 @@ public:
                return false;\r
        }\r
        \r
-       virtual size_t buffer_depth() const override\r
+       virtual int buffer_depth() const override\r
        {\r
                return 1;\r
        }\r