]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/trunk@1927...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 23 Dec 2011 12:43:52 +0000 (12:43 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 23 Dec 2011 12:43:52 +0000 (12:43 +0000)
modules/ffmpeg/producer/input/input.cpp

index 9d3d39f9c7c52d0b7b1870b7566e4d1c37527836..7f138165cd17901d3d74a424048c163f06ebf531 100644 (file)
@@ -139,55 +139,70 @@ struct input::implementation : boost::noncopyable
                return L"ffmpeg_input[" + filename_ + L")]";\r
        }\r
        \r
+       bool full() const\r
+       {\r
+               return !executor_.is_running() || (buffer_size_ > MAX_BUFFER_SIZE || buffer_.size() > MAX_BUFFER_COUNT) && buffer_.size() > MIN_BUFFER_COUNT;\r
+       }\r
+\r
        void tick()\r
        {               \r
                executor_.begin_invoke([this]\r
-               {\r
-                       auto packet = create_packet();\r
+               {                       \r
+                       if(full())\r
+                               return;\r
+\r
+                       try\r
+                       {\r
+                               auto packet = create_packet();\r
                \r
-                       auto ret = av_read_frame(format_context_.get(), packet.get()); // packet is only valid until next call of av_read_frame. Use av_dup_packet to extend its life.  \r
+                               auto ret = av_read_frame(format_context_.get(), packet.get()); // packet is only valid until next call of av_read_frame. Use av_dup_packet to extend its life.  \r
                \r
-                       if(is_eof(ret))                                                                                                              \r
-                       {\r
-                               frame_number_   = 0;\r
-\r
-                               if(loop_)\r
+                               if(is_eof(ret))                                                                                                              \r
                                {\r
-                                       queued_seek(start_);\r
-                                       graph_->set_tag("seek");                \r
-                                       CASPAR_LOG(trace) << print() << " Looping.";                    \r
-                               }               \r
+                                       frame_number_   = 0;\r
+\r
+                                       if(loop_)\r
+                                       {\r
+                                               queued_seek(start_);\r
+                                               graph_->set_tag("seek");                \r
+                                               CASPAR_LOG(trace) << print() << " Looping.";                    \r
+                                       }               \r
+                                       else\r
+                                               executor_.stop();\r
+                               }\r
                                else\r
-                                       executor_.stop();\r
-                       }\r
-                       else\r
-                       {               \r
-                               THROW_ON_ERROR(ret, "av_read_frame", print());\r
+                               {               \r
+                                       THROW_ON_ERROR(ret, "av_read_frame", print());\r
 \r
-                               if(packet->stream_index == default_stream_index_)\r
-                                       ++frame_number_;\r
+                                       if(packet->stream_index == default_stream_index_)\r
+                                               ++frame_number_;\r
 \r
-                               THROW_ON_ERROR2(av_dup_packet(packet.get()), print());\r
+                                       THROW_ON_ERROR2(av_dup_packet(packet.get()), print());\r
                                \r
-                               // Make sure that the packet is correctly deallocated even if size and data is modified during decoding.\r
-                               auto size = packet->size;\r
-                               auto data = packet->data;\r
+                                       // Make sure that the packet is correctly deallocated even if size and data is modified during decoding.\r
+                                       auto size = packet->size;\r
+                                       auto data = packet->data;\r
                        \r
-                               packet = safe_ptr<AVPacket>(packet.get(), [packet, size, data](AVPacket*)\r
-                               {\r
-                                       packet->size = size;\r
-                                       packet->data = data;                            \r
-                               });\r
+                                       packet = safe_ptr<AVPacket>(packet.get(), [packet, size, data](AVPacket*)\r
+                                       {\r
+                                               packet->size = size;\r
+                                               packet->data = data;                            \r
+                                       });\r
 \r
-                               buffer_.try_push(packet);\r
-                               buffer_size_ += packet->size;\r
+                                       buffer_.try_push(packet);\r
+                                       buffer_size_ += packet->size;\r
                                \r
-                               graph_->set_value("buffer-size", (static_cast<double>(buffer_size_)+0.001)/MAX_BUFFER_SIZE);\r
-                               graph_->set_value("buffer-count", (static_cast<double>(buffer_.size()+0.001)/MAX_BUFFER_COUNT));\r
-                       }       \r
-\r
-                       if((buffer_size_ < MAX_BUFFER_SIZE || buffer_.size() > MIN_BUFFER_COUNT) && buffer_.size() < MAX_BUFFER_COUNT && executor_.is_running())                        \r
-                               tick();                 \r
+                                       graph_->set_value("buffer-size", (static_cast<double>(buffer_size_)+0.001)/MAX_BUFFER_SIZE);\r
+                                       graph_->set_value("buffer-count", (static_cast<double>(buffer_.size()+0.001)/MAX_BUFFER_COUNT));\r
+                               }       \r
+               \r
+                               tick();         \r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               executor_.stop();\r
+                       }\r
                });\r
        }       \r
                        \r