#include "AppState.h" #include "AppConfig.h" #include "D3DProcessor.h" #include "DeckLinkPipeline.h" #include "ShaderLibrary.h" #include "WebServer.h" #include #include #include #include #include #include namespace { std::atomic g_running = true; void signalHandler(int) { g_running = false; } } int main() { std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED); if (FAILED(hr)) { std::cerr << "CoInitializeEx failed: 0x" << std::hex << static_cast(hr) << "\n"; return 1; } AppState appState; D3DProcessor processor; try { auto shaders = loadShaders(APP_SHADER_DIR); appState.setShaders(shaders); std::string error; if (!processor.initialize(shaders.front(), error)) { std::cerr << "Shader/D3D initialization failed:\n" << error << "\n"; CoUninitialize(); return 1; } } catch (const std::exception& ex) { std::cerr << ex.what() << "\n"; CoUninitialize(); return 1; } DeckLinkPipeline pipeline(appState, processor); std::string error; if (!pipeline.initialize(error)) { appState.setError(error); std::cerr << error << "\n"; } WebServer webServer(appState, pipeline, APP_CONTENT_DIR); if (!webServer.start(8080, error)) { std::cerr << error << "\n"; CoUninitialize(); return 1; } std::cout << "video-shader is running at http://127.0.0.1:8080\n"; while (g_running) std::this_thread::sleep_for(std::chrono::milliseconds(200)); webServer.stop(); pipeline.stop(); CoUninitialize(); return 0; }