\r
struct ffmpeg_producer : public core::frame_producer\r
{\r
- const std::wstring filename_;\r
+ const std::wstring filename_;\r
\r
- const safe_ptr<diagnostics::graph> graph_;\r
- boost::timer frame_timer_;\r
- boost::timer video_timer_;\r
- boost::timer audio_timer_;\r
+ const safe_ptr<diagnostics::graph> graph_;\r
+ boost::timer frame_timer_;\r
+ boost::timer video_timer_;\r
+ boost::timer audio_timer_;\r
\r
- const safe_ptr<core::frame_factory> frame_factory_;\r
- const core::video_format_desc format_desc_;\r
+ const safe_ptr<core::frame_factory> frame_factory_;\r
+ const core::video_format_desc format_desc_;\r
\r
- input input_; \r
- std::unique_ptr<video_decoder> video_decoder_;\r
- std::unique_ptr<audio_decoder> audio_decoder_; \r
- std::unique_ptr<frame_muxer> muxer_;\r
+ input input_; \r
+ std::unique_ptr<video_decoder> video_decoder_;\r
+ std::unique_ptr<audio_decoder> audio_decoder_; \r
+ std::unique_ptr<frame_muxer> muxer_;\r
\r
- const int start_;\r
- const bool loop_;\r
- const size_t length_;\r
+ const int start_;\r
+ const bool loop_;\r
+ const size_t length_;\r
\r
- safe_ptr<core::basic_frame> last_frame_;\r
+ safe_ptr<core::basic_frame> last_frame_;\r
\r
- std::queue<safe_ptr<core::basic_frame>> frame_buffer_;\r
+ std::queue<std::pair<safe_ptr<core::basic_frame>, size_t>> frame_buffer_;\r
\r
- int64_t frame_number_;\r
- int64_t file_frame_number_;;\r
+ int64_t frame_number_;\r
+ int64_t file_frame_number_;;\r
\r
public:\r
explicit ffmpeg_producer(const safe_ptr<core::frame_factory>& frame_factory, const std::wstring& filename, const std::wstring& filter, bool loop, int start, size_t length) \r
return core::basic_frame::late(); \r
}\r
\r
- last_frame_ = frame_buffer_.front(); \r
+ auto frame = frame_buffer_.front(); \r
frame_buffer_.pop();\r
+ \r
+ ++frame_number_;\r
+ file_frame_number_ = frame.second;\r
\r
graph_->set_text(print());\r
\r
- ++frame_number_;\r
- return last_frame_;\r
+ return last_frame_ = frame.first;\r
}\r
\r
virtual safe_ptr<core::basic_frame> last_frame() const override\r
\r
virtual int64_t file_frame_number() const override\r
{\r
- return std::max<int64_t>(0, file_frame_number_-frame_buffer_.size()+1);\r
+ return file_frame_number_;\r
}\r
\r
virtual boost::unique_future<std::wstring> call(const std::wstring& param) override\r
[&]\r
{\r
if(!muxer_->video_ready() && video_decoder_) \r
- {\r
video = video_decoder_->poll(); \r
- file_frame_number_ = video_decoder_->file_frame_number();\r
- }\r
},\r
[&]\r
{ \r
if(!muxer_->audio_ready() && audio_decoder_) \r
- {\r
audio = audio_decoder_->poll(); \r
- file_frame_number_ = video_decoder_->file_frame_number();\r
- } \r
});\r
\r
muxer_->push(video, hints);\r
muxer_->push(empty_video(), 0);\r
}\r
\r
+ size_t file_frame_number = 0;\r
+ file_frame_number = std::max(file_frame_number, video_decoder_ ? video_decoder_->file_frame_number() : 0);\r
+ file_frame_number = std::max(file_frame_number, audio_decoder_ ? audio_decoder_->file_frame_number() : 0);\r
+\r
for(auto frame = muxer_->poll(); frame; frame = muxer_->poll())\r
- frame_buffer_.push(make_safe_ptr(frame));\r
+ frame_buffer_.push(std::make_pair(make_safe_ptr(frame), file_frame_number));\r
}\r
};\r
\r