{ \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
\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
\r
boost::thread thread_;\r
tbb::atomic<bool> is_running_;\r
+ tbb::atomic<bool> is_eof_;\r
\r
tbb::recursive_mutex mutex_;\r
\r
, length_(length)\r
, frame_number_(0)\r
{ \r
+ is_eof_ = false;\r
loop_ = loop;\r
buffer_size_ = 0;\r
nb_frames_ = 0;\r
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
\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
\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
\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