85 lines
1.8 KiB
C++
85 lines
1.8 KiB
C++
#include "AppState.h"
|
|
#include "AppConfig.h"
|
|
#include "D3DProcessor.h"
|
|
#include "DeckLinkPipeline.h"
|
|
#include "ShaderLibrary.h"
|
|
#include "WebServer.h"
|
|
|
|
#include <combaseapi.h>
|
|
|
|
#include <atomic>
|
|
#include <chrono>
|
|
#include <csignal>
|
|
#include <iostream>
|
|
#include <thread>
|
|
|
|
namespace
|
|
{
|
|
std::atomic<bool> 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<unsigned long>(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;
|
|
}
|