1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
// VideoStitch BackendLibHelper
#include "libgpudiscovery/backendLibHelper.hpp"
#include "backendLibLoader.hpp"
namespace VideoStitch {
namespace BackendLibHelper {
#ifdef _MSC_VER
// Define hook function for delay load libvideostitch.dll
FARPROC WINAPI vsDelayHook(unsigned dliNotify, PDelayLoadInfo pdli) {
// check if we have the library to delay load in our map
if (lstrcmp(pdli->szDll, BackendLibLoader::getDefaultVsLib().c_str()) != 0) {
return NULL;
}
// check if hook function is called for loading the lib
if (dliNotify != dliNotePreLoadLibrary) {
return NULL;
}
HMODULE dll = BackendLibLoader::getInstance().getBackendHandler();
if (dll == NULL) {
assert(false);
std::cerr << "Error: VideoStitch library handle is invalid" << std::endl;
return NULL;
}
return (FARPROC)dll;
}
#endif
bool isBackendAvailable(const Discovery::Framework& framework) {
switch (framework) {
case Discovery::Framework::CUDA:
case Discovery::Framework::OpenCL:
return BackendLibLoader::getInstance().isBackendAvailable(framework);
case Discovery::Framework::Unknown:
default:
return false;
}
}
bool selectBackend(const Discovery::Framework& framework, bool* needToRestart) {
switch (framework) {
case Discovery::Framework::CUDA:
case Discovery::Framework::OpenCL:
return BackendLibLoader::getInstance().selectBackend(framework, needToRestart);
case Discovery::Framework::Unknown:
default:
if (needToRestart != nullptr) {
*needToRestart = false;
}
return false;
}
}
Discovery::Framework getBestFrameworkAndBackend() {
if (Discovery::isFrameworkAvailable(Discovery::Framework::CUDA) && isBackendAvailable(Discovery::Framework::CUDA)) {
return Discovery::Framework::CUDA;
} else if (Discovery::isFrameworkAvailable(Discovery::Framework::OpenCL) &&
isBackendAvailable(Discovery::Framework::OpenCL)) {
return Discovery::Framework::OpenCL;
}
return Discovery::Framework::Unknown;
}
#ifdef __APPLE__
void forceUpdateSymlink() { BackendLibLoader::getInstance().forceUpdateVsSymlink(); }
#endif
} // namespace BackendLibHelper
} // namespace VideoStitch