std::wstring data;\r
boost::property_tree::ptree pt;\r
\r
-void do_setup()\r
+void env::initialize(const std::string& filename)\r
{\r
std::string initialPath = boost::filesystem::initial_path().file_string();\r
\r
- boost::property_tree::read_xml(initialPath + "\\caspar.config", pt);\r
+ boost::property_tree::read_xml(initialPath + "\\" + filename, pt);\r
\r
auto paths = pt.get_child("configuration.paths");\r
media = widen(paths.get("media-path", initialPath + "\\media\\"));\r
ftemplate_host = widen(paths.get("template-host-path", initialPath + "\\template\\cg.fth"));\r
data = widen(paths.get("data-path", initialPath + "\\data\\"));\r
}\r
-\r
-void setup()\r
-{\r
- static boost::once_flag setup_flag = BOOST_ONCE_INIT;\r
- boost::call_once(do_setup, setup_flag); \r
-}\r
\r
const std::wstring& env::media_folder()\r
{\r
- setup();\r
return media;\r
}\r
\r
const std::wstring& env::log_folder()\r
{\r
- setup();\r
return log;\r
}\r
\r
const std::wstring& env::template_folder()\r
{\r
- setup();\r
return ftemplate;\r
}\r
\r
const std::wstring& env::template_host()\r
{\r
- setup();\r
return ftemplate_host;\r
}\r
\r
\r
const std::wstring& env::data_folder()\r
{\r
- setup();\r
return data;\r
}\r
\r
\r
const boost::property_tree::ptree& env::properties()\r
{\r
- setup();\r
return pt;\r
}\r
\r
, pix_fmt_(codec_context_->pix_fmt)\r
, desc_(get_pixel_format_desc(pix_fmt_, width_, height_))\r
{\r
+ if(codec_context_->time_base.num == 1) // Some files give an invalid numerator, try to fix it.\r
+ codec_context_->time_base.num = static_cast<int>(std::pow(10.0, static_cast<int>(std::log10(static_cast<float>(codec_context_->time_base.den)))-1));\r
double frame_time = static_cast<double>(codec_context_->time_base.num) / static_cast<double>(codec_context_->time_base.den);\r
double format_frame_time = 1.0/frame_factory->get_video_format_desc().fps;\r
- double diff = abs(frame_time - format_frame_time);\r
- if(diff > 0.0001)\r
- BOOST_THROW_EXCEPTION(file_read_error() << msg_info("Invalid video framerate."));\r
+ if(abs(frame_time - format_frame_time) > 0.0001)\r
+ BOOST_THROW_EXCEPTION(file_read_error() << msg_info("Invalid video framerate.") << arg_value_info(boost::lexical_cast<std::string>(frame_time)));\r
\r
if(desc_.pix_fmt == pixel_format::invalid)\r
{\r
};\r
\r
int main(int argc, wchar_t* argv[])\r
-{\r
- // Init FFMPEG\r
- av_register_all();\r
- avcodec_init();\r
+{ \r
+ try \r
+ {\r
+ win32_handler_tbb_installer win32_handler_tbb_installer;\r
+ win32_exception::install_handler();\r
\r
- // Increase time precision\r
- timeBeginPeriod(1);\r
+ env::initialize("caspar.config");\r
\r
- // Start caspar\r
- std::wstringstream str;\r
- str << "CasparCG " << env::version();\r
- SetConsoleTitle(str.str().c_str());\r
+ // Init FFMPEG\r
+ av_register_all();\r
+ avcodec_init();\r
\r
- std::wcout << L"Copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\n" << std::endl;\r
- std::wcout << L"Starting CasparCG Video Playout Server Ver: " << env::version() << std::endl;\r
+ // Increase time precision\r
+ timeBeginPeriod(1);\r
\r
- EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);\r
- DrawMenuBar(GetConsoleWindow());\r
- MoveWindow(GetConsoleWindow(), 800, 0, 800, 1000, true);\r
+ // Start caspar\r
+ std::wstringstream str;\r
+ str << "CasparCG " << env::version();\r
+ SetConsoleTitle(str.str().c_str());\r
\r
-#ifdef _DEBUG\r
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );\r
- _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );\r
- _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );\r
- _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG );\r
+ std::wcout << L"Copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\n" << std::endl;\r
+ std::wcout << L"Starting CasparCG Video Playout Server Ver: " << env::version() << std::endl;\r
\r
- MessageBox(nullptr, TEXT("Now is the time to connect for remote debugging..."), TEXT("Debug"), MB_OK | MB_TOPMOST);\r
-#endif\r
+ EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);\r
+ DrawMenuBar(GetConsoleWindow());\r
+ MoveWindow(GetConsoleWindow(), 800, 0, 800, 1000, true);\r
\r
- log::add_file_sink(env::log_folder());\r
- \r
- win32_handler_tbb_installer win32_handler_tbb_installer;\r
- win32_exception::install_handler();\r
+ #ifdef _DEBUG\r
+ _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );\r
+ _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );\r
+ _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );\r
+ _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG );\r
+\r
+ MessageBox(nullptr, TEXT("Now is the time to connect for remote debugging..."), TEXT("Debug"), MB_OK | MB_TOPMOST);\r
+ #endif\r
+\r
+ log::add_file_sink(env::log_folder());\r
\r
- try \r
- {\r
bootstrapper caspar_device;\r
\r
auto dummy = std::make_shared<IO::DummyClientInfo>();\r
{\r
CASPAR_LOG(fatal) << "UNHANDLED EXCEPTION in main thread.";\r
CASPAR_LOG_CURRENT_EXCEPTION();\r
- std::wcout << L"Press Any Key To Exit";\r
+ std::wcout << L"Press Any Key To Exit\n";\r
_getwch();\r
} \r
\r