]> git.sesse.net Git - casparcg/commitdiff
2.0.2: ffmpeg_producer: Not removed on EOF. Seekable even after it has reached eof.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 27 Nov 2011 01:04:57 +0000 (01:04 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Sun, 27 Nov 2011 01:04:57 +0000 (01:04 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.2@1676 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

modules/ffmpeg/producer/ffmpeg_producer.cpp
modules/ffmpeg/producer/input/input.cpp

index e30f0a694ba01c67a94b772ee55617bc7e005122..a7fa68f860ed1f1641f0162fde3a66f74b8ebb1a 100644 (file)
@@ -133,13 +133,13 @@ public:
        {               \r
                frame_timer_.restart();\r
                \r
-               for(int n = 0; n < 32 && frame_buffer_.size() < 2; ++n)\r
+               for(int n = 0; n < 16 && frame_buffer_.size() < 2; ++n)\r
                        try_decode_frame(hints);\r
                \r
                graph_->update_value("frame-time", frame_timer_.elapsed()*format_desc_.fps*0.5);\r
                                \r
                if(frame_buffer_.empty() && input_.eof())\r
-                       return core::basic_frame::eof();\r
+                       return last_frame();\r
 \r
                if(frame_buffer_.empty())\r
                {\r
@@ -206,8 +206,8 @@ public:
                                \r
        std::wstring do_call(const std::wstring& param)\r
        {\r
-               static const boost::wregex loop_exp(L"LOOP\\s*(?<VALUE>\\d?)");\r
-               static const boost::wregex seek_exp(L"SEEK\\s+(?<VALUE>\\d+)");\r
+               static const boost::wregex loop_exp(L"LOOP\\s*(?<VALUE>\\d?)", boost::regex::icase);\r
+               static const boost::wregex seek_exp(L"SEEK\\s+(?<VALUE>\\d+)", boost::regex::icase);\r
                \r
                boost::wsmatch what;\r
                if(boost::regex_match(param, what, loop_exp))\r
index 213bc52fb91d160aae4f35c67bcb369a735a9ded..43e445397a34b36224cdded26feb23709917ada4 100644 (file)
@@ -86,6 +86,7 @@ struct input::implementation : boost::noncopyable
 \r
        boost::thread                                                                                           thread_;\r
        tbb::atomic<bool>                                                                                       is_running_;\r
+       tbb::atomic<bool>                                                                                       is_eof_;\r
 \r
        tbb::recursive_mutex                                                                            mutex_;\r
 \r
@@ -98,6 +99,7 @@ struct input::implementation : boost::noncopyable
                , length_(length)\r
                , frame_number_(0)\r
        {               \r
+               is_eof_                 = false;\r
                loop_                   = loop;\r
                buffer_size_    = 0;\r
                nb_frames_              = 0;\r
@@ -183,19 +185,15 @@ struct input::implementation : boost::noncopyable
                if(is_eof(ret))                                                                                                              \r
                {\r
                        ++nb_loops_;\r
-                       frame_number_ = 0;\r
+                       frame_number_   = 0;\r
+                       is_eof_                 = true;\r
 \r
                        if(loop_)\r
                        {\r
                                do_seek(start_);\r
                                graph_->add_tag("seek");                \r
                                CASPAR_LOG(debug) << print() << " Looping.";                    \r
-                       }       \r
-                       else\r
-                       {\r
-                               is_running_ = false;\r
-                               CASPAR_LOG(debug) << print() << " Stopping.";\r
-                       }\r
+                       }                                       \r
                }\r
                else\r
                {               \r
@@ -230,7 +228,7 @@ struct input::implementation : boost::noncopyable
 \r
        bool full() const\r
        {\r
-               return is_running_ && (buffer_size_ > MAX_BUFFER_SIZE || buffer_.size() > MAX_BUFFER_COUNT) && buffer_.size() > MIN_BUFFER_COUNT;\r
+               return is_running_ && (is_eof_ || (buffer_size_ > MAX_BUFFER_SIZE || buffer_.size() > MAX_BUFFER_COUNT) && buffer_.size() > MIN_BUFFER_COUNT);\r
        }\r
        \r
        void do_seek(int64_t target)\r
@@ -257,6 +255,9 @@ struct input::implementation : boost::noncopyable
 \r
                THROW_ON_ERROR2(avformat_seek_file(format_context_.get(), default_stream_index_, std::numeric_limits<int64_t>::min(), target, std::numeric_limits<int64_t>::max(), 0), print());                \r
 \r
+               is_eof_ = false;\r
+               buffer_cond_.notify_all();\r
+\r
                buffer_.push(flush_packet());\r
        }       \r
 \r
@@ -290,7 +291,7 @@ struct input::implementation : boost::noncopyable
 \r
 input::input(const safe_ptr<diagnostics::graph>& graph, const std::wstring& filename, bool loop, size_t start, size_t length) \r
        : impl_(new implementation(graph, filename, loop, start, length)){}\r
-bool input::eof() const {return !impl_->is_running_;}\r
+bool input::eof() const {return impl_->is_eof_;}\r
 bool input::try_pop(std::shared_ptr<AVPacket>& packet){return impl_->try_pop(packet);}\r
 safe_ptr<AVFormatContext> input::context(){return impl_->format_context_;}\r
 size_t input::nb_frames() const {return impl_->nb_frames_;}\r