class timer\r
{\r
public:\r
- timer(double fps = 25.0) : fps_(fps)\r
+ timer()\r
{\r
QueryPerformanceFrequency(&freq_);\r
- time_.QuadPart = 0;\r
- }\r
-\r
- void wait()\r
- {\r
- wait(fps_);\r
+ QueryPerformanceCounter(&time_);\r
}\r
\r
// Author: Ryan M. Geiss\r
}\r
\r
time_ = t;\r
- }\r
- \r
-private:\r
- \r
+ } \r
+private: \r
LARGE_INTEGER freq_;\r
LARGE_INTEGER time_;\r
- double fps_;\r
};\r
\r
}
\ No newline at end of file
{\r
case video_format::pal: return VID_FMT_PAL;\r
//case video_format::ntsc: return VID_FMT_NTSC;\r
- case video_format::x576p2500: return VID_FMT_INVALID; //not supported\r
+ //case video_format::x576p2500: return VID_FMT_INVALID; //not supported\r
case video_format::x720p2500: return VID_FMT_720P_2500;\r
- case video_format::x720p5000: return VID_FMT_720P_5000;\r
+ //case video_format::x720p5000: return VID_FMT_720P_5000;\r
//case video_format::x720p5994: return VID_FMT_720P_5994;\r
//case video_format::x720p6000: return VID_FMT_720P_6000;\r
//case video_format::x1080p2397: return VID_FMT_1080P_2397;\r
{\r
case video_format::pal: return bmdModePAL;\r
//case video_format::ntsc: return bmdModeNTSC;\r
- case video_format::x576p2500: return ULONG_MAX; //not supported\r
- case video_format::x720p5000: return bmdModeHD720p50;\r
+ //case video_format::x576p2500: return ULONG_MAX;\r
+ case video_format::x720p2500: return ULONG_MAX;\r
+ //case video_format::x720p5000: return bmdModeHD720p50;\r
//case video_format::x720p5994: return bmdModeHD720p5994;\r
//case video_format::x720p6000: return bmdModeHD720p60;\r
//case video_format::x1080p2397: return bmdModeHD1080p2398;\r
executor_.set_capacity(3);\r
executor_.start();\r
}\r
- \r
- void tick(const safe_ptr<const read_frame>& frame)\r
- {\r
- buffer_.push_back(frame);\r
- \r
- boost::range::for_each(consumers_, [&](const safe_ptr<frame_consumer>& consumer)\r
- {\r
- size_t offset = max_depth_ - consumer->buffer_depth();\r
- if(offset < buffer_.size())\r
- consumer->send(*(buffer_.begin() + offset));\r
- });\r
\r
- frame_consumer::sync_mode sync = frame_consumer::ready;\r
- boost::range::for_each(consumers_, [&](const safe_ptr<frame_consumer>& consumer)\r
+ void consume(safe_ptr<const read_frame>&& frame)\r
+ { \r
+ executor_.begin_invoke([=]\r
{\r
- try\r
+ buffer_.push_back(frame);\r
+ \r
+ boost::range::for_each(consumers_, [&](const safe_ptr<frame_consumer>& consumer)\r
{\r
size_t offset = max_depth_ - consumer->buffer_depth();\r
- if(offset >= buffer_.size())\r
- return;\r
-\r
- if(consumer->synchronize() == frame_consumer::clock)\r
- sync = frame_consumer::clock;\r
- }\r
- catch(...)\r
+ if(offset < buffer_.size())\r
+ consumer->send(*(buffer_.begin() + offset));\r
+ });\r
+ \r
+ frame_consumer::sync_mode sync = frame_consumer::ready;\r
+ boost::range::for_each(consumers_, [&](const safe_ptr<frame_consumer>& consumer)\r
{\r
- CASPAR_LOG_CURRENT_EXCEPTION();\r
- boost::range::remove_erase(consumers_, consumer);\r
- CASPAR_LOG(warning) << "Removed consumer from frame_consumer_device.";\r
- }\r
- });\r
- \r
- if(sync != frame_consumer::clock)\r
- clock_.wait();\r
+ try\r
+ {\r
+ size_t offset = max_depth_ - consumer->buffer_depth();\r
+ if(offset >= buffer_.size())\r
+ return;\r
\r
- if(buffer_.size() >= max_depth_)\r
- buffer_.pop_front();\r
- }\r
+ if(consumer->synchronize() == frame_consumer::clock)\r
+ sync = frame_consumer::clock;\r
+ }\r
+ catch(...)\r
+ {\r
+ CASPAR_LOG_CURRENT_EXCEPTION();\r
+ boost::range::remove_erase(consumers_, consumer);\r
+ CASPAR_LOG(warning) << "Removed consumer from frame_consumer_device.";\r
+ }\r
+ });\r
+ \r
+ if(sync != frame_consumer::clock)\r
+ clock_.wait(fmt_.actual_fps);\r
\r
- void consume(safe_ptr<const read_frame>&& frame)\r
- { \r
- executor_.begin_invoke([=]{tick(frame);});\r
+ if(buffer_.size() >= max_depth_)\r
+ buffer_.pop_front();\r
+ });\r
}\r
\r
timer clock_;\r
\r
std::vector<safe_ptr<frame_consumer>> consumers_;\r
\r
- const video_format_desc& fmt_;\r
+ const video_format_desc fmt_;\r
};\r
\r
frame_consumer_device::frame_consumer_device(frame_consumer_device&& other) : impl_(std::move(other.impl_)){}\r
{ \r
DEFINE_VIDEOFORMATDESC(720, 576, video_mode::upper, 50, TEXT("PAL"), video_format::pal ), \r
//DEFINE_VIDEOFORMATDESC(720, 486, video_mode::lower, 60/1.001, TEXT("NTSC"), video_format::ntsc ), \r
- DEFINE_VIDEOFORMATDESC(720, 576, video_mode::progressive, 25, TEXT("576p2500"), video_format::x576p2500 ),\r
+ //DEFINE_VIDEOFORMATDESC(720, 576, video_mode::progressive, 25, TEXT("576p2500"), video_format::x576p2500 ),\r
DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 25, TEXT("720p2500"), video_format::x720p2500 ), \r
- DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 50, TEXT("720p5000"), video_format::x720p5000 ), \r
+ //DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 50, TEXT("720p5000"), video_format::x720p5000 ), \r
//DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 60/1.001, TEXT("720p5994"), video_format::x720p5994 ),\r
//DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 60, TEXT("720p6000"), video_format::x720p6000 ),\r
//DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive, 24/1.001, TEXT("1080p2397"), video_format::x1080p2397),\r
{\r
pal = 0,\r
//ntsc,\r
- x576p2500,\r
+ //x576p2500,\r
x720p2500,\r
- x720p5000,\r
+ //x720p5000,\r
//x720p5994,\r
//x720p6000,\r
//x1080p2397,\r
return draw_frame::empty();\r
\r
auto frame = render_simple_frame();\r
- \r
- auto running_fps = static_cast<int>(ax_->GetFPS());\r
- auto target_fps = static_cast<int>(format_desc_.actual_fps);\r
- if(target_fps < running_fps)\r
+ if(ax_->GetFPS()/2.0 - format_desc_.actual_fps >= 0.0)\r
frame = draw_frame::interlace(frame, render_simple_frame(), format_desc_.mode);\r
return frame;\r
}\r
{\r
::OleInitialize(nullptr);\r
});\r
-\r
- frame_buffer_.set_capacity(8);\r
- while(frame_buffer_.try_push(draw_frame::empty())){}\r
}\r
\r
~implementation()\r
virtual void initialize(const safe_ptr<frame_processor_device>& frame_processor)\r
{\r
frame_processor_ = frame_processor;\r
+ frame_buffer_.set_capacity(static_cast<size_t>(frame_processor->get_video_format_desc().actual_fps/2.0));\r
+ while(frame_buffer_.try_push(draw_frame::empty())){}\r
executor_.start();\r
}\r
\r
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\</IntDir>\r
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\dependencies\BluefishSDK_V5_8_0_31\Inc\;..\..\..\dependencies\BluefishSDK_V5_8_0_31\Inc\;..\..\dependencies\boost_1_44_0\;..\..\..\dependencies\boost_1_44_0\;..\..\dependencies\ffmpeg 0.6\include\;..\..\..\dependencies\ffmpeg 0.6\include\;..\..\dependencies\FreeImage\Dist\;..\..\..\dependencies\FreeImage\Dist\;..\..\dependencies\GLee5_4\;..\..\..\dependencies\GLee5_4\;..\..\dependencies\SFML-1.6\include\;..\..\..\dependencies\SFML-1.6\include\;..\..\dependencies\tbb30_20100406oss\include\;..\..\..\dependencies\tbb30_20100406oss\include\;$(IncludePath)</IncludePath>\r
<IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\dependencies\BluefishSDK_V5_8_0_31\Inc\;..\..\..\dependencies\BluefishSDK_V5_8_0_31\Inc\;..\..\dependencies\boost_1_44_0\;..\..\..\dependencies\boost_1_44_0\;..\..\dependencies\ffmpeg 0.6\include\;..\..\..\dependencies\ffmpeg 0.6\include\;..\..\dependencies\FreeImage\Dist\;..\..\..\dependencies\FreeImage\Dist\;..\..\dependencies\GLee5_4\;..\..\..\dependencies\GLee5_4\;..\..\dependencies\SFML-1.6\include\;..\..\..\dependencies\SFML-1.6\include\;..\..\dependencies\tbb30_20100406oss\include\;..\..\..\dependencies\tbb30_20100406oss\include\;$(IncludePath)</IncludePath>\r
- <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\dependencies\boost_1_44_0\stage\lib\;..\..\..\dependencies\boost_1_44_0\stage\lib\;..\..\dependencies\ffmpeg 0.6\lib\;..\..\..\dependencies\ffmpeg 0.6\lib\;..\..\dependencies\FreeImage\Dist\;..\..\..\dependencies\FreeImage\Dist\;..\..\dependencies\GLee5_4\;..\..\..\dependencies\GLee5_4\;..\..\dependencies\SFML-1.6\lib\;..\..\..\dependencies\SFML-1.6\lib\;..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;..\..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;$(LibraryPath)</LibraryPath>\r
+ <LibraryPath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Program\Microsoft DirectX SDK (June 2010)\Lib\x86;..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\dependencies\boost_1_44_0\stage\lib\;..\..\..\dependencies\boost_1_44_0\stage\lib\;..\..\dependencies\ffmpeg 0.6\lib\;..\..\..\dependencies\ffmpeg 0.6\lib\;..\..\dependencies\FreeImage\Dist\;..\..\..\dependencies\FreeImage\Dist\;..\..\dependencies\GLee5_4\;..\..\..\dependencies\GLee5_4\;..\..\dependencies\SFML-1.6\lib\;..\..\..\dependencies\SFML-1.6\lib\;..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;..\..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;$(LibraryPath)</LibraryPath>\r
<LibraryPath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Program\Microsoft DirectX SDK (June 2010)\Lib\x86;..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\..\dependencies\BluefishSDK_V5_8_0_31\Lib\;..\..\dependencies\boost_1_44_0\stage\lib\;..\..\..\dependencies\boost_1_44_0\stage\lib\;..\..\dependencies\ffmpeg 0.6\lib\;..\..\..\dependencies\ffmpeg 0.6\lib\;..\..\dependencies\FreeImage\Dist\;..\..\..\dependencies\FreeImage\Dist\;..\..\dependencies\GLee5_4\;..\..\..\dependencies\GLee5_4\;..\..\dependencies\SFML-1.6\lib\;..\..\..\dependencies\SFML-1.6\lib\;..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;..\..\..\dependencies\tbb30_20100406oss\lib\ia32\vc10\;$(LibraryPath)</LibraryPath>\r
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)debug\</OutDir>\r
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectDir)release\</OutDir>\r