graph_->set_text(print());\r
\r
if(frame != core::draw_frame::late()) \r
+ {\r
+ last_frame_ = frame;\r
++frame_number_; \r
- \r
+ }\r
+\r
event_subject_ << monitor::event("file/time") % monitor::duration(file_frame_number()/fps_) \r
% monitor::duration(file_nb_frames()/fps_)\r
<< monitor::event("file/frame") % static_cast<int32_t>(file_frame_number())\r
\r
if(frame == core::draw_frame::late() && input_.eof())\r
return last_frame();\r
- \r
- if(frame != core::draw_frame::late())\r
- last_frame_ = frame;\r
- \r
+ \r
return frame;\r
}\r
\r
eof_ = false;\r
\r
THROW_ON_ERROR(ret, "av_read_frame", print());\r
-\r
- if(packet->stream_index == default_stream_index_)\r
- ++frame_number_;\r
-\r
+ \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
\r
auto time_base = format_context_->streams[packet->stream_index]->time_base;\r
packet->pts = static_cast<uint64_t>((static_cast<double>(packet->pts * time_base.num)/time_base.den)*fps_);\r
- \r
- buffer_.try_push(packet);\r
- buffer_size_ += packet->size;\r
+ frame_number_ = static_cast<uint32_t>(packet->pts);\r
+\r
+ if(frame_number_ <= frame_number_)\r
+ {\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
+ 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
\r
if(!eof_)\r
//if(ret == AVERROR_EOF)\r
// CASPAR_LOG(trace) << print() << " Received EOF. ";\r
\r
- return ret == AVERROR_EOF || ret == AVERROR(EIO) || frame_number_ >= length_; // av_read_frame doesn't always correctly return AVERROR_EOF;\r
+ return ret == AVERROR_EOF || ret == AVERROR(EIO) || frame_number_ > length_; // av_read_frame doesn't always correctly return AVERROR_EOF;\r
}\r
};\r
\r