]> git.sesse.net Git - casparcg/commitdiff
3560201: An attempt to improve delayed frame writing when the ffmpeg consumer is...
authorhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 18 Jan 2013 13:34:13 +0000 (13:34 +0000)
committerhellgore <hellgore@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 18 Jan 2013 13:34:13 +0000 (13:34 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@3690 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

common/concurrency/executor.h
modules/ffmpeg/consumer/ffmpeg_consumer.cpp

index 52025bd694366c048038222423fd158dc8dcdc31..79adf0a4deacad89876752ce3290e88c6e25dcd3 100644 (file)
@@ -86,6 +86,7 @@ class executor : boost::noncopyable
        const std::string name_;
        boost::thread thread_;
        tbb::atomic<bool> is_running_;
+       tbb::atomic<bool> execute_rest_;
        
        typedef tbb::concurrent_bounded_queue<std::function<void()>> function_queue;
        function_queue execution_queue_[priority_count];
@@ -153,9 +154,17 @@ public:
                                
        void stop() // noexcept
        {
+               execute_rest_ = false;
                is_running_ = false;    
                execution_queue_[normal_priority].try_push([]{}); // Wake the execution thread.
        }
+                               
+       void stop_execute_rest() // noexcept
+       {
+               execute_rest_ = true;
+               is_running_ = false;
+               execution_queue_[normal_priority].try_push([]{}); // Wake the execution thread.
+       }
 
        void wait() // noexcept
        {
@@ -305,6 +314,15 @@ private:
                        func();
        }
 
+       void execute_rest(task_priority priority) // noexcept
+       {
+               std::function<void()> func;
+
+               while (execution_queue_[priority].try_pop(func))
+                       if (func)
+                               func();
+       }
+
        void run() // noexcept
        {
                win32_exception::install_handler();             
@@ -320,6 +338,12 @@ private:
                                CASPAR_LOG_CURRENT_EXCEPTION();
                        }
                }
+
+               if (execute_rest_)
+               {
+                       execute_rest(high_priority);
+                       execute_rest(normal_priority);
+               }
        }       
 };
 
index 0f4e24078d0369cc6d579c427486405b56e3669a..db563f7ca63bf8970e86fad4dc94cb71fdd4c755 100644 (file)
@@ -294,8 +294,11 @@ public:
 \r
        ~ffmpeg_consumer()\r
        {    \r
-               encode_executor_.stop();\r
+               encode_executor_.stop_execute_rest();\r
                encode_executor_.join();\r
+\r
+               // Flush\r
+               LOG_ON_ERROR2(av_interleaved_write_frame(oc_.get(), nullptr), "[ffmpeg_consumer]");\r
                \r
                LOG_ON_ERROR2(av_write_trailer(oc_.get()), "[ffmpeg_consumer]");\r
                \r