boost::range::rotate(audio_cadence_, std::begin(audio_cadence_)+1);\r
\r
// POLL\r
- \r
- for(auto frame = muxer_.poll(); frame; frame = muxer_.poll())\r
+\r
+ auto frame = core::draw_frame::late();\r
+ if(muxer_.try_pop(frame))\r
{\r
- if(!frame_buffer_.try_push(spl::make_shared_ptr(frame)))\r
+ if(!frame_buffer_.try_push(frame))\r
graph_->set_tag("dropped-frame");\r
}\r
-\r
+ \r
graph_->set_value("frame-time", frame_timer_.elapsed()*format_desc_.fps*0.5);\r
\r
graph_->set_value("output-buffer", static_cast<float>(frame_buffer_.size())/static_cast<float>(frame_buffer_.capacity())); \r
{ \r
boost::timer frame_timer;\r
\r
- std::shared_ptr<core::draw_frame> frame = try_decode_frame(flags);\r
+ auto frame = core::draw_frame::late(); \r
+ if(!try_decode_frame(frame, flags))\r
+ {\r
+ if(!input_.eof()) \r
+ graph_->set_tag("underflow"); \r
+ }\r
\r
graph_->set_value("frame-time", frame_timer.elapsed()*format_desc_.fps*0.5);\r
\r
<< monitor::event("file/fps") % fps_\r
<< monitor::event("filename") % u8(filename_)\r
<< monitor::event("loop") % input_.loop();\r
- \r
- if(!frame)\r
+ \r
+ graph_->set_text(print());\r
+\r
+ if(frame != core::draw_frame::late())\r
{\r
- if(!input_.eof()) \r
- graph_->set_tag("underflow"); \r
- return core::draw_frame::late();\r
+ ++frame_number_;\r
+ last_frame_ = frame;\r
}\r
\r
- ++frame_number_;\r
-\r
- graph_->set_text(print());\r
- \r
- if(frame != core::draw_frame::late())\r
- last_frame_ = spl::make_shared_ptr(frame);\r
-\r
- return spl::make_shared_ptr(frame);\r
+ return frame;\r
}\r
\r
virtual spl::shared_ptr<core::draw_frame> last_frame() const override\r
BOOST_THROW_EXCEPTION(invalid_argument());\r
}\r
\r
- std::shared_ptr<core::draw_frame> try_decode_frame(int flags)\r
+ bool try_decode_frame(spl::shared_ptr<core::draw_frame>& result, int flags)\r
{\r
- std::shared_ptr<core::draw_frame> result = muxer_->poll();\r
-\r
- for(int n = 0; n < 32 && !result; ++n, result = muxer_->poll())\r
+ for(int n = 0; n < 32; ++n)\r
{\r
+ if(muxer_->try_pop(result)) \r
+ return true; \r
+\r
std::shared_ptr<AVPacket> pkt;\r
\r
for(int n = 0; n < 32 && ((video_decoder_ && !video_decoder_->ready()) || (audio_decoder_ && !audio_decoder_->ready())) && input_.try_pop(pkt); ++n)\r
}\r
}\r
\r
- return result;\r
+ return false;\r
}\r
};\r
\r
}\r
}\r
\r
- std::shared_ptr<draw_frame> poll()\r
+ bool try_pop(spl::shared_ptr<core::draw_frame>& result)\r
{\r
if(!frame_buffer_.empty())\r
{\r
- auto frame = frame_buffer_.front();\r
+ result = std::move(frame_buffer_.front());\r
frame_buffer_.pop(); \r
- return frame;\r
+ return true;\r
}\r
\r
if(video_streams_.size() > 1 && audio_streams_.size() > 1 && (!video_ready2() || !audio_ready2()))\r
}\r
\r
if(!video_ready2() || !audio_ready2() || display_mode_ == display_mode::invalid)\r
- return nullptr;\r
+ return false;\r
\r
auto frame1 = pop_video();\r
frame1->audio_data() = pop_audio();\r
}\r
}\r
\r
- return frame_buffer_.empty() ? nullptr : poll();\r
+ if(frame_buffer_.empty())\r
+ return false;\r
+\r
+ return try_pop(result);\r
}\r
\r
spl::shared_ptr<core::data_frame> pop_video()\r
: impl_(new impl(in_fps, frame_factory, filter)){}\r
void frame_muxer::push(const std::shared_ptr<AVFrame>& video_frame, int flags){impl_->push(video_frame, flags);}\r
void frame_muxer::push(const std::shared_ptr<core::audio_buffer>& audio_samples){return impl_->push(audio_samples);}\r
-std::shared_ptr<draw_frame> frame_muxer::poll(){return impl_->poll();}\r
+bool frame_muxer::try_pop(spl::shared_ptr<core::draw_frame>& result){return impl_->try_pop(result);}\r
uint32_t frame_muxer::calc_nb_frames(uint32_t nb_frames) const {return impl_->calc_nb_frames(nb_frames);}\r
bool frame_muxer::video_ready() const{return impl_->video_ready();}\r
bool frame_muxer::audio_ready() const{return impl_->audio_ready();}\r
bool video_ready() const;\r
bool audio_ready() const;\r
\r
- std::shared_ptr<core::draw_frame> poll();\r
+ bool try_pop(spl::shared_ptr<core::draw_frame>& result);\r
\r
uint32_t calc_nb_frames(uint32_t nb_frames) const;\r
private:\r