if(FAILED(input_->DoesSupportVideoMode((BMDDisplayMode)decklinkVideoFormat, bmdFormat8BitYUV, bmdVideoOutputFlagDefault, &displayModeSupport, nullptr)))\r
BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Card does not support requested videoformat."));\r
\r
- // NOTE: bmdFormat8BitARGB does not seem to work with Decklink HD Extreme 3D\r
+ // NOTE: bmdFormat8BitARGB is not supported.\r
if(FAILED(input_->EnableVideoInput((BMDDisplayMode)decklinkVideoFormat, bmdFormat8BitYUV, 0))) \r
BOOST_THROW_EXCEPTION(caspar_exception() << msg_info(narrow(print()) + " Could not enable video input."));\r
\r
return S_OK;\r
}\r
\r
- // TODO: Enable audio input\r
virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(IDeckLinkVideoInputFrame* video, IDeckLinkAudioInputPacket* audio)\r
{ \r
graph_->update_value("tick-time", static_cast<float>(perf_timer_.elapsed()/format_desc_.interval*0.5));\r
\r
double frame_time = 1.0/ax_->GetFPS();\r
\r
- if(has_underflow)\r
- {\r
- ax_->Tick();\r
- graph_->add_tag("underflow");\r
- }\r
+ if(!has_underflow) \r
+ timer_.tick(frame_time); \r
else\r
- {\r
- timer_.tick(frame_time); \r
- perf_timer_.restart();\r
-\r
- ax_->Tick();\r
- if(ax_->InvalidRect())\r
- { \r
- fast_memclr(bmp_data_, format_desc_.size);\r
- ax_->DrawControl(static_cast<HDC>(hdc_.get()));\r
+ graph_->add_tag("underflow");\r
+ \r
+ perf_timer_.restart();\r
+\r
+ ax_->Tick();\r
+ if(ax_->InvalidRect())\r
+ { \r
+ fast_memclr(bmp_data_, format_desc_.size);\r
+ ax_->DrawControl(static_cast<HDC>(hdc_.get()));\r
+ \r
+ auto frame = frame_factory_->create_frame(this);\r
+ fast_memcpy(frame->image_data().begin(), bmp_data_, format_desc_.size);\r
+ head_ = frame;\r
+ } \r
\r
- auto frame = frame_factory_->create_frame(this);\r
- fast_memcpy(frame->image_data().begin(), bmp_data_, format_desc_.size);\r
- head_ = frame;\r
- } \r
- }\r
\r
graph_->update_value("frame-time", static_cast<float>(perf_timer_.elapsed()/frame_time)*0.5f);\r
return head_;\r
{ \r
const std::wstring filename_; \r
tbb::atomic<int> fps_;\r
+ bool underfow_;\r
\r
std::shared_ptr<diagnostics::graph> graph_;\r
\r
init_renderer();\r
});\r
\r
- executor_.begin_invoke([=]\r
- {\r
- render();\r
- }); \r
-\r
fps_ = 0;\r
}\r
\r
{\r
renderer_.reset(new flash_renderer(safe_ptr<diagnostics::graph>(graph_), frame_factory_, filename_));\r
while(frame_buffer_.try_push(core::basic_frame::empty())){} \r
+ executor_.begin_invoke([=]\r
+ {\r
+ render(renderer_);\r
+ }); \r
}\r
\r
- void render()\r
+ void render(const std::shared_ptr<flash_renderer>& renderer)\r
{\r
- if(!renderer_)\r
+ if(renderer_ != renderer) // Make sure the recursive calls are only for a specific instance.\r
{\r
frame_buffer_.push(core::basic_frame::empty());\r
return;\r
auto frame = core::basic_frame::empty();\r
if(abs(renderer_->fps()/2.0 - format_desc_.fps) < 0.1) //flash 50, format 50i\r
{\r
- auto frame1 = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity()-3);\r
- auto frame2 = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity()-3);\r
+ auto frame1 = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity());\r
+ auto frame2 = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity());\r
frame_buffer_.push(core::basic_frame::interlace(frame1, frame2, format_desc_.mode));\r
frame = frame2;\r
}\r
else if(abs(renderer_->fps()- format_desc_.fps/2.0 ) < 0.1) //flash 25, format 50p\r
{\r
- frame = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity()-3);\r
+ frame = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity());\r
frame_buffer_.push(frame);\r
frame_buffer_.push(frame);\r
}\r
else //if(abs(renderer_->fps() - format_desc_.fps) < 0.1) // flash 25, format 50i or flash 50, format 50p\r
{\r
- frame = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity()-3);\r
+ frame = renderer_->render_frame(frame_buffer_.size() < frame_buffer_.capacity());\r
frame_buffer_.push(frame);\r
}\r
\r
\r
executor_.begin_invoke([=]\r
{\r
- render();\r
+ render(renderer);\r
}); \r
}\r
catch(...)\r