- auto packet = std::make_shared<aligned_buffer>(read_packet->data, read_packet->data + read_packet->size);\r
- if(read_packet->stream_index == video_s_index_) \r
- video_packet_buffer_.try_push(std::move(packet)); \r
- else if(read_packet->stream_index == audio_s_index_) \r
- audio_packet_buffer_.try_push(std::move(packet)); \r
+ AVPacket tmp_packet;\r
+ safe_ptr<AVPacket> read_packet(&tmp_packet, av_free_packet); \r
+\r
+ auto read_frame_ret = av_read_frame(format_context_.get(), read_packet.get());\r
+ if(read_frame_ret == AVERROR_EOF || read_frame_ret == AVERROR_IO)\r
+ {\r
+ if(loop_)\r
+ {\r
+ auto seek_frame_ret = av_seek_frame(format_context_.get(), -1, 0, AVSEEK_FLAG_BACKWARD);\r
+ if(seek_frame_ret >= 0)\r
+ graph_->add_tag("seek");\r
+ else\r
+ {\r
+ BOOST_THROW_EXCEPTION(\r
+ invalid_operation() <<\r
+ boost::errinfo_api_function("av_seek_frame") <<\r
+ boost::errinfo_errno(AVUNERROR(seek_frame_ret)));\r
+ } \r
+ } \r
+ else\r
+ stop();\r
+ }\r
+ else if(read_frame_ret < 0)\r
+ {\r
+ BOOST_THROW_EXCEPTION(\r
+ invalid_operation() <<\r
+ boost::errinfo_api_function("av_read_frame") <<\r
+ boost::errinfo_errno(AVUNERROR(read_frame_ret)));\r
+ }\r
+ else\r
+ {\r
+ auto packet = std::make_shared<aligned_buffer>(read_packet->data, read_packet->data + read_packet->size);\r
+ if(read_packet->stream_index == video_s_index_) \r
+ video_packet_buffer_.try_push(std::move(packet)); \r
+ else if(read_packet->stream_index == audio_s_index_) \r
+ audio_packet_buffer_.try_push(std::move(packet)); \r
+ }\r
+ \r
+ graph_->update_value("input-buffer", static_cast<float>(video_packet_buffer_.size())/static_cast<float>(PACKET_BUFFER_COUNT)); \r