tbb::atomic<uint32_t> start_; \r
tbb::atomic<uint32_t> length_;\r
tbb::atomic<bool> loop_;\r
- bool eof_;\r
+ tbb::atomic<bool> eof_;\r
double fps_;\r
uint32_t frame_number_;\r
\r
stream video_stream_;\r
stream audio_stream_;\r
\r
- uint32_t seek_target_;\r
+ tbb::atomic<uint32_t> seek_target_;\r
\r
tbb::atomic<bool> is_running_;\r
boost::mutex mutex_;\r
, format_context_(open_input(filename)) \r
, default_stream_index_(av_find_default_stream_index(format_context_.get()))\r
, filename_(filename)\r
- , eof_(false)\r
- , fps_(read_fps(*format_context_, 0.0))\r
, frame_number_(0)\r
- , seek_target_(start_)\r
+ , fps_(read_fps(*format_context_, 0.0))\r
, video_stream_(av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_VIDEO, -1, -1, 0, 0))\r
, audio_stream_(av_find_best_stream(format_context_.get(), AVMEDIA_TYPE_AUDIO, -1, -1, 0, 0))\r
{ \r
start_ = start;\r
length_ = length;\r
loop_ = loop;\r
+ eof_ = false;\r
+ seek_target_ = start_ != 0 ? start_ : std::numeric_limits<uint32_t>::max();\r
is_running_ = true;\r
thread_ = boost::thread([this]{run();});\r
\r
graph_->set_color("seek", diagnostics::color(1.0f, 0.5f, 0.0f)); \r
graph_->set_color("audio-buffer", diagnostics::color(0.7f, 0.4f, 0.4f));\r
- graph_->set_color("video-buffer", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
+ graph_->set_color("video-buffer", diagnostics::color(1.0f, 1.0f, 0.0f)); \r
+ \r
+ while(!full())\r
+ tick();\r
}\r
\r
~impl()\r
eof_ = false;\r
}\r
\r
+ while(!full())\r
+ tick();\r
+\r
cond_.notify_one();\r
}\r
\r
\r
void tick()\r
{\r
- if(seek_target_ != std::numeric_limits<uint32_t>::max()) \r
- {\r
- internal_seek(seek_target_);\r
- seek_target_ = std::numeric_limits<uint32_t>::max();\r
- }\r
+ auto target = seek_target_.fetch_and_store(std::numeric_limits<uint32_t>::max());\r
+ if(target != std::numeric_limits<uint32_t>::max()) \r
+ internal_seek(target);\r
\r
auto packet = create_packet();\r
\r