diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 0f54c67fd..dbeead7a7 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -3,6 +3,7 @@ if(WIN32) add_subdirectory(win-wasapi) add_subdirectory(win-dshow) add_subdirectory(win-capture) + add_subdirectory(decklink/win) elseif(APPLE) add_subdirectory(mac-avcapture) add_subdirectory(mac-capture) diff --git a/plugins/decklink/platform.hpp b/plugins/decklink/platform.hpp index 739ab3fa4..0be43f458 100644 --- a/plugins/decklink/platform.hpp +++ b/plugins/decklink/platform.hpp @@ -1,7 +1,12 @@ #pragma once #if defined(_WIN32) -// TODO: Windows support +#include +typedef BSTR decklink_string_t; +IDeckLinkDiscovery *CreateDeckLinkDiscoveryInstance(void); +#define IUnknownUUID IID_IUnknown +typedef REFIID CFUUIDBytes; +#define CFUUIDGetUUIDBytes(x) x #elif defined(__APPLE__) #include "mac/decklink-sdk/DeckLinkAPI.h" #include diff --git a/plugins/decklink/win/CMakeLists.txt b/plugins/decklink/win/CMakeLists.txt new file mode 100644 index 000000000..2b4ecb823 --- /dev/null +++ b/plugins/decklink/win/CMakeLists.txt @@ -0,0 +1,46 @@ +project(win-decklink) + +include(IDLFileHelper) + +set(win-decklink-sdk_IDLS + decklink-sdk/DeckLinkAPI.idl + ) + +set(win-decklink-sdk_HEADERS + decklink-sdk/DeckLinkAPIVersion.h + ) + +set(win-decklink_HEADERS + ../platform.hpp + ../decklink.hpp + ../decklink-device-instance.hpp + ../decklink-device-discovery.hpp + ../decklink-device.hpp + ../decklink-device-mode.hpp + ) + +set(win-decklink_SOURCES + ../plugin-main.cpp + ../decklink.cpp + ../decklink-device-instance.cpp + ../decklink-device-discovery.cpp + ../decklink-device.cpp + ../decklink-device-mode.cpp + platform.cpp) + +add_idl_files(win-decklink-sdk_GENERATED_FILES + ${win-decklink-sdk_IDLS}) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR}) + +add_library(win-decklink MODULE + ${win-decklink_SOURCES} + ${win-decklink_HEADERS} + ${win-decklink-sdk_HEADERS} + ${win-decklink-sdk_GENERATED_FILES}) + +target_link_libraries(win-decklink + libobs) + +install_obs_plugin_with_data(win-decklink ../data) diff --git a/plugins/decklink/win/platform.cpp b/plugins/decklink/win/platform.cpp new file mode 100644 index 000000000..69d8a6f2e --- /dev/null +++ b/plugins/decklink/win/platform.cpp @@ -0,0 +1,26 @@ +#include "../platform.hpp" + +#include + +IDeckLinkDiscovery *CreateDeckLinkDiscoveryInstance(void) +{ + IDeckLinkDiscovery *instance; + const HRESULT result = CoCreateInstance(CLSID_CDeckLinkDiscovery, + nullptr, CLSCTX_ALL, IID_IDeckLinkDiscovery, + (void **)&instance); + return result == S_OK ? instance : nullptr; +} + +bool DeckLinkStringToStdString(decklink_string_t input, std::string& output) +{ + if (input == nullptr) + return false; + + size_t len = wcslen(input); + size_t utf8_len = os_wcs_to_utf8(input, len, nullptr, 0); + + output.resize(utf8_len); + os_wcs_to_utf8(input, len, &output[0], utf8_len); + + return true; +}