struct ffmpeg_producer : public core::frame_producer\r
{\r
static const size_t DECODED_PACKET_BUFFER_SIZE = 4;\r
- static const size_t MAX_PACKET_OFFSET = 64; // 64 packets should be enough. Otherwise there probably was an error and we want to avoid infinite looping.\r
+ static const size_t MAX_PACKET_OFFSET = 64; // Avoid infinite looping.\r
\r
const std::wstring filename_;\r
const bool loop_;\r
\r
double frame_time = 1.0f/input_.fps();\r
double format_frame_time = 1.0/frame_factory->get_video_format_desc().fps;\r
- if(abs(frame_time - format_frame_time) > 0.0001)\r
+ if(abs(frame_time - format_frame_time) > 0.0001 && abs(frame_time - format_frame_time/2) > 0.0001)\r
CASPAR_LOG(warning) << print() << L" Invalid framerate detected. This may cause distorted audio during playback. frame-time: " << frame_time;\r
\r
try\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- video_decoder_.reset();\r
- CASPAR_LOG(warning) << print() << " removed video-stream.";\r
+ CASPAR_LOG(warning) << print() << " failed to initialize video-decoder.";\r
}\r
\r
try\r
catch(...)\r
{\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- audio_decoder_.reset();\r
- CASPAR_LOG(warning) << print() << " removed audio-stream.";\r
+ CASPAR_LOG(warning) << print() << " failed to initialize audio-decoder.";\r
} \r
\r
if(!video_decoder_ && !audio_decoder_)\r
frame_timer_.restart();\r
\r
std::shared_ptr<core::basic_frame> frame; \r
- for(size_t n = 0; !frame && n < MAX_PACKET_OFFSET; ++n) \r
+ for(size_t n = 0; !frame && input_.has_packet() && n < MAX_PACKET_OFFSET ; ++n) \r
frame = try_decode_frame();\r
\r
graph_->update_value("frame-time", static_cast<float>(frame_timer_.elapsed()*frame_factory_->get_video_format_desc().fps*0.5));\r
\r
std::shared_ptr<core::basic_frame> try_decode_frame()\r
{\r
- if(!input_.has_packet())\r
- return nullptr;\r
-\r
tbb::parallel_invoke\r
(\r
[&]\r
\r
try\r
{\r
- boost::range::push_back(video_frame_buffer_, video_decoder_->execute(this, video_packet));\r
+ boost::range::push_back(video_frame_buffer_, video_decoder_->execute(video_packet));\r
}\r
catch(...)\r
{\r
}\r
}\r
\r
- std::vector<safe_ptr<core::write_frame>> execute(void* tag, const packet& video_packet)\r
+ std::vector<safe_ptr<core::write_frame>> execute(const packet& video_packet)\r
{ \r
std::vector<safe_ptr<core::write_frame>> result;\r
\r
}\r
\r
if(frame_finished != 0) \r
- result.push_back(make_write_frame(tag, decoded_frame));\r
+ result.push_back(make_write_frame(decoded_frame));\r
}\r
\r
return result;\r
}\r
\r
- safe_ptr<core::write_frame> make_write_frame(void* tag, safe_ptr<AVFrame> decoded_frame)\r
+ safe_ptr<core::write_frame> make_write_frame(safe_ptr<AVFrame> decoded_frame)\r
{ \r
- auto write = frame_factory_->create_frame(tag, desc_);\r
+ auto write = frame_factory_->create_frame(this, desc_);\r
if(sws_context_ == nullptr)\r
{\r
tbb::parallel_for(0, static_cast<int>(desc_.planes.size()), 1, [&](int n)\r
};\r
\r
video_decoder::video_decoder(AVCodecContext& codec_context, const safe_ptr<core::frame_factory>& frame_factory) : impl_(new implementation(codec_context, frame_factory)){}\r
-std::vector<safe_ptr<core::write_frame>> video_decoder::execute(void* tag, const packet& video_packet){return impl_->execute(tag, video_packet);}\r
+std::vector<safe_ptr<core::write_frame>> video_decoder::execute(const packet& video_packet){return impl_->execute(video_packet);}\r
\r
}
\ No newline at end of file