#pragma warning (pop)\r
#endif\r
\r
+typedef int (*PFNWGLEXTGETSWAPINTERVALPROC) (void);\r
+ \r
namespace caspar { namespace ogl {\r
\r
enum stretch\r
\r
struct configuration\r
{\r
+ enum aspect_ratio\r
+ {\r
+ aspect_4_3 = 0,\r
+ aspect_16_9,\r
+ aspect_invalid,\r
+ };\r
+ \r
std::wstring name;\r
size_t screen_index;\r
stretch stretch;\r
bool windowed;\r
bool auto_deinterlace;\r
bool key_only;\r
+ aspect_ratio aspect; \r
+ bool vsync;\r
\r
configuration()\r
: name(L"ogl")\r
, windowed(true)\r
, auto_deinterlace(true)\r
, key_only(false)\r
+ , aspect(aspect_invalid)\r
+ , vsync(false)\r
{\r
}\r
};\r
\r
GLuint texture_;\r
std::vector<GLuint> pbos_;\r
- \r
+ \r
float width_;\r
float height_; \r
unsigned int screen_x_;\r
, square_height_(format_desc.square_height)\r
, filter_(format_desc.field_mode == core::field_mode::progressive || !config.auto_deinterlace ? L"" : L"YADIF=0:-1", boost::assign::list_of(PIX_FMT_BGRA))\r
{ \r
+ if(format_desc_.format == core::video_format::ntsc && config_.aspect == configuration::aspect_4_3)\r
+ {\r
+ // Use default values which are 4:3.\r
+ }\r
+ else\r
+ {\r
+ if(config_.aspect == configuration::aspect_16_9)\r
+ square_width_ = (format_desc.height*16)/9;\r
+ else if(config_.aspect == configuration::aspect_4_3)\r
+ square_width_ = (format_desc.height*4)/3;\r
+ }\r
+\r
frame_buffer_.set_capacity(2);\r
\r
- graph_->add_guide("tick-time", 0.5);\r
graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); \r
graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f));\r
graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
screen_y_ = devmode.dmPosition.y;\r
screen_width_ = config_.windowed ? square_width_ : devmode.dmPelsWidth;\r
screen_height_ = config_.windowed ? square_height_ : devmode.dmPelsHeight;\r
- \r
+\r
is_running_ = true;\r
thread_ = boost::thread([this]{run();});\r
}\r
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbos_[1]);\r
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, format_desc_.size, 0, GL_STREAM_DRAW_ARB);\r
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);\r
+ \r
+ if(config_.vsync)\r
+ {\r
+ auto wglSwapIntervalEXT = reinterpret_cast<void(APIENTRY*)(int)>(wglGetProcAddress("wglSwapIntervalEXT"));\r
+ if(wglSwapIntervalEXT)\r
+ {\r
+ wglSwapIntervalEXT(1);\r
+ CASPAR_LOG(info) << print() << " Successfully enabled vsync.";\r
+ }\r
+ else\r
+ CASPAR_LOG(info) << print() << " Failed to enable vsync.";\r
+ }\r
\r
CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
}\r
\r
perf_timer_.restart();\r
render(frame);\r
- graph_->update_value("frame-time", perf_timer_.elapsed()*format_desc_.fps*0.5); \r
+ graph_->set_value("frame-time", perf_timer_.elapsed()*format_desc_.fps*0.5); \r
\r
window_.Display();\r
\r
- graph_->update_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5); \r
+ graph_->set_value("tick-time", tick_timer_.elapsed()*format_desc_.fps*0.5); \r
tick_timer_.restart();\r
}\r
catch(...)\r
bool send(const safe_ptr<core::read_frame>& frame)\r
{\r
if(!frame_buffer_.try_push(frame))\r
- graph_->add_tag("dropped-frame");\r
+ graph_->set_tag("dropped-frame");\r
return is_running_;\r
}\r
\r
if(device_it != params.end() && ++device_it != params.end())\r
config.screen_index = boost::lexical_cast<int>(*device_it);\r
\r
- config.key_only = std::find(params.begin(), params.end(), L"WINDOWED") != params.end();\r
+ config.windowed = std::find(params.begin(), params.end(), L"FULLSCREEN") == params.end();\r
config.key_only = std::find(params.begin(), params.end(), L"KEY_ONLY") != params.end();\r
\r
auto name_it = std::find(params.begin(), params.end(), L"NAME");\r
config.windowed = ptree.get(L"windowed", config.windowed);\r
config.key_only = ptree.get(L"key-only", config.key_only);\r
config.auto_deinterlace = ptree.get(L"auto-deinterlace", config.auto_deinterlace);\r
- \r
+ config.vsync = ptree.get(L"vsync", config.vsync);\r
+\r
auto stretch_str = ptree.get(L"stretch", L"default");\r
if(stretch_str == L"uniform")\r
config.stretch = stretch::uniform;\r
else if(stretch_str == L"uniform_to_fill")\r
config.stretch = stretch::uniform_to_fill;\r
+\r
+ auto aspect_str = ptree.get(L"aspect-ratio", L"default");\r
+ if(aspect_str == L"16:9")\r
+ config.aspect = configuration::aspect_16_9;\r
+ else if(aspect_str == L"4:3")\r
+ config.aspect = configuration::aspect_4_3;\r
\r
return make_safe<ogl_consumer_proxy>(config);\r
}\r