From 87f4d586b00e6391d14e3850dd692a6550d9b547 Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Sat, 24 Sep 2016 12:07:10 -0400 Subject: [PATCH 01/80] libobs/util: Fix get_dll_ver not reporting DLL name Follow-up to commit 2cf5c5f. --- libobs/util/platform-windows.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libobs/util/platform-windows.c b/libobs/util/platform-windows.c index faadf622c5d3b5..795c8cae714222 100644 --- a/libobs/util/platform-windows.c +++ b/libobs/util/platform-windows.c @@ -719,28 +719,31 @@ bool get_dll_ver(const wchar_t *lib, struct win_version_info *ver_info) BOOL success; LPVOID data; DWORD size; + char utf8_lib[512]; if (!ver_initialized && !initialize_version_functions()) return false; if (!ver_initialize_success) return false; + os_wcs_to_utf8(lib, 0, utf8_lib, sizeof(utf8_lib)); + size = get_file_version_info_size(lib, NULL); if (!size) { - blog(LOG_ERROR, "Failed to get windows version info size"); + blog(LOG_ERROR, "Failed to get %s version info size", utf8_lib); return false; } data = bmalloc(size); if (!get_file_version_info(lib, 0, size, data)) { - blog(LOG_ERROR, "Failed to get windows version info"); + blog(LOG_ERROR, "Failed to get %s version info", utf8_lib); bfree(data); return false; } success = ver_query_value(data, L"\\", (LPVOID*)&info, &len); if (!success || !info || !len) { - blog(LOG_ERROR, "Failed to get windows version info value"); + blog(LOG_ERROR, "Failed to get %s version info value", utf8_lib); bfree(data); return false; } From a97a9a966c5655aed57fd09b6c27b26c5e1510a4 Mon Sep 17 00:00:00 2001 From: Serge Paquet Date: Wed, 28 Sep 2016 11:34:38 -0400 Subject: [PATCH 02/80] Display license in MSI installer --- cmake/Modules/ObsCpack.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Modules/ObsCpack.cmake b/cmake/Modules/ObsCpack.cmake index 0e9d2c022a7dbb..d9564b92cfa0ee 100644 --- a/cmake/Modules/ObsCpack.cmake +++ b/cmake/Modules/ObsCpack.cmake @@ -8,6 +8,7 @@ endif() set(CPACK_PACKAGE_NAME "OBS") set(CPACK_PACKAGE_VENDOR "obsproject.com") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OBS - Live video and audio streaming and recording software") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/UI/data/license/gplv2.txt") set(CPACK_PACKAGE_VERSION_MAJOR "0") set(CPACK_PACKAGE_VERSION_MINOR "0") From 78d09e6ac2dbd1e8264c00f43e1b195f4ec97a41 Mon Sep 17 00:00:00 2001 From: CoDEmanX Date: Wed, 28 Sep 2016 09:18:16 +0200 Subject: [PATCH 03/80] rtmp-services: Add Asian Livecoding.tv server and increase video bitrate --- plugins/rtmp-services/data/package.json | 4 ++-- plugins/rtmp-services/data/services.json | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/rtmp-services/data/package.json b/plugins/rtmp-services/data/package.json index 99ef04c2c3e487..de4103d1d23aca 100644 --- a/plugins/rtmp-services/data/package.json +++ b/plugins/rtmp-services/data/package.json @@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 38, + "version": 39, "files": [ { "name": "services.json", - "version": 38 + "version": 39 } ] } diff --git a/plugins/rtmp-services/data/services.json b/plugins/rtmp-services/data/services.json index 1133d566f76989..84976d088066f3 100644 --- a/plugins/rtmp-services/data/services.json +++ b/plugins/rtmp-services/data/services.json @@ -326,10 +326,14 @@ { "name": "EU", "url": "rtmp://eumedia1.livecoding.tv/livecodingtv" + }, + { + "name": "Asia Pacific", + "url": "rtmp://apmedia1.livecoding.tv/livecodingtv" } ], "recommended": { - "max video bitrate": 1300 + "max video bitrate": 2300 } }, { From c4eebbba54717bac6abb1ae22ae1cb492fe212ad Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Thu, 29 Sep 2016 21:18:13 -0500 Subject: [PATCH 04/80] UI: Enable HiDPI scaling. This makes the app much more usable on hidpi screen devices like the surface. --- UI/obs-app.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index e7bb8f64313504..2ffee1a4f5be94 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -1309,6 +1309,8 @@ static int run_program(fstream &logFile, int argc, char *argv[]) QCoreApplication::addLibraryPath("."); + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + OBSApp program(argc, argv, profilerNameStore.get()); try { program.AppInit(); From f3eb8aacfeb9c1f2f93b1bea0003e1279f23adc6 Mon Sep 17 00:00:00 2001 From: Warren Turkal Date: Mon, 3 Oct 2016 23:50:13 -0700 Subject: [PATCH 05/80] UI: Use Qt lib for screen info instead of x11 libs All of the monitor discovery logic can be implemented with Qt. This change removes all the x11 implementations in favor of Qt and removes a fair amount of platform specific code. --- UI/CMakeLists.txt | 14 +------- UI/obs-app.cpp | 16 +++------ UI/platform-osx.mm | 11 ------- UI/platform-windows.cpp | 22 ------------- UI/platform-x11.cpp | 63 ++---------------------------------- UI/platform.hpp | 11 ------- UI/window-basic-main.cpp | 31 +++++++++--------- UI/window-basic-settings.cpp | 12 +++---- UI/window-projector.cpp | 9 +++--- 9 files changed, 33 insertions(+), 156 deletions(-) diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index 69cd6937607564..99a67a845d967f 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -83,19 +83,7 @@ elseif(UNIX) set(obs_PLATFORM_SOURCES platform-x11.cpp) - find_package(XCB COMPONENTS XCB REQUIRED RANDR REQUIRED XINERAMA REQUIRED) - - include_directories( - ${XCB_INCLUDE_DIRS} - ${X11_XCB_INCLUDE_DIRS}) - - add_definitions( - ${XCB_DEFINITIONS} - ${X11_XCB_DEFINITIONS}) - - set(obs_PLATFORM_LIBRARIES - ${XCB_LIBRARIES} - ${X11_XCB_LIBRARIES} + set(obs_PLATFORM_LIBRARIES Qt5::X11Extras) endif() diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index e7bb8f64313504..84496f22ecd89e 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -29,7 +29,9 @@ #include #include +#include #include +#include #include "qt-wrappers.hpp" #include "obs-app.hpp" @@ -1520,20 +1522,10 @@ bool GetClosestUnusedFileName(std::string &path, const char *extension) bool WindowPositionValid(QRect rect) { - vector monitors; - GetMonitors(monitors); - - for (auto &monitor : monitors) { - int left = int(monitor.x); - int top = int(monitor.y); - int right = left + int(monitor.cx); - int bottom = top + int(monitor.cy); - - if ((rect.left() - right) < 0 && (left - rect.right()) < 0 && - (rect.top() - bottom) < 0 && (top - rect.bottom()) < 0) + for (QScreen* screen: QGuiApplication::screens()) { + if (screen->availableGeometry().intersects(rect)) return true; } - return false; } diff --git a/UI/platform-osx.mm b/UI/platform-osx.mm index d60f8ab921a8e3..19b1a9cdc0065c 100644 --- a/UI/platform-osx.mm +++ b/UI/platform-osx.mm @@ -36,17 +36,6 @@ bool GetDataFilePath(const char *data, string &output) return !access(output.c_str(), R_OK); } -void GetMonitors(vector &monitors) -{ - monitors.clear(); - for(NSScreen *screen : [NSScreen screens]) - { - NSRect frame = [screen convertRectToBacking:[screen frame]]; - monitors.emplace_back(frame.origin.x, frame.origin.y, - frame.size.width, frame.size.height); - } -} - bool InitApplicationBundle() { #ifdef OBS_OSX_BUNDLE diff --git a/UI/platform-windows.cpp b/UI/platform-windows.cpp index 8edde6ec32a3d8..73863753b8cbc4 100644 --- a/UI/platform-windows.cpp +++ b/UI/platform-windows.cpp @@ -51,28 +51,6 @@ bool GetDataFilePath(const char *data, string &output) return check_path(data, OBS_DATA_PATH "/obs-studio/", output); } -static BOOL CALLBACK OBSMonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, - LPRECT rect, LPARAM param) -{ - vector &monitors = *(vector *)param; - - monitors.emplace_back( - rect->left, - rect->top, - rect->right - rect->left, - rect->bottom - rect->top); - - UNUSED_PARAMETER(hMonitor); - UNUSED_PARAMETER(hdcMonitor); - return true; -} - -void GetMonitors(vector &monitors) -{ - monitors.clear(); - EnumDisplayMonitors(NULL, NULL, OBSMonitorEnumProc, (LPARAM)&monitors); -} - bool InitApplicationBundle() { return true; diff --git a/UI/platform-x11.cpp b/UI/platform-x11.cpp index 1cca5da517d92b..c6b02b9b3e88bf 100644 --- a/UI/platform-x11.cpp +++ b/UI/platform-x11.cpp @@ -16,16 +16,12 @@ along with this program. If not, see . ******************************************************************************/ -/* Here we use xinerama to fetch data about monitor geometry - * Even if there are not multiple monitors, this should still work. - */ - #include #include "obs-app.hpp" -#include -#include -#include +#include +#include + #include #include #include @@ -63,59 +59,6 @@ bool GetDataFilePath(const char *data, string &output) return false; } -void GetMonitors(vector &monitors) -{ - xcb_connection_t* xcb_conn; - - monitors.clear(); - xcb_conn = xcb_connect(NULL, NULL); - - bool use_xinerama = false; - if (xcb_get_extension_data(xcb_conn, &xcb_xinerama_id)->present) { - xcb_xinerama_is_active_cookie_t xinerama_cookie; - xcb_xinerama_is_active_reply_t* xinerama_reply = NULL; - - xinerama_cookie = xcb_xinerama_is_active(xcb_conn); - xinerama_reply = xcb_xinerama_is_active_reply(xcb_conn, - xinerama_cookie, NULL); - - if (xinerama_reply && xinerama_reply->state != 0) - use_xinerama = true; - free(xinerama_reply); - } - - if (use_xinerama) { - xcb_xinerama_query_screens_cookie_t screens_cookie; - xcb_xinerama_query_screens_reply_t* screens_reply = NULL; - xcb_xinerama_screen_info_iterator_t iter; - - screens_cookie = xcb_xinerama_query_screens(xcb_conn); - screens_reply = xcb_xinerama_query_screens_reply(xcb_conn, - screens_cookie, NULL); - iter = xcb_xinerama_query_screens_screen_info_iterator( - screens_reply); - - for(; iter.rem; xcb_xinerama_screen_info_next(&iter)) { - monitors.emplace_back(iter.data->x_org, - iter.data->y_org, - iter.data->width, - iter.data->height); - } - free(screens_reply); - } else { - // no xinerama so fall back to basic x11 calls - xcb_screen_iterator_t iter; - - iter = xcb_setup_roots_iterator(xcb_get_setup(xcb_conn)); - for(; iter.rem; xcb_screen_next(&iter)) { - monitors.emplace_back(0,0,iter.data->width_in_pixels, - iter.data->height_in_pixels); - } - } - - xcb_disconnect(xcb_conn); -} - bool InitApplicationBundle() { return true; diff --git a/UI/platform.hpp b/UI/platform.hpp index ad579d62540d31..1b1344be5e214b 100644 --- a/UI/platform.hpp +++ b/UI/platform.hpp @@ -24,19 +24,8 @@ class QWidget; -struct MonitorInfo { - int32_t x, y; - uint32_t cx, cy; - - inline MonitorInfo() {} - inline MonitorInfo(int32_t x, int32_t y, uint32_t cx, uint32_t cy) - : x(x), y(y), cx(cx), cy(cy) - {} -}; - /* Gets the path of obs-studio specific data files (such as locale) */ bool GetDataFilePath(const char *data, std::string &path); -void GetMonitors(std::vector &monitors); /* Updates the working directory for OSX application bundles */ bool InitApplicationBundle(); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index e7754615cf614b..da5369a95d64e8 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -19,11 +19,14 @@ #include #include +#include #include #include #include #include #include +#include +#include #include #include @@ -780,17 +783,18 @@ static const double scaled_vals[] = bool OBSBasic::InitBasicConfigDefaults() { - vector monitors; - GetMonitors(monitors); + QList screens = QGuiApplication::screens(); - if (!monitors.size()) { + if (!screens.size()) { OBSErrorBox(NULL, "There appears to be no monitors. Er, this " "technically shouldn't be possible."); return false; } - uint32_t cx = monitors[0].cx; - uint32_t cy = monitors[0].cy; + QScreen *primaryScreen = QGuiApplication::primaryScreen(); + + uint32_t cx = primaryScreen->size().width(); + uint32_t cy = primaryScreen->size().height(); /* ----------------------------------------------------- */ /* move over mixer values in advanced if older config */ @@ -2768,19 +2772,16 @@ static void AddProjectorMenuMonitors(QMenu *parent, QObject *target, const char *slot) { QAction *action; - std::vector monitors; - GetMonitors(monitors); - - for (int i = 0; (size_t)i < monitors.size(); i++) { - const MonitorInfo &monitor = monitors[i]; - + QList screens = QGuiApplication::screens(); + for (int i = 0; i < screens.size(); i++) { + QRect screenGeometry = screens[i]->availableGeometry(); QString str = QString("%1 %2: %3x%4 @ %5,%6"). arg(QTStr("Display"), QString::number(i), - QString::number((int)monitor.cx), - QString::number((int)monitor.cy), - QString::number((int)monitor.x), - QString::number((int)monitor.y)); + QString::number((int)screenGeometry.width()), + QString::number((int)screenGeometry.height()), + QString::number((int)screenGeometry.x()), + QString::number((int)screenGeometry.y())); action = parent->addAction(str, target, slot); action->setProperty("monitor", i); diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index aab5c16fe5afdc..f2b9a621788072 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include #include @@ -950,8 +952,6 @@ void OBSBasicSettings::LoadRendererList() #endif } -Q_DECLARE_METATYPE(MonitorInfo); - static string ResString(uint32_t cx, uint32_t cy) { stringstream res; @@ -1097,14 +1097,12 @@ void OBSBasicSettings::LoadResolutionLists() uint32_t cy = config_get_uint(main->Config(), "Video", "BaseCY"); uint32_t out_cx = config_get_uint(main->Config(), "Video", "OutputCX"); uint32_t out_cy = config_get_uint(main->Config(), "Video", "OutputCY"); - vector monitors; ui->baseResolution->clear(); - GetMonitors(monitors); - - for (MonitorInfo &monitor : monitors) { - string res = ResString(monitor.cx, monitor.cy); + for (QScreen* screen: QGuiApplication::screens()) { + QSize as = screen->availableSize(); + string res = ResString(as.width(), as.height()); ui->baseResolution->addItem(res.c_str()); } diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 5e3ecf972c4682..1adf791b053de1 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -1,6 +1,8 @@ #include +#include #include #include +#include #include "window-projector.hpp" #include "display-helpers.hpp" #include "qt-wrappers.hpp" @@ -47,11 +49,8 @@ OBSProjector::~OBSProjector() void OBSProjector::Init(int monitor) { - std::vector monitors; - GetMonitors(monitors); - MonitorInfo &mi = monitors[monitor]; - - setGeometry(mi.x, mi.y, mi.cx, mi.cy); + QScreen *screen = QGuiApplication::screens()[monitor]; + setGeometry(screen->availableGeometry()); bool alwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop"); From 70fc27d34a83b4afc7611319781ce910fcde38f5 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Tue, 4 Oct 2016 11:42:36 +0200 Subject: [PATCH 06/80] enc-amf: Update to 1.3.2.3 --- plugins/enc-amf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/enc-amf b/plugins/enc-amf index cfe33a10879252..486987f8b3f9ab 160000 --- a/plugins/enc-amf +++ b/plugins/enc-amf @@ -1 +1 @@ -Subproject commit cfe33a10879252cb7af61147ff909c636a3448ba +Subproject commit 486987f8b3f9ab8a088c49a7a0925228df5c52b9 From 404258f41a407ce2f0b070271ffceecf1626c66e Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 4 Oct 2016 21:18:49 -0500 Subject: [PATCH 07/80] UI: Only scale HiDPI on QT 5.6+ --- UI/obs-app.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 8970a788511101..76d6245c5683c7 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -1311,7 +1312,9 @@ static int run_program(fstream &logFile, int argc, char *argv[]) QCoreApplication::addLibraryPath("."); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif OBSApp program(argc, argv, profilerNameStore.get()); try { From ccbb542eb05416e750ed74ae0d246e9b819e68ec Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Thu, 6 Oct 2016 13:40:52 +0200 Subject: [PATCH 08/80] enc-amf: Update to 1.3.3.1 --- plugins/enc-amf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/enc-amf b/plugins/enc-amf index 486987f8b3f9ab..2dea2ed63e776b 160000 --- a/plugins/enc-amf +++ b/plugins/enc-amf @@ -1 +1 @@ -Subproject commit 486987f8b3f9ab8a088c49a7a0925228df5c52b9 +Subproject commit 2dea2ed63e776bd7a135ebb5b20875ab20b6ee31 From 487ef58ee76b1f95e46be76819b1d32755f59325 Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Fri, 7 Oct 2016 02:39:35 -0400 Subject: [PATCH 09/80] libobs-d3d11: Log GetDeviceRemovedReason When DirectX throws error 0x887A0005 (DXGI_ERROR_DEVICE_REMOVED), Microsoft recommends calling ID3D11Device::GetDeviceRemovedReason to retrieve a more precise error code. Closes jp9000/obs-studio#652 --- libobs-d3d11/d3d11-subsystem.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 08a73373361100..9e2e401afdc917 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -33,6 +33,16 @@ struct UnsupportedHWError : HRError { #pragma warning (disable : 4316) #endif +static inline void LogD3D11ErrorDetails(HRError error, gs_device_t *device) +{ + if (error.hr == DXGI_ERROR_DEVICE_REMOVED) { + HRESULT DeviceRemovedReason = + device->device->GetDeviceRemovedReason(); + blog(LOG_ERROR, " Device Removed Reason: %08lX", + DeviceRemovedReason); + } +} + static const IID dxgiFactory2 = {0x50c83a1c, 0xe072, 0x4c48, {0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0}}; @@ -612,6 +622,7 @@ gs_swapchain_t *device_swapchain_create(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_swapchain_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return swap; @@ -641,6 +652,7 @@ void device_resize(gs_device_t *device, uint32_t cx, uint32_t cy) } catch (HRError error) { blog(LOG_ERROR, "device_resize (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } } @@ -688,6 +700,7 @@ gs_texture_t *device_texture_create(gs_device_t *device, uint32_t width, } catch (HRError error) { blog(LOG_ERROR, "device_texture_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_texture_create (D3D11): %s", error); } @@ -708,6 +721,7 @@ gs_texture_t *device_cubetexture_create(gs_device_t *device, uint32_t size, blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_cubetexture_create (D3D11): %s", error); @@ -743,6 +757,7 @@ gs_zstencil_t *device_zstencil_create(gs_device_t *device, uint32_t width, } catch (HRError error) { blog(LOG_ERROR, "device_zstencil_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return zstencil; @@ -759,6 +774,7 @@ gs_stagesurf_t *device_stagesurface_create(gs_device_t *device, uint32_t width, blog(LOG_ERROR, "device_stagesurface_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return surf; @@ -774,6 +790,7 @@ gs_samplerstate_t *device_samplerstate_create(gs_device_t *device, blog(LOG_ERROR, "device_samplerstate_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return ss; @@ -791,6 +808,7 @@ gs_shader_t *device_vertexshader_create(gs_device_t *device, blog(LOG_ERROR, "device_vertexshader_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (ShaderError error) { const char *buf = (const char*)error.errors->GetBufferPointer(); @@ -820,6 +838,7 @@ gs_shader_t *device_pixelshader_create(gs_device_t *device, blog(LOG_ERROR, "device_pixelshader_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (ShaderError error) { const char *buf = (const char*)error.errors->GetBufferPointer(); @@ -847,6 +866,7 @@ gs_vertbuffer_t *device_vertexbuffer_create(gs_device_t *device, blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s " "(%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_vertexbuffer_create (D3D11): %s", error); @@ -865,6 +885,7 @@ gs_indexbuffer_t *device_indexbuffer_create(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_indexbuffer_create (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } return buffer; @@ -1308,6 +1329,7 @@ void device_draw(gs_device_t *device, enum gs_draw_mode draw_mode, } catch (HRError error) { blog(LOG_ERROR, "device_draw (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); return; } @@ -1964,6 +1986,7 @@ extern "C" EXPORT gs_texture_t *device_texture_create_gdi(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "device_texture_create_gdi (D3D11): %s", error); } @@ -2018,6 +2041,7 @@ extern "C" EXPORT gs_texture_t *device_texture_open_shared(gs_device_t *device, } catch (HRError error) { blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s (%08lX)", error.str, error.hr); + LogD3D11ErrorDetails(error, device); } catch (const char *error) { blog(LOG_ERROR, "gs_texture_open_shared (D3D11): %s", error); } From f1a9c139b8788432424a1ae590a99b89eed62d49 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Sat, 8 Oct 2016 19:41:31 -0500 Subject: [PATCH 10/80] Add 256x256 icon to windows ico for HiDPI displays --- cmake/winrc/obs-studio.ico | Bin 34494 -> 93455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/cmake/winrc/obs-studio.ico b/cmake/winrc/obs-studio.ico index 32f146610e9843aaba473a1db773805378d2dd22..7127372917d0ae308412302998833d60e420fd4f 100644 GIT binary patch literal 93455 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

C#Vyy0Xt+}qRZF9tgd$_hM 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 Date: Sun, 9 Oct 2016 20:53:45 -0400 Subject: [PATCH 11/80] UI: Add Portable Mode indicator to title bar and log Closes jp9000/obs-studio#654 --- UI/obs-app.cpp | 8 ++++++++ UI/obs-app.hpp | 1 + UI/window-basic-main.cpp | 3 +++ 3 files changed, 12 insertions(+) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 76d6245c5683c7..90253dab20c647 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -858,6 +858,9 @@ bool OBSApp::OBSInit() if (!StartupOBS(locale.c_str(), GetProfilerNameStore())) return false; + blog(LOG_INFO, "Portable mode: %s", + portable_mode ? "true" : "false"); + mainWindow = new OBSBasic(); mainWindow->setAttribute(Qt::WA_DeleteOnClose, true); @@ -909,6 +912,11 @@ string OBSApp::GetVersionString() const return ver.str(); } +bool OBSApp::IsPortableMode() +{ + return portable_mode; +} + #ifdef __APPLE__ #define INPUT_AUDIO_SOURCE "coreaudio_input_capture" #define OUTPUT_AUDIO_SOURCE "coreaudio_output_capture" diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp index 9c45803e0b2c6c..3990e04afb72fb 100644 --- a/UI/obs-app.hpp +++ b/UI/obs-app.hpp @@ -117,6 +117,7 @@ class OBSApp : public QApplication { const char *GetCurrentLog() const; std::string GetVersionString() const; + bool IsPortableMode(); const char *InputAudioSource() const; const char *OutputAudioSource() const; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index da5369a95d64e8..9fb8536d948bf2 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -4459,6 +4459,9 @@ void OBSBasic::UpdateTitleBar() name << "Studio "; name << App()->GetVersionString(); + if (App()->IsPortableMode()) + name << " - Portable Mode"; + name << " - " << Str("TitleBar.Profile") << ": " << profile; name << " - " << Str("TitleBar.Scenes") << ": " << sceneCollection; From d324713364ebd65ad81703d9ed9ecb0887ed70d4 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Mon, 3 Oct 2016 01:12:53 +0200 Subject: [PATCH 12/80] UI: Add raw text and text file to drag&drop support Closes jp9000/obs-studio#644 --- UI/window-basic-main-dropfiles.cpp | 53 +++++++++++++++++++++++++----- UI/window-basic-main.hpp | 9 ++++- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/UI/window-basic-main-dropfiles.cpp b/UI/window-basic-main-dropfiles.cpp index 64ae7f684fb116..45475a63d024d9 100644 --- a/UI/window-basic-main-dropfiles.cpp +++ b/UI/window-basic-main-dropfiles.cpp @@ -11,6 +11,10 @@ using namespace std; +static const char *textExtensions[] = { + "txt", "log", nullptr +}; + static const char *imageExtensions[] = { "bmp", "tga", "png", "jpg", "jpeg", "gif", nullptr }; @@ -52,19 +56,31 @@ static string GenerateSourceName(const char *base) } } -void OBSBasic::AddDropSource(const char *file, bool image) +void OBSBasic::AddDropSource(const char *data, DropType image) { OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); obs_data_t *settings = obs_data_create(); obs_source_t *source = nullptr; const char *type = nullptr; - if (image) { - obs_data_set_string(settings, "file", file); + switch (image) { + case DropType_RawText: + obs_data_set_string(settings, "text", data); + type = "text_gdiplus"; + break; + case DropType_Text: + obs_data_set_bool(settings, "read_from_file", true); + obs_data_set_string(settings, "file", data); + type = "text_gdiplus"; + break; + case DropType_Image: + obs_data_set_string(settings, "file", data); type = "image_source"; - } else { - obs_data_set_string(settings, "local_file", file); + break; + case DropType_Media: + obs_data_set_string(settings, "local_file", data); type = "ffmpeg_source"; + break; } const char *name = obs_source_get_display_name(type); @@ -113,10 +129,28 @@ void OBSBasic::dropEvent(QDropEvent *event) const char *suffix = suffixArray.constData(); bool found = false; - const char **cmp = imageExtensions; + const char **cmp; + + cmp = textExtensions; + while (*cmp) { + if (strcmp(*cmp, suffix) == 0) { + AddDropSource(QT_TO_UTF8(file), + DropType_Text); + found = true; + break; + } + + cmp++; + } + + if (found) + continue; + + cmp = imageExtensions; while (*cmp) { if (strcmp(*cmp, suffix) == 0) { - AddDropSource(QT_TO_UTF8(file), true); + AddDropSource(QT_TO_UTF8(file), + DropType_Image); found = true; break; } @@ -130,13 +164,16 @@ void OBSBasic::dropEvent(QDropEvent *event) cmp = mediaExtensions; while (*cmp) { if (strcmp(*cmp, suffix) == 0) { - AddDropSource(QT_TO_UTF8(file), false); + AddDropSource(QT_TO_UTF8(file), + DropType_Media); break; } cmp++; } } + } else if (mimeData->hasText()) { + AddDropSource(QT_TO_UTF8(mimeData->text()), DropType_RawText); } } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 1aaa735783f5db..d52a8c7c96d7ff 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -95,6 +95,13 @@ class OBSBasic : public OBSMainWindow { Right }; + enum DropType { + DropType_RawText, + DropType_Text, + DropType_Image, + DropType_Media + }; + private: obs_frontend_callbacks *api = nullptr; @@ -299,7 +306,7 @@ class OBSBasic : public OBSMainWindow { inline void OnActivate(); inline void OnDeactivate(); - void AddDropSource(const char *file, bool image); + void AddDropSource(const char *file, DropType image); void dragEnterEvent(QDragEnterEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; From bd606785fe65c5e05f2030b20a186b129a3540a3 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Mon, 3 Oct 2016 02:22:58 +0200 Subject: [PATCH 13/80] UI: Split Properties window with a QSplitter Closes jp9000/obs-studio#645 --- UI/window-basic-properties.cpp | 20 +++++++++++++------- UI/window-basic-properties.hpp | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/UI/window-basic-properties.cpp b/UI/window-basic-properties.cpp index 2fad427da5cc64..b305f1ded8a474 100644 --- a/UI/window-basic-properties.cpp +++ b/UI/window-basic-properties.cpp @@ -70,21 +70,27 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_) view = new OBSPropertiesView(settings, source, (PropertiesReloadCallback)obs_source_properties, (PropertiesUpdateCallback)obs_source_update); + view->setMinimumHeight(150); - preview->setMinimumSize(20, 20); + preview->setMinimumSize(20, 150); preview->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); + // Create a QSplitter to keep a unified workflow here. + windowSplitter = new QSplitter(Qt::Orientation::Vertical, this); + windowSplitter->addWidget(preview); + windowSplitter->addWidget(view); + windowSplitter->setChildrenCollapsible(false); + //windowSplitter->setSizes(QList({ 16777216, 150 })); + windowSplitter->setStretchFactor(0, 3); + windowSplitter->setStretchFactor(1, 1); + setLayout(new QVBoxLayout(this)); - layout()->addWidget(preview); - layout()->addWidget(view); + layout()->addWidget(windowSplitter); layout()->addWidget(buttonBox); layout()->setAlignment(buttonBox, Qt::AlignRight | Qt::AlignBottom); - layout()->setAlignment(view, Qt::AlignBottom); - view->setMaximumHeight(250); - view->setMinimumHeight(150); - view->show(); + view->show(); installEventFilter(CreateShortcutFilter()); const char *name = obs_source_get_name(source); diff --git a/UI/window-basic-properties.hpp b/UI/window-basic-properties.hpp index a5cbfa92546399..b21a2cf7d947f3 100644 --- a/UI/window-basic-properties.hpp +++ b/UI/window-basic-properties.hpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "qt-display.hpp" #include @@ -42,6 +43,7 @@ class OBSBasicProperties : public QDialog { OBSData oldSettings; OBSPropertiesView *view; QDialogButtonBox *buttonBox; + QSplitter *windowSplitter; static void SourceRemoved(void *data, calldata_t *params); static void SourceRenamed(void *data, calldata_t *params); From 2680321860e96cd015ce74c9f8cbe7477b4948b5 Mon Sep 17 00:00:00 2001 From: CoDEmanX Date: Fri, 2 Sep 2016 16:40:58 +0200 Subject: [PATCH 14/80] CMake: Warn if empty QTDIR/DepsPath vars on Windows Closes jp9000/obs-studio#608 --- CMakeLists.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index fafd69818f6105..14cb5c39ffd4a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,21 @@ cmake_minimum_required(VERSION 2.8.12) project(obs-studio) +if(WIN32) + if (QTDIR OR DEFINED ENV{QTDIR} OR DEFINED ENV{QTDIR32} OR DEFINED ENV{QTDIR64}) + # Qt path set by user or env var + else() + set(QTDIR "" CACHE PATH "Path to Qt (e.g. C:/Qt/5.7/msvc2015_64)") + message(WARNING "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/5.7/msvc2015_64)") + endif() + if (DepsPath OR DEFINED ENV{DepsPath} OR DEFINED ENV{DepsPath32} OR DEFINED ENV{DepsPath64}) + # Dependencies path set by user or env var + else() + set(DepsPath "" CACHE PATH "Path to compiled dependencies (e.g. D:/dependencies/win64)") + message(WARNING "DepsPath variable is missing. Please set this variable to specify path to compiled dependencies (e.g. D:/dependencies/win64)") + endif() +endif() + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") include(ObsHelpers) From 47c8365cdde9e02de92c9d4eff1e8d96e9fb2276 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Sun, 9 Oct 2016 17:26:44 -0500 Subject: [PATCH 15/80] OSX Travis build --- .travis.yml | 26 ++++++++++++++++++++++++++ CI/before-deploy-osx.sh | 7 +++++++ CI/before-script-osx.sh | 3 +++ CI/install-dependencies-osx.sh | 2 ++ 4 files changed, 38 insertions(+) create mode 100644 .travis.yml create mode 100755 CI/before-deploy-osx.sh create mode 100755 CI/before-script-osx.sh create mode 100755 CI/install-dependencies-osx.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000000..d326c34e8f2b2d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +os: osx +env: + matrix: + - CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake + global: + # AWS S3 creds + # access key + - secure: "MfhOg+84yb4ZHB2tM8PIPFQX2Y+WLN0I0iiAgyLC4KaHPUoNOyloe9yk6OjV7Lj7SZWqTlQUsqHa8S9mOUswGIody1Ydglo4RvyGOKCd8I6b2ri/jE8qHVuD9sO+sNlIxq4YqqG/qReTsbSs2YEgLneZUCYLCk/fihl8L6eVuSc=" + # secret + - secure: "JRQVU2zgC3hY6CEY+Crmh/upp93En0BzKaLcsuBT538johNlK7m5hn3m2UOw63seLvBvVaKKWUDj9N986a3DwcXxWPMyF/9ctXgNWy39WzaVWxrbVR5nQB1fdiRp5YEgkoVN+gEm3OVF7sV5AGzh5/8CvEdRCoTLIGgMGHxW9mc=" +language: cpp +before_install: "./CI/install-dependencies-osx.sh" +before_script: "./CI/before-script-osx.sh" +script: cd ./build && make -j4 && cd - +before_deploy: "./CI/before-deploy-osx.sh" +deploy: + provider: s3 + access_key_id: $AWS_ACCESS_KEY + secret_access_key: $AWS_SECRET_KEY + skip_cleanup: true + local_dir: nightly + bucket: obs-nightly + region: us-west-2 + acl: public_read + on: + condition: "$TRAVIS_EVENT_TYPE = cron" \ No newline at end of file diff --git a/CI/before-deploy-osx.sh b/CI/before-deploy-osx.sh new file mode 100755 index 00000000000000..684ae77609771b --- /dev/null +++ b/CI/before-deploy-osx.sh @@ -0,0 +1,7 @@ +export GIT_HASH=$(git rev-parse --short HEAD) +export FILE_DATE=$(date +%Y-%m-%d.%H:%M:%S) +export FILENAME=$FILE_DATE-$GIT_HASH-osx.zip +mkdir nightly +cd ./build/rundir/RelWithDebInfo +zip -r -X $FILENAME . +mv ./$FILENAME ../../../nightly diff --git a/CI/before-script-osx.sh b/CI/before-script-osx.sh new file mode 100755 index 00000000000000..449308fc5e3d0d --- /dev/null +++ b/CI/before-script-osx.sh @@ -0,0 +1,3 @@ +mkdir build +cd build +cmake .. \ No newline at end of file diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh new file mode 100755 index 00000000000000..648d4d19654267 --- /dev/null +++ b/CI/install-dependencies-osx.sh @@ -0,0 +1,2 @@ +brew update +brew install ffmpeg x264 qt5 \ No newline at end of file From 720f8cd6a24d939fa77aab63d9286ae0bf162380 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 11 Oct 2016 15:15:21 -0500 Subject: [PATCH 16/80] CI: Upload artifacts on all pushes --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d326c34e8f2b2d..31e5a4dc981b26 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,4 +23,4 @@ deploy: region: us-west-2 acl: public_read on: - condition: "$TRAVIS_EVENT_TYPE = cron" \ No newline at end of file + repo: jp9000/obs-studio \ No newline at end of file From 5f657396064236d8fdd441cbc84a544f3c31a907 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 11 Oct 2016 12:29:03 -0500 Subject: [PATCH 17/80] CI: Add irc notifications to travis config --- .travis.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 31e5a4dc981b26..633ab5eb036a61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,4 +23,10 @@ deploy: region: us-west-2 acl: public_read on: - repo: jp9000/obs-studio \ No newline at end of file + repo: jp9000/obs-studio + +# The channel name "azubu.il.us.quakenet.org#obs-dev" is encrypted against jp9000/obs-studio to prevent IRC spam of forks +notifications: + irc: + channels: + - secure: k9j7+ogVODMlveZdd5pP73AVLCFl1VbzVaVon0ECn3EQcxnLSpiZbc6l+PnIUKgee5pRKtUB4breufgmr4puq3s69YeQiOVKk5gx2yJGZ5jGacbSne0xTspzPxapiEbVUkcJ2L7gKntDG4+SUiW67dtt4G26O7zsErDF/lY/woQ= From 30b813564e67ae8c24f047123f36d70079c189d0 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 11 Oct 2016 17:54:07 -0500 Subject: [PATCH 18/80] CI: Reduce travis irc notice to one line --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 633ab5eb036a61..00bb5470bff8d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,5 +28,8 @@ deploy: # The channel name "azubu.il.us.quakenet.org#obs-dev" is encrypted against jp9000/obs-studio to prevent IRC spam of forks notifications: irc: + skip_join: true + template: + - "%{message} %{build_url}" channels: - secure: k9j7+ogVODMlveZdd5pP73AVLCFl1VbzVaVon0ECn3EQcxnLSpiZbc6l+PnIUKgee5pRKtUB4breufgmr4puq3s69YeQiOVKk5gx2yJGZ5jGacbSne0xTspzPxapiEbVUkcJ2L7gKntDG4+SUiW67dtt4G26O7zsErDF/lY/woQ= From a0b4439893964a23f91b57891295597436b8b4ba Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Tue, 11 Oct 2016 20:47:22 -0500 Subject: [PATCH 19/80] CI: Package OSX build into an actual app --- CI/before-deploy-osx.sh | 7 +- CI/install-dependencies-osx.sh | 2 +- CI/install/osx/build_app.py | 216 +++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+), 4 deletions(-) create mode 100644 CI/install/osx/build_app.py diff --git a/CI/before-deploy-osx.sh b/CI/before-deploy-osx.sh index 684ae77609771b..0ccb931f939871 100755 --- a/CI/before-deploy-osx.sh +++ b/CI/before-deploy-osx.sh @@ -2,6 +2,7 @@ export GIT_HASH=$(git rev-parse --short HEAD) export FILE_DATE=$(date +%Y-%m-%d.%H:%M:%S) export FILENAME=$FILE_DATE-$GIT_HASH-osx.zip mkdir nightly -cd ./build/rundir/RelWithDebInfo -zip -r -X $FILENAME . -mv ./$FILENAME ../../../nightly +cd ./build +sudo python3 ../CI/install/osx/build_app.py +zip -r -X $FILENAME OBS.app +mv ./$FILENAME ../nightly diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index 648d4d19654267..7391327113140d 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -1,2 +1,2 @@ brew update -brew install ffmpeg x264 qt5 \ No newline at end of file +brew install ffmpeg x264 qt5 python3 \ No newline at end of file diff --git a/CI/install/osx/build_app.py b/CI/install/osx/build_app.py new file mode 100644 index 00000000000000..f47a474287d331 --- /dev/null +++ b/CI/install/osx/build_app.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3.3 + +candidate_paths = "bin obs-plugins data".split() + +plist_path = "../cmake/osxbundle/info.plist" +icon_path = "../cmake/osxbundle/obs.icns" +run_path = "../cmake/osxbundle/obslaunch.sh" + +#not copied +blacklist = """/usr /System""".split() + +#copied +whitelist = """/usr/local""".split() + +# +# +# + + +from sys import argv +from glob import glob +from subprocess import check_output, call +from collections import namedtuple +from shutil import copy, copytree, rmtree +from os import makedirs, rename, walk, path as ospath +import plistlib + +import argparse +parser = argparse.ArgumentParser(description='obs-studio package util') +parser.add_argument('-d', '--base-dir', dest='dir', default='rundir/RelWithDebInfo') +parser.add_argument('-n', '--build-number', dest='build_number', default='0') +parser.add_argument('-k', '--public-key', dest='public_key', default='OBSPublicDSAKey.pem') +parser.add_argument('-f', '--sparkle-framework', dest='sparkle', default=None) +parser.add_argument('-b', '--base-url', dest='base_url', default='https://builds.catchexception.org/obs-studio') +parser.add_argument('-u', '--user', dest='user', default='jp9000') +parser.add_argument('-c', '--channel', dest='channel', default='master') +parser.add_argument('-s', '--stable', dest='stable', required=False, action='store_true', default=False) +parser.add_argument('-p', '--prefix', dest='prefix', default='') +args = parser.parse_args() + +def cmd(cmd): + import subprocess + import shlex + return subprocess.check_output(shlex.split(cmd)).rstrip('\r\n') + +LibTarget = namedtuple("LibTarget", ("path", "external", "copy_as")) + +inspect = list() + +inspected = set() + +build_path = args.dir +build_path = build_path.replace("\\ ", " ") + +def add(name, external=False, copy_as=None): + if external and copy_as is None: + copy_as = name.split("/")[-1] + if name[0] != "/": + name = build_path+"/"+name + t = LibTarget(name, external, copy_as) + if t in inspected: + return + inspect.append(t) + inspected.add(t) + + +for i in candidate_paths: + print("Checking " + i) + for root, dirs, files in walk(build_path+"/"+i): + for file_ in files: + path = root + "/" + file_ + try: + out = check_output("{0}otool -L '{1}'".format(args.prefix, path), shell=True, + universal_newlines=True) + if "is not an object file" in out: + continue + except: + pass + rel_path = path[len(build_path)+1:] + print(repr(path), repr(rel_path)) + add(rel_path) + +def add_plugins(path, replace): + for img in glob(path.replace( + "lib/QtCore.framework/Versions/5/QtCore", + "plugins/%s/*"%replace).replace( + "Library/Frameworks/QtCore.framework/Versions/5/QtCore", + "share/qt5/plugins/%s/*"%replace)): + if "_debug" in img: + continue + add(img, True, img.split("plugins/")[-1]) + +actual_sparkle_path = '@loader_path/Frameworks/Sparkle.framework/Versions/A/Sparkle' + +while inspect: + target = inspect.pop() + print("inspecting", repr(target)) + path = target.path + if path[0] == "@": + continue + try: + out = check_output("{0}otool -L '{1}'".format(args.prefix, path), shell=True, + universal_newlines=True) + if "is not an object file" in out: + continue + except: + pass + + if "QtCore" in path: + add_plugins(path, "platforms") + add_plugins(path, "imageformats") + add_plugins(path, "accessible") + + + for line in out.split("\n")[1:]: + new = line.strip().split(" (")[0] + if '@' in new and "sparkle.framework" in new.lower(): + actual_sparkle_path = new + print("Using sparkle path:", repr(actual_sparkle_path)) + if not new or new[0] == "@" or new.endswith(path.split("/")[-1]): + continue + whitelisted = False + for i in whitelist: + if new.startswith(i): + whitelisted = True + if not whitelisted: + blacklisted = False + for i in blacklist: + if new.startswith(i): + blacklisted = True + break + if blacklisted: + continue + add(new, True) + +changes = list() +for path, external, copy_as in inspected: + if not external: + continue #built with install_rpath hopefully + changes.append("-change '%s' '@rpath/%s'"%(path, copy_as)) +changes = " ".join(changes) + +info = plistlib.readPlist(plist_path) + +latest_tag="TACO" #= cmd('git describe --tags --abbrev=0') +log ="BUTTS"#cmd('git log --pretty=oneline {0}...HEAD'.format(latest_tag)) + +from os import path +# set version +if args.stable: + info["CFBundleVersion"] = latest_tag + info["CFBundleShortVersionString"] = latest_tag + info["SUFeedURL"] = '{0}/stable/updates.xml'.format(args.base_url) +else: + info["CFBundleVersion"] = args.build_number + info["CFBundleShortVersionString"] = '{0}.{1}'.format(latest_tag, args.build_number) + info["SUFeedURL"] = '{0}/{1}/{2}/updates.xml'.format(args.base_url, args.user, args.channel) + +info["SUPublicDSAKeyFile"] = path.basename(args.public_key) +info["OBSFeedsURL"] = '{0}/feeds.xml'.format(args.base_url) + +app_name = info["CFBundleName"]+".app" +icon_file = "tmp/Contents/Resources/%s"%info["CFBundleIconFile"] + +copytree(build_path, "tmp/Contents/Resources/", symlinks=True) +copy(icon_path, icon_file) +plistlib.writePlist(info, "tmp/Contents/Info.plist") +makedirs("tmp/Contents/MacOS") +copy(run_path, "tmp/Contents/MacOS/%s"%info["CFBundleExecutable"]) +try: + copy(args.public_key, "tmp/Contents/Resources") +except: + pass + +if args.sparkle is not None: + copytree(args.sparkle, "tmp/Contents/Frameworks/Sparkle.framework", symlinks=True) + +prefix = "tmp/Contents/Resources/" +sparkle_path = '@loader_path/{0}/Frameworks/Sparkle.framework/Versions/A/Sparkle' + +#cmd('{0}install_name_tool -change {1} {2} {3}/bin/obs'.format( +# args.prefix, actual_sparkle_path, sparkle_path.format('../..'), prefix)) + + + +for path, external, copy_as in inspected: + id_ = "" + filename = path + rpath = "" + if external: + id_ = "-id '@rpath/%s'"%copy_as + filename = prefix + "bin/" +copy_as + rpath = "-add_rpath @loader_path/ -add_rpath @executable_path/" + if "/" in copy_as: + try: + dirs = copy_as.rsplit("/", 1)[0] + makedirs(prefix + "bin/" + dirs) + except: + pass + copy(path, filename) + else: + filename = path[len(build_path)+1:] + id_ = "-id '@rpath/../%s'"%filename + if not filename.startswith("bin"): + print(filename) + rpath = "-add_rpath '@loader_path/{}/'".format(ospath.relpath("bin/", ospath.dirname(filename))) + filename = prefix + filename + + cmd = "{0}install_name_tool {1} {2} {3} '{4}'".format(args.prefix, changes, id_, rpath, filename) + call(cmd, shell=True) + +try: + rename("tmp", app_name) +except: + print("App already exists") + rmtree("tmp") From 522c43f8273d8d9435167df9669f734a12fb4c71 Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Thu, 13 Oct 2016 19:30:23 -0500 Subject: [PATCH 20/80] CI: Use python2 to run package script --- CI/before-deploy-osx.sh | 2 +- CI/install-dependencies-osx.sh | 5 ++++- CI/install/osx/build_app.py | 25 ++++++++++--------------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/CI/before-deploy-osx.sh b/CI/before-deploy-osx.sh index 0ccb931f939871..48dab13dd2d094 100755 --- a/CI/before-deploy-osx.sh +++ b/CI/before-deploy-osx.sh @@ -3,6 +3,6 @@ export FILE_DATE=$(date +%Y-%m-%d.%H:%M:%S) export FILENAME=$FILE_DATE-$GIT_HASH-osx.zip mkdir nightly cd ./build -sudo python3 ../CI/install/osx/build_app.py +sudo python ../CI/install/osx/build_app.py zip -r -X $FILENAME OBS.app mv ./$FILENAME ../nightly diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index 7391327113140d..5a7d7836b94c3c 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -1,2 +1,5 @@ brew update -brew install ffmpeg x264 qt5 python3 \ No newline at end of file + +#Base OBS Deps +brew install ffmpeg x264 qt5 python + diff --git a/CI/install/osx/build_app.py b/CI/install/osx/build_app.py index f47a474287d331..58a0178f387714 100644 --- a/CI/install/osx/build_app.py +++ b/CI/install/osx/build_app.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python3.3 +#!/usr/bin/env python candidate_paths = "bin obs-plugins data".split() -plist_path = "../cmake/osxbundle/info.plist" +plist_path = "../cmake/osxbundle/Info.plist" icon_path = "../cmake/osxbundle/obs.icns" run_path = "../cmake/osxbundle/obslaunch.sh" @@ -75,7 +75,7 @@ def add(name, external=False, copy_as=None): if "is not an object file" in out: continue except: - pass + continue rel_path = path[len(build_path)+1:] print(repr(path), repr(rel_path)) add(rel_path) @@ -98,13 +98,8 @@ def add_plugins(path, replace): path = target.path if path[0] == "@": continue - try: - out = check_output("{0}otool -L '{1}'".format(args.prefix, path), shell=True, + out = check_output("{0}otool -L '{1}'".format(args.prefix, path), shell=True, universal_newlines=True) - if "is not an object file" in out: - continue - except: - pass if "QtCore" in path: add_plugins(path, "platforms") @@ -116,7 +111,7 @@ def add_plugins(path, replace): new = line.strip().split(" (")[0] if '@' in new and "sparkle.framework" in new.lower(): actual_sparkle_path = new - print("Using sparkle path:", repr(actual_sparkle_path)) + print "Using sparkle path:", repr(actual_sparkle_path) if not new or new[0] == "@" or new.endswith(path.split("/")[-1]): continue whitelisted = False @@ -142,8 +137,8 @@ def add_plugins(path, replace): info = plistlib.readPlist(plist_path) -latest_tag="TACO" #= cmd('git describe --tags --abbrev=0') -log ="BUTTS"#cmd('git log --pretty=oneline {0}...HEAD'.format(latest_tag)) +latest_tag = cmd('git describe --tags --abbrev=0') +log = cmd('git log --pretty=oneline {0}...HEAD'.format(latest_tag)) from os import path # set version @@ -178,8 +173,8 @@ def add_plugins(path, replace): prefix = "tmp/Contents/Resources/" sparkle_path = '@loader_path/{0}/Frameworks/Sparkle.framework/Versions/A/Sparkle' -#cmd('{0}install_name_tool -change {1} {2} {3}/bin/obs'.format( -# args.prefix, actual_sparkle_path, sparkle_path.format('../..'), prefix)) +cmd('{0}install_name_tool -change {1} {2} {3}/bin/obs'.format( + args.prefix, actual_sparkle_path, sparkle_path.format('../..'), prefix)) @@ -213,4 +208,4 @@ def add_plugins(path, replace): rename("tmp", app_name) except: print("App already exists") - rmtree("tmp") + rmtree("tmp") \ No newline at end of file From 947d04012ffc65e6b843b9568fd44a8c2461cc0f Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Mon, 10 Oct 2016 22:49:45 -0500 Subject: [PATCH 21/80] Build browser plugin on travis for OSX --- CI/before-script-osx.sh | 2 +- CI/install-dependencies-osx.sh | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CI/before-script-osx.sh b/CI/before-script-osx.sh index 449308fc5e3d0d..d9e5fa0696b293 100755 --- a/CI/before-script-osx.sh +++ b/CI/before-script-osx.sh @@ -1,3 +1,3 @@ mkdir build cd build -cmake .. \ No newline at end of file +cmake -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_3.2704.1434.gec3e9ed_macosx64 .. \ No newline at end of file diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index 5a7d7836b94c3c..922b4b74f5bf67 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -3,3 +3,15 @@ brew update #Base OBS Deps brew install ffmpeg x264 qt5 python +# CEF Stuff +cd ../ +curl -kLO http://opensource.spotify.com/cefbuilds/cef_binary_3.2704.1434.gec3e9ed_macosx64.tar.bz2 +tar -xf ./cef_binary_3.2704.1434.gec3e9ed_macosx64.tar.bz2 +cd ./cef_binary_3.2704.1434.gec3e9ed_macosx64 +mkdir build +cd ./build +cmake -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" .. +make -j4 +mkdir libcef_dll +mv ./libcef_dll_wrapper/libcef_dll_wrapper.a ./libcef_dll/libcef_dll_wrapper.a +cd ../../ From a41bdb3bf05df6805287316cdb04bbf56707a8ba Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Fri, 14 Oct 2016 08:17:28 -0500 Subject: [PATCH 22/80] Update obs-browser submodule to a working version --- plugins/obs-browser | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/obs-browser b/plugins/obs-browser index 2eaf69f7a3d2ac..ad115e71645e0f 160000 --- a/plugins/obs-browser +++ b/plugins/obs-browser @@ -1 +1 @@ -Subproject commit 2eaf69f7a3d2ac98a45d5cc96124ab7c666bfa2f +Subproject commit ad115e71645e0f6edfbff51c74aecf25ab36bcc4 From e2af0eec040db43b065fa290e10161c5f5a956c0 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 14 Oct 2016 13:02:38 -0700 Subject: [PATCH 23/80] obs-frontend-api: Add library version --- UI/obs-frontend-api/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/UI/obs-frontend-api/CMakeLists.txt b/UI/obs-frontend-api/CMakeLists.txt index 38eefb69eb08a4..1d5ca9a8ec6875 100644 --- a/UI/obs-frontend-api/CMakeLists.txt +++ b/UI/obs-frontend-api/CMakeLists.txt @@ -17,4 +17,13 @@ add_library(obs-frontend-api SHARED target_link_libraries(obs-frontend-api libobs) +if(UNIX AND NOT APPLE) + set_target_properties(obs-frontend-api + PROPERTIES + OUTPUT_NAME obs-frontend-api + VERSION 0.0 + SOVERSION 0 + ) +endif() + install_obs_core(obs-frontend-api) From f029ec821e8fd1812993ae6dbfcfaa58f17ad4cf Mon Sep 17 00:00:00 2001 From: Younes SERRAJ Date: Thu, 13 Oct 2016 11:39:10 +0200 Subject: [PATCH 24/80] cmake: Fix FFmpeg search path on debian Although FFmpeg is installed, OBS currently fails to build on debian (tested on Debian Jessie 8.6). It looks for libavcodec.a in /usr/local/lib and not /usr/lib. Closes jp9000/obs-studio#661 --- cmake/Modules/FindFFmpeg.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmake/Modules/FindFFmpeg.cmake b/cmake/Modules/FindFFmpeg.cmake index aca205ed712552..520669588bc785 100644 --- a/cmake/Modules/FindFFmpeg.cmake +++ b/cmake/Modules/FindFFmpeg.cmake @@ -49,6 +49,8 @@ function(find_ffmpeg_library component header) ${DepsPath${_lib_suffix}} ${DepsPath} ${PC_FFMPEG_${component}_INCLUDE_DIRS} + PATHS + /usr/include /usr/local/include /opt/local/include /sw/include PATH_SUFFIXES ffmpeg libav include) find_library(FFMPEG_${component}_LIBRARY @@ -64,6 +66,8 @@ function(find_ffmpeg_library component header) ${DepsPath${_lib_suffix}} ${DepsPath} ${PC_FFMPEG_${component}_LIBRARY_DIRS} + PATHS + /usr/lib /usr/local/lib /opt/local/lib /sw/lib PATH_SUFFIXES lib${_lib_suffix} lib libs${_lib_suffix} libs From 94b6943f27d45fb0b0dd2e1a7167c7ca987c3543 Mon Sep 17 00:00:00 2001 From: Cephas Reis Date: Fri, 23 Sep 2016 17:14:17 -0500 Subject: [PATCH 25/80] decklink: Update Blackmagic SDK to 10.8.0 Updated to help support the newest cards, features, and options. Closes jp9000/obs-studio#627 --- .../decklink/linux/decklink-sdk/DeckLinkAPI.h | 307 ++++++++++++- .../decklink-sdk/DeckLinkAPIConfiguration.h | 80 +++- .../DeckLinkAPIConfiguration_v10_2.h | 60 +++ .../DeckLinkAPIConfiguration_v10_4.h | 63 +++ .../DeckLinkAPIConfiguration_v10_5.h | 60 +++ .../decklink-sdk/DeckLinkAPIDeckControl.h | 2 +- .../linux/decklink-sdk/DeckLinkAPIDiscovery.h | 2 +- .../decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp | 109 +++++ .../decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp | 133 ++++++ .../linux/decklink-sdk/DeckLinkAPIModes.h | 9 +- .../linux/decklink-sdk/DeckLinkAPITypes.h | 14 +- .../linux/decklink-sdk/DeckLinkAPIVersion.h | 5 +- .../linux/decklink-sdk/DeckLinkAPI_v10_2.h | 55 +++ .../linux/decklink-sdk/DeckLinkAPI_v10_4.h | 45 ++ .../linux/decklink-sdk/DeckLinkAPI_v10_5.h | 46 ++ .../linux/decklink-sdk/DeckLinkAPI_v10_6.h | 50 +++ .../linux/decklink-sdk/DeckLinkAPI_v7_1.h | 198 ++++++++ .../linux/decklink-sdk/DeckLinkAPI_v7_3.h | 173 +++++++ .../linux/decklink-sdk/DeckLinkAPI_v7_6.h | 404 +++++++++++++++++ .../linux/decklink-sdk/DeckLinkAPI_v7_9.h | 88 ++++ .../linux/decklink-sdk/DeckLinkAPI_v8_0.h | 63 +++ .../linux/decklink-sdk/DeckLinkAPI_v8_1.h | 111 +++++ .../linux/decklink-sdk/DeckLinkAPI_v9_2.h | 81 ++++ .../linux/decklink-sdk/DeckLinkAPI_v9_9.h | 98 ++++ .../decklink/mac/decklink-sdk/DeckLinkAPI.h | 307 ++++++++++++- .../decklink-sdk/DeckLinkAPIConfiguration.h | 80 +++- .../DeckLinkAPIConfiguration_v10_2.h | 60 +++ .../DeckLinkAPIConfiguration_v10_4.h | 62 +++ .../DeckLinkAPIConfiguration_v10_5.h | 60 +++ .../mac/decklink-sdk/DeckLinkAPIDeckControl.h | 2 +- .../mac/decklink-sdk/DeckLinkAPIDiscovery.h | 2 +- .../decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp | 105 +++++ .../decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp | 131 ++++++ .../mac/decklink-sdk/DeckLinkAPIModes.h | 9 +- .../mac/decklink-sdk/DeckLinkAPIStreaming.h | 2 +- .../mac/decklink-sdk/DeckLinkAPITypes.h | 14 +- .../mac/decklink-sdk/DeckLinkAPIVersion.h | 4 +- .../mac/decklink-sdk/DeckLinkAPI_v10_2.h | 55 +++ .../mac/decklink-sdk/DeckLinkAPI_v10_4.h | 45 ++ .../mac/decklink-sdk/DeckLinkAPI_v10_5.h | 46 ++ .../mac/decklink-sdk/DeckLinkAPI_v10_6.h | 51 +++ .../mac/decklink-sdk/DeckLinkAPI_v7_1.h | 198 ++++++++ .../mac/decklink-sdk/DeckLinkAPI_v7_3.h | 173 +++++++ .../mac/decklink-sdk/DeckLinkAPI_v7_6.h | 421 ++++++++++++++++++ .../mac/decklink-sdk/DeckLinkAPI_v7_9.h | 91 ++++ .../mac/decklink-sdk/DeckLinkAPI_v8_0.h | 63 +++ .../mac/decklink-sdk/DeckLinkAPI_v8_1.h | 111 +++++ .../mac/decklink-sdk/DeckLinkAPI_v9_2.h | 81 ++++ .../mac/decklink-sdk/DeckLinkAPI_v9_9.h | 101 +++++ .../decklink/win/decklink-sdk/DeckLinkAPI.idl | 350 +++++++++++++-- .../decklink-sdk/DeckLinkAPIConfiguration.idl | 83 +++- .../decklink-sdk/DeckLinkAPIDeckControl.idl | 28 +- .../win/decklink-sdk/DeckLinkAPIDiscovery.idl | 6 +- .../win/decklink-sdk/DeckLinkAPIModes.idl | 15 +- .../win/decklink-sdk/DeckLinkAPIStreaming.idl | 16 +- .../win/decklink-sdk/DeckLinkAPITypes.idl | 23 +- .../win/decklink-sdk/DeckLinkAPIVersion.h | 5 +- .../win/decklink-sdk/DeckLinkAPI_v10_2.idl | 73 +++ .../win/decklink-sdk/DeckLinkAPI_v10_4.idl | 61 +++ .../win/decklink-sdk/DeckLinkAPI_v10_5.idl | 61 +++ .../win/decklink-sdk/DeckLinkAPI_v10_6.idl | 41 ++ .../win/decklink-sdk/DeckLinkAPI_v7_1.idl | 160 +++++++ .../win/decklink-sdk/DeckLinkAPI_v7_3.idl | 157 +++++++ .../win/decklink-sdk/DeckLinkAPI_v7_6.idl | 396 ++++++++++++++++ .../win/decklink-sdk/DeckLinkAPI_v7_9.idl | 69 +++ .../win/decklink-sdk/DeckLinkAPI_v8_0.idl | 62 +++ .../win/decklink-sdk/DeckLinkAPI_v8_1.idl | 101 +++++ .../win/decklink-sdk/DeckLinkAPI_v9_2.idl | 68 +++ .../win/decklink-sdk/DeckLinkAPI_v9_9.idl | 87 ++++ 69 files changed, 6293 insertions(+), 99 deletions(-) create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_4.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_5.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_6.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h create mode 100644 plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_4.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_5.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_6.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h create mode 100644 plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_4.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_6.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl create mode 100644 plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h index ef1da3fe66b08f..2eed7b7d8531cc 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -57,23 +57,31 @@ BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE}; BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A}; +BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31}; BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8}; BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6}; BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA}; BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4}; BMD_CONST REFIID IID_IDeckLinkOutput = /* CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564 */ {0xCC,0x5C,0x8A,0x6E,0x3F,0x2F,0x4B,0x3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64}; BMD_CONST REFIID IID_IDeckLinkInput = /* AF22762B-DFAC-4846-AA79-FA8883560995 */ {0xAF,0x22,0x76,0x2B,0xDF,0xAC,0x48,0x46,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95}; +BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* 270587DA-6B7D-42E7-A1F0-6D853F581185 */ {0x27,0x05,0x87,0xDA,0x6B,0x7D,0x42,0xE7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85}; BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17}; BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90}; BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7}; +BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F}; BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44}; BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04}; +BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20}; +BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0}; +BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A}; +BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7}; BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66}; BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38}; BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ {0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F}; BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D}; BMD_CONST REFIID IID_IDeckLinkNotification = /* 0A1FB207-E215-441B-9B19-6FA1575946C5 */ {0x0A,0x1F,0xB2,0x07,0xE2,0x15,0x44,0x1B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5}; BMD_CONST REFIID IID_IDeckLinkAttributes = /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ {0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4}; +BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46}; BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3}; BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A}; BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F}; @@ -90,12 +98,21 @@ enum _BMDVideoOutputFlags { bmdVideoOutputDualStream3D = 1 << 4 }; +/* Enum BMDPacketType - Type of packet */ + +typedef uint32_t BMDPacketType; +enum _BMDPacketType { + bmdPacketTypeStreamInterruptedMarker = /* 'sint' */ 0x73696E74, // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable + bmdPacketTypeStreamData = /* 'sdat' */ 0x73646174 // Regular stream data +}; + /* Enum BMDFrameFlags - Frame flags */ typedef uint32_t BMDFrameFlags; enum _BMDFrameFlags { bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = 1 << 0, + bmdFrameContainsHDRMetadata = 1 << 1, /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ @@ -133,6 +150,7 @@ enum _BMDDetectedVideoInputFormatFlags { typedef uint32_t BMDDeckLinkCapturePassthroughMode; enum _BMDDeckLinkCapturePassthroughMode { + bmdDeckLinkCapturePassthroughModeDisabled = /* 'pdis' */ 0x70646973, bmdDeckLinkCapturePassthroughModeDirect = /* 'pdir' */ 0x70646972, bmdDeckLinkCapturePassthroughModeCleanSwitch = /* 'pcln' */ 0x70636C6E }; @@ -155,6 +173,13 @@ enum _BMDReferenceStatus { bmdReferenceLocked = 1 << 1 }; +/* Enum BMDAudioFormat - Audio Format */ + +typedef uint32_t BMDAudioFormat; +enum _BMDAudioFormat { + bmdAudioFormatPCM = /* 'lpcm' */ 0x6C70636D // Linear signed PCM samples +}; + /* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */ typedef uint32_t BMDAudioSampleRate; @@ -267,8 +292,71 @@ enum _BMDVideo3DPackingFormat { typedef uint32_t BMDIdleVideoOutputOperation; enum _BMDIdleVideoOutputOperation { bmdIdleVideoOutputBlack = /* 'blac' */ 0x626C6163, - bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661, - bmdIdleVideoOutputDesktop = /* 'desk' */ 0x6465736B + bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661 +}; + +/* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */ + +typedef uint32_t BMDVideoEncoderFrameCodingMode; +enum _BMDVideoEncoderFrameCodingMode { + bmdVideoEncoderFrameCodingModeInter = /* 'inte' */ 0x696E7465, + bmdVideoEncoderFrameCodingModeIntra = /* 'intr' */ 0x696E7472 +}; + +/* Enum BMDDNxHRLevel - DNxHR Levels */ + +typedef uint32_t BMDDNxHRLevel; +enum _BMDDNxHRLevel { + bmdDNxHRLevelSQ = /* 'dnsq' */ 0x646E7371, + bmdDNxHRLevelLB = /* 'dnlb' */ 0x646E6C62, + bmdDNxHRLevelHQ = /* 'dnhq' */ 0x646E6871, + bmdDNxHRLevelHQX = /* 'dhqx' */ 0x64687178, + bmdDNxHRLevel444 = /* 'd444' */ 0x64343434 +}; + +/* Enum BMDLinkConfiguration - Video link configuration */ + +typedef uint32_t BMDLinkConfiguration; +enum _BMDLinkConfiguration { + bmdLinkConfigurationSingleLink = /* 'lcsl' */ 0x6C63736C, + bmdLinkConfigurationDualLink = /* 'lcdl' */ 0x6C63646C, + bmdLinkConfigurationQuadLink = /* 'lcql' */ 0x6C63716C +}; + +/* Enum BMDDeviceInterface - Device interface type */ + +typedef uint32_t BMDDeviceInterface; +enum _BMDDeviceInterface { + bmdDeviceInterfacePCI = /* 'pci ' */ 0x70636920, + bmdDeviceInterfaceUSB = /* 'usb ' */ 0x75736220, + bmdDeviceInterfaceThunderbolt = /* 'thun' */ 0x7468756E +}; + +/* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */ + +typedef uint32_t BMDDeckLinkFrameMetadataID; +enum _BMDDeckLinkFrameMetadataID { + bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = /* 'eotf' */ 0x656F7466, // EOTF in range 0-7 as per CEA 861.3 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = /* 'hdrx' */ 0x68647278, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = /* 'hdry' */ 0x68647279, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = /* 'hdgx' */ 0x68646778, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = /* 'hdgy' */ 0x68646779, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = /* 'hdbx' */ 0x68646278, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = /* 'hdby' */ 0x68646279, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointX = /* 'hdwx' */ 0x68647778, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointY = /* 'hdwy' */ 0x68647779, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = /* 'hdml' */ 0x68646D6C, // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = /* 'hmil' */ 0x686D696C, // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = /* 'mcll' */ 0x6D636C6C, // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 +}; + +/* Enum BMDDuplexMode - Duplex for configurable ports */ + +typedef uint32_t BMDDuplexMode; +enum _BMDDuplexMode { + bmdDuplexModeFull = /* 'fdup' */ 0x66647570, + bmdDuplexModeHalf = /* 'hdup' */ 0x68647570 }; /* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ @@ -288,10 +376,16 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = /* 'ovog' */ 0x6F766F67, BMDDeckLinkHasVideoInputAntiAliasingFilter = /* 'aafl' */ 0x6161666C, BMDDeckLinkHasBypass = /* 'byps' */ 0x62797073, - BMDDeckLinkSupportsDesktopDisplay = /* 'extd' */ 0x65787464, BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164, BMDDeckLinkSupportsFullDuplex = /* 'fdup' */ 0x66647570, BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E, + BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61, + BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73, + BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73, + BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75, + BMDDeckLinkHasLTCTimecodeInput = /* 'hltc' */ 0x686C7463, + BMDDeckLinkSupportsDuplexModeConfiguration = /* 'dupx' */ 0x64757078, + BMDDeckLinkSupportsHDRMetadata = /* 'hdrm' */ 0x6864726D, /* Integers */ @@ -300,13 +394,20 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkNumberOfSubDevices = /* 'nsbd' */ 0x6E736264, BMDDeckLinkSubDeviceIndex = /* 'subi' */ 0x73756269, BMDDeckLinkPersistentID = /* 'peid' */ 0x70656964, + BMDDeckLinkDeviceGroupID = /* 'dgid' */ 0x64676964, BMDDeckLinkTopologicalID = /* 'toid' */ 0x746F6964, BMDDeckLinkVideoOutputConnections = /* 'vocn' */ 0x766F636E, BMDDeckLinkVideoInputConnections = /* 'vicn' */ 0x7669636E, BMDDeckLinkAudioOutputConnections = /* 'aocn' */ 0x616F636E, BMDDeckLinkAudioInputConnections = /* 'aicn' */ 0x6169636E, - BMDDeckLinkDeviceBusyState = /* 'dbst' */ 0x64627374, BMDDeckLinkVideoIOSupport = /* 'vios' */ 0x76696F73, // Returns a BMDVideoIOSupport bit field + BMDDeckLinkDeckControlConnections = /* 'dccn' */ 0x6463636E, + BMDDeckLinkDeviceInterface = /* 'dbus' */ 0x64627573, // Returns a BMDDeviceInterface + BMDDeckLinkAudioInputRCAChannelCount = /* 'airc' */ 0x61697263, + BMDDeckLinkAudioInputXLRChannelCount = /* 'aixc' */ 0x61697863, + BMDDeckLinkAudioOutputRCAChannelCount = /* 'aorc' */ 0x616F7263, + BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863, + BMDDeckLinkPairedDevicePersistentID = /* 'ppid' */ 0x70706964, /* Floats */ @@ -314,10 +415,16 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkVideoInputGainMaximum = /* 'vigx' */ 0x76696778, BMDDeckLinkVideoOutputGainMinimum = /* 'vogm' */ 0x766F676D, BMDDeckLinkVideoOutputGainMaximum = /* 'vogx' */ 0x766F6778, + BMDDeckLinkMicrophoneInputGainMinimum = /* 'migm' */ 0x6D69676D, + BMDDeckLinkMicrophoneInputGainMaximum = /* 'migx' */ 0x6D696778, /* Strings */ - BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E + BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E, + BMDDeckLinkVendorName = /* 'vndr' */ 0x766E6472, + BMDDeckLinkDisplayName = /* 'dspn' */ 0x6473706E, + BMDDeckLinkModelName = /* 'mdln' */ 0x6D646C6E, + BMDDeckLinkDeviceHandle = /* 'devh' */ 0x64657668 }; /* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */ @@ -327,6 +434,52 @@ enum _BMDDeckLinkAPIInformationID { BMDDeckLinkAPIVersion = /* 'vers' */ 0x76657273 }; +/* Enum BMDDeckLinkStatusID - DeckLink Status ID */ + +typedef uint32_t BMDDeckLinkStatusID; +enum _BMDDeckLinkStatusID { + + /* Integers */ + + bmdDeckLinkStatusDetectedVideoInputMode = /* 'dvim' */ 0x6476696D, + bmdDeckLinkStatusDetectedVideoInputFlags = /* 'dvif' */ 0x64766966, + bmdDeckLinkStatusCurrentVideoInputMode = /* 'cvim' */ 0x6376696D, + bmdDeckLinkStatusCurrentVideoInputPixelFormat = /* 'cvip' */ 0x63766970, + bmdDeckLinkStatusCurrentVideoInputFlags = /* 'cvif' */ 0x63766966, + bmdDeckLinkStatusCurrentVideoOutputMode = /* 'cvom' */ 0x63766F6D, + bmdDeckLinkStatusCurrentVideoOutputFlags = /* 'cvof' */ 0x63766F66, + bmdDeckLinkStatusPCIExpressLinkWidth = /* 'pwid' */ 0x70776964, + bmdDeckLinkStatusPCIExpressLinkSpeed = /* 'plnk' */ 0x706C6E6B, + bmdDeckLinkStatusLastVideoOutputPixelFormat = /* 'opix' */ 0x6F706978, + bmdDeckLinkStatusReferenceSignalMode = /* 'refm' */ 0x7265666D, + bmdDeckLinkStatusReferenceSignalFlags = /* 'reff' */ 0x72656666, + bmdDeckLinkStatusDuplexMode = /* 'dupx' */ 0x64757078, + bmdDeckLinkStatusBusy = /* 'busy' */ 0x62757379, + + /* Flags */ + + bmdDeckLinkStatusVideoInputSignalLocked = /* 'visl' */ 0x7669736C, + bmdDeckLinkStatusReferenceSignalLocked = /* 'refl' */ 0x7265666C +}; + +/* Enum BMDDeckLinkVideoStatusFlags - */ + +typedef uint32_t BMDDeckLinkVideoStatusFlags; +enum _BMDDeckLinkVideoStatusFlags { + bmdDeckLinkVideoStatusPsF = 1 << 0, + bmdDeckLinkVideoStatusDualStream3D = 1 << 1 +}; + +/* Enum BMDDuplexStatus - Duplex status of the device */ + +typedef uint32_t BMDDuplexStatus; +enum _BMDDuplexStatus { + bmdDuplexStatusFullDuplex = /* 'fdup' */ 0x66647570, + bmdDuplexStatusHalfDuplex = /* 'hdup' */ 0x68647570, + bmdDuplexStatusSimplex = /* 'splx' */ 0x73706C78, + bmdDuplexStatusInactive = /* 'inac' */ 0x696E6163 +}; + /* Enum BMDDeviceBusyState - Current device busy state */ typedef uint32_t BMDDeviceBusyState; @@ -359,7 +512,8 @@ enum _BMD3DPreviewFormat { typedef uint32_t BMDNotifications; enum _BMDNotifications { - bmdPreferencesChanged = /* 'pref' */ 0x70726566 + bmdPreferencesChanged = /* 'pref' */ 0x70726566, + bmdStatusChanged = /* 'stat' */ 0x73746174 }; #if defined(__cplusplus) @@ -368,23 +522,31 @@ enum _BMDNotifications { class IDeckLinkVideoOutputCallback; class IDeckLinkInputCallback; +class IDeckLinkEncoderInputCallback; class IDeckLinkMemoryAllocator; class IDeckLinkAudioOutputCallback; class IDeckLinkIterator; class IDeckLinkAPIInformation; class IDeckLinkOutput; class IDeckLinkInput; +class IDeckLinkEncoderInput; class IDeckLinkVideoFrame; class IDeckLinkMutableVideoFrame; class IDeckLinkVideoFrame3DExtensions; +class IDeckLinkVideoFrameMetadataExtensions; class IDeckLinkVideoInputFrame; class IDeckLinkVideoFrameAncillary; +class IDeckLinkEncoderPacket; +class IDeckLinkEncoderVideoPacket; +class IDeckLinkEncoderAudioPacket; +class IDeckLinkH265NALPacket; class IDeckLinkAudioInputPacket; class IDeckLinkScreenPreviewCallback; class IDeckLinkGLScreenPreviewHelper; class IDeckLinkNotificationCallback; class IDeckLinkNotification; class IDeckLinkAttributes; +class IDeckLinkStatus; class IDeckLinkKeyer; class IDeckLinkVideoConversion; class IDeckLinkDeviceNotificationCallback; @@ -414,6 +576,19 @@ class IDeckLinkInputCallback : public IUnknown virtual ~IDeckLinkInputCallback () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */ + +class IDeckLinkEncoderInputCallback : public IUnknown +{ +public: + virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0; + virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0; + +protected: + virtual ~IDeckLinkEncoderInputCallback () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */ class IDeckLinkMemoryAllocator : public IUnknown @@ -552,6 +727,43 @@ class IDeckLinkInput : public IUnknown virtual ~IDeckLinkInput () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkEncoderInput : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0; + virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ class IDeckLinkVideoFrame : public IUnknown @@ -599,6 +811,20 @@ class IDeckLinkVideoFrame3DExtensions : public IUnknown virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count }; +/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */ + +class IDeckLinkVideoFrameMetadataExtensions : public IUnknown +{ +public: + virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ const char **value) = 0; + +protected: + virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame @@ -625,6 +851,58 @@ class IDeckLinkVideoFrameAncillary : public IUnknown virtual ~IDeckLinkVideoFrameAncillary () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */ + +class IDeckLinkEncoderPacket : public IUnknown +{ +public: + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + virtual long GetSize (void) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0; + virtual BMDPacketType GetPacketType (void) = 0; + +protected: + virtual ~IDeckLinkEncoderPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */ + +class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket +{ +public: + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; + +protected: + virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */ + +class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket +{ +public: + virtual BMDAudioFormat GetAudioFormat (void) = 0; + +protected: + virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */ + +class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket +{ +public: + virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0; + virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0; + virtual long GetSizeNoPrefix (void) = 0; + +protected: + virtual ~IDeckLinkH265NALPacket () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */ class IDeckLinkAudioInputPacket : public IUnknown @@ -697,6 +975,21 @@ class IDeckLinkAttributes : public IUnknown virtual ~IDeckLinkAttributes () {} // call Release method to drop reference count }; +/* Interface IDeckLinkStatus - DeckLink Status interface */ + +class IDeckLinkStatus : public IUnknown +{ +public: + virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ const char **value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0; + +protected: + virtual ~IDeckLinkStatus () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkKeyer - DeckLink Keyer interface */ class IDeckLinkKeyer : public IUnknown diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h index 3eb6148b11d55a..dedf15e962d748 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -42,7 +42,8 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB}; +BMD_CONST REFIID IID_IDeckLinkConfiguration = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2}; +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E}; /* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ @@ -62,6 +63,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigHDMI3DPackingFormat = /* '3dpf' */ 0x33647066, bmdDeckLinkConfigBypass = /* 'byps' */ 0x62797073, bmdDeckLinkConfigClockTimingAdjustment = /* 'ctad' */ 0x63746164, + bmdDeckLinkConfigDuplexMode = /* 'dupx' */ 0x64757078, /* Audio Input/Output Flags */ @@ -72,9 +74,10 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigFieldFlickerRemoval = /* 'fdfr' */ 0x66646672, bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = /* 'to59' */ 0x746F3539, bmdDeckLinkConfig444SDIVideoOutput = /* '444o' */ 0x3434346F, - bmdDeckLinkConfigSingleLinkVideoOutput = /* 'sglo' */ 0x73676C6F, bmdDeckLinkConfigBlackVideoOutputDuringCapture = /* 'bvoc' */ 0x62766F63, bmdDeckLinkConfigLowLatencyVideoOutput = /* 'llvo' */ 0x6C6C766F, + bmdDeckLinkConfigDownConversionOnAllAnalogOutput = /* 'caao' */ 0x6361616F, + bmdDeckLinkConfigSMPTELevelAOutput = /* 'smta' */ 0x736D7461, /* Video Output Integers */ @@ -85,6 +88,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoOutputIdleOperation = /* 'voio' */ 0x766F696F, bmdDeckLinkConfigDefaultVideoOutputMode = /* 'dvom' */ 0x64766F6D, bmdDeckLinkConfigDefaultVideoOutputModeFlags = /* 'dvof' */ 0x64766F66, + bmdDeckLinkConfigSDIOutputLinkConfiguration = /* 'solc' */ 0x736F6C63, /* Video Output Floats */ @@ -100,6 +104,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputScanning = /* 'visc' */ 0x76697363, // Applicable to H264 Pro Recorder only bmdDeckLinkConfigUseDedicatedLTCInput = /* 'dltc' */ 0x646C7463, // Use timecode from LTC input instead of SDI stream + bmdDeckLinkConfigSDIInput3DPayloadOverride = /* '3dds' */ 0x33646473, /* Video Input Integers */ @@ -122,6 +127,10 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputSVideoLumaGain = /* 'islg' */ 0x69736C67, bmdDeckLinkConfigVideoInputSVideoChromaGain = /* 'iscg' */ 0x69736367, + /* Audio Input Flags */ + + bmdDeckLinkConfigMicrophonePhantomPower = /* 'mphp' */ 0x6D706870, + /* Audio Input Integers */ bmdDeckLinkConfigAudioInputConnection = /* 'aicn' */ 0x6169636E, @@ -133,6 +142,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = /* 'ais3' */ 0x61697333, bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = /* 'ais4' */ 0x61697334, bmdDeckLinkConfigDigitalAudioInputScale = /* 'dais' */ 0x64616973, + bmdDeckLinkConfigMicrophoneInputGain = /* 'micg' */ 0x6D696367, /* Audio Output Integers */ @@ -144,12 +154,55 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = /* 'aos2' */ 0x616F7332, bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = /* 'aos3' */ 0x616F7333, bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = /* 'aos4' */ 0x616F7334, - bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73 + bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73, + bmdDeckLinkConfigHeadphoneVolume = /* 'hvol' */ 0x68766F6C, + + /* Device Information Strings */ + + bmdDeckLinkConfigDeviceInformationLabel = /* 'dila' */ 0x64696C61, + bmdDeckLinkConfigDeviceInformationSerialNumber = /* 'disn' */ 0x6469736E, + bmdDeckLinkConfigDeviceInformationCompany = /* 'dico' */ 0x6469636F, + bmdDeckLinkConfigDeviceInformationPhone = /* 'diph' */ 0x64697068, + bmdDeckLinkConfigDeviceInformationEmail = /* 'diem' */ 0x6469656D, + bmdDeckLinkConfigDeviceInformationDate = /* 'dida' */ 0x64696461, + + /* Deck Control Integers */ + + bmdDeckLinkConfigDeckControlConnection = /* 'dcco' */ 0x6463636F +}; + +/* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */ + +typedef uint32_t BMDDeckLinkEncoderConfigurationID; +enum _BMDDeckLinkEncoderConfigurationID { + + /* Video Encoder Integers */ + + bmdDeckLinkEncoderConfigPreferredBitDepth = /* 'epbr' */ 0x65706272, + bmdDeckLinkEncoderConfigFrameCodingMode = /* 'efcm' */ 0x6566636D, + + /* HEVC/H.265 Encoder Integers */ + + bmdDeckLinkEncoderConfigH265TargetBitrate = /* 'htbr' */ 0x68746272, + + /* DNxHR/DNxHD Compression ID */ + + bmdDeckLinkEncoderConfigDNxHRCompressionID = /* 'dcid' */ 0x64636964, + + /* DNxHR/DNxHD Level */ + + bmdDeckLinkEncoderConfigDNxHRLevel = /* 'dlev' */ 0x646C6576, + + /* Encoded Sample Decriptions */ + + bmdDeckLinkEncoderConfigMPEG4SampleDescription = /* 'stsE' */ 0x73747345, // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more + bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = /* 'esds' */ 0x65736473 // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more }; // Forward Declarations class IDeckLinkConfiguration; +class IDeckLinkEncoderConfiguration; /* Interface IDeckLinkConfiguration - DeckLink Configuration interface */ @@ -170,6 +223,25 @@ class IDeckLinkConfiguration : public IUnknown virtual ~IDeckLinkConfiguration () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +class IDeckLinkEncoderConfiguration : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ const char *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0; + +protected: + virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count +}; + /* Functions */ extern "C" { diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h new file mode 100644 index 00000000000000..30bd5ae545f91b --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h @@ -0,0 +1,60 @@ +/* -LICENSE-START- +** Copyright (c) 2014 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_2_H +#define BMD_DECKLINKAPICONFIGURATION_v10_2_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_2 = /* C679A35B-610C-4D09-B748-1D0478100FC0 */ {0xC6,0x79,0xA3,0x5B,0x61,0x0C,0x4D,0x09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0}; + +// Forward Declarations + +class IDeckLinkConfiguration_v10_2; + +/* Interface IDeckLinkConfiguration_v10_2 - DeckLink Configuration interface */ + +class IDeckLinkConfiguration_v10_2 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ const char *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + +protected: + virtual ~IDeckLinkConfiguration_v10_2 () {} // call Release method to drop reference count +}; + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_2_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h new file mode 100644 index 00000000000000..750387ffbeb02f --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h @@ -0,0 +1,63 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_4_H +#define BMD_DECKLINKAPICONFIGURATION_v10_4_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_4 = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB}; + + +// +// Forward Declarations + +class IDeckLinkConfiguration_v10_4; + +/* Interface IDeckLinkConfiguration_v10_4 - DeckLink Configuration interface */ + +class IDeckLinkConfiguration_v10_4 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ const char *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + +protected: + virtual ~IDeckLinkConfiguration_v10_4 () {} // call Release method to drop reference count +}; + + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_4_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h new file mode 100644 index 00000000000000..da36e5022e91fa --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h @@ -0,0 +1,60 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_5_H +#define BMD_DECKLINKAPICONFIGURATION_v10_5_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration_v10_5 = /* 67455668-0848-45DF-8D8E-350A77C9A028 */ {0x67,0x45,0x56,0x68,0x08,0x48,0x45,0xDF,0x8D,0x8E,0x35,0x0A,0x77,0xC9,0xA0,0x28}; + +// Forward Declarations + +class IDeckLinkEncoderConfiguration_v10_5; + +/* Interface IDeckLinkEncoderConfiguration_v10_5 - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +class IDeckLinkEncoderConfiguration_v10_5 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ const char *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ const char **value) = 0; + virtual HRESULT GetDecoderConfigurationInfo (/* out */ void *buffer, /* in */ long bufferSize, /* out */ long *returnedSize) = 0; + +protected: + virtual ~IDeckLinkEncoderConfiguration_v10_5 () {} // call Release method to drop reference count +}; + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_5_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h index 77827e1fe56cc6..8dc069c52528ed 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h index 042f85e6812aea..d9253ffa377096 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp new file mode 100644 index 00000000000000..4963060c87b28f --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp @@ -0,0 +1,109 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +**/ + +#include +#include +#include + +#include "DeckLinkAPI_v7_6.h" + +#define kDeckLinkAPI_Name "libDeckLinkAPI.so" +#define KDeckLinkPreviewAPI_Name "libDeckLinkPreviewAPI.so" + +typedef IDeckLinkIterator* (*CreateIteratorFunc_v7_6)(void); +typedef IDeckLinkGLScreenPreviewHelper_v7_6* (*CreateOpenGLScreenPreviewHelperFunc_v7_6)(void); +typedef IDeckLinkVideoConversion_v7_6* (*CreateVideoConversionInstanceFunc_v7_6)(void); + +static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; +static pthread_once_t gPreviewOnceControl = PTHREAD_ONCE_INIT; + +static CreateIteratorFunc_v7_6 gCreateIteratorFunc = NULL; +static CreateOpenGLScreenPreviewHelperFunc_v7_6 gCreateOpenGLPreviewFunc = NULL; +static CreateVideoConversionInstanceFunc_v7_6 gCreateVideoConversionFunc = NULL; + +void InitDeckLinkAPI_v7_6 (void) +{ + void *libraryHandle; + + libraryHandle = dlopen(kDeckLinkAPI_Name, RTLD_NOW|RTLD_GLOBAL); + if (!libraryHandle) + { + fprintf(stderr, "%s\n", dlerror()); + return; + } + + gCreateIteratorFunc = (CreateIteratorFunc_v7_6)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance"); + if (!gCreateIteratorFunc) + fprintf(stderr, "%s\n", dlerror()); + gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc_v7_6)dlsym(libraryHandle, "CreateVideoConversionInstance"); + if (!gCreateVideoConversionFunc) + fprintf(stderr, "%s\n", dlerror()); +} + +void InitDeckLinkPreviewAPI_v7_6 (void) +{ + void *libraryHandle; + + libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL); + if (!libraryHandle) + { + fprintf(stderr, "%s\n", dlerror()); + return; + } + gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc_v7_6)dlsym(libraryHandle, "CreateOpenGLScreenPreviewHelper"); + if (!gCreateOpenGLPreviewFunc) + fprintf(stderr, "%s\n", dlerror()); +} + +IDeckLinkIterator* CreateDeckLinkIteratorInstance_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateIteratorFunc == NULL) + return NULL; + return gCreateIteratorFunc(); +} + +IDeckLinkGLScreenPreviewHelper_v7_6* CreateOpenGLScreenPreviewHelper_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI_v7_6); + + if (gCreateOpenGLPreviewFunc == NULL) + return NULL; + return gCreateOpenGLPreviewFunc(); +} + +IDeckLinkVideoConversion_v7_6* CreateVideoConversionInstance_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateVideoConversionFunc == NULL) + return NULL; + return gCreateVideoConversionFunc(); +} + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp new file mode 100644 index 00000000000000..770f143528cee9 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp @@ -0,0 +1,133 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +**/ + +#include +#include +#include + +#include "DeckLinkAPI_v8_0.h" + +#define kDeckLinkAPI_Name "libDeckLinkAPI.so" +#define KDeckLinkPreviewAPI_Name "libDeckLinkPreviewAPI.so" + +typedef IDeckLinkIterator_v8_0* (*CreateIteratorFunc)(void); +typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void); +typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void); +typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void); + +static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; +static pthread_once_t gPreviewOnceControl = PTHREAD_ONCE_INIT; + +static bool gLoadedDeckLinkAPI = false; + +static CreateIteratorFunc gCreateIteratorFunc = NULL; +static CreateAPIInformationFunc gCreateAPIInformationFunc = NULL; +static CreateOpenGLScreenPreviewHelperFunc gCreateOpenGLPreviewFunc = NULL; +static CreateVideoConversionInstanceFunc gCreateVideoConversionFunc = NULL; + +void InitDeckLinkAPI (void) +{ + void *libraryHandle; + + libraryHandle = dlopen(kDeckLinkAPI_Name, RTLD_NOW|RTLD_GLOBAL); + if (!libraryHandle) + { + fprintf(stderr, "%s\n", dlerror()); + return; + } + + gLoadedDeckLinkAPI = true; + + gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0001"); + if (!gCreateIteratorFunc) + fprintf(stderr, "%s\n", dlerror()); + gCreateAPIInformationFunc = (CreateAPIInformationFunc)dlsym(libraryHandle, "CreateDeckLinkAPIInformationInstance_0001"); + if (!gCreateAPIInformationFunc) + fprintf(stderr, "%s\n", dlerror()); + gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)dlsym(libraryHandle, "CreateVideoConversionInstance_0001"); + if (!gCreateVideoConversionFunc) + fprintf(stderr, "%s\n", dlerror()); +} + +void InitDeckLinkPreviewAPI (void) +{ + void *libraryHandle; + + libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL); + if (!libraryHandle) + { + fprintf(stderr, "%s\n", dlerror()); + return; + } + gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc)dlsym(libraryHandle, "CreateOpenGLScreenPreviewHelper_0001"); + if (!gCreateOpenGLPreviewFunc) + fprintf(stderr, "%s\n", dlerror()); +} + +bool IsDeckLinkAPIPresent (void) +{ + // If the DeckLink API dynamic library was successfully loaded, return this knowledge to the caller + return gLoadedDeckLinkAPI; +} + +IDeckLinkIterator_v8_0* CreateDeckLinkIteratorInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateIteratorFunc == NULL) + return NULL; + return gCreateIteratorFunc(); +} + +IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateAPIInformationFunc == NULL) + return NULL; + return gCreateAPIInformationFunc(); +} + +IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI); + + if (gCreateOpenGLPreviewFunc == NULL) + return NULL; + return gCreateOpenGLPreviewFunc(); +} + +IDeckLinkVideoConversion* CreateVideoConversionInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateVideoConversionFunc == NULL) + return NULL; + return gCreateVideoConversionFunc(); +} + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h index b73174c09d089c..6c5205127b0021 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -135,7 +135,12 @@ enum _BMDPixelFormat { bmdFormat12BitRGB = /* 'R12B' */ 0x52313242, // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat12BitRGBLE = /* 'R12L' */ 0x5231324C, // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat10BitRGBXLE = /* 'R10l' */ 0x5231306C, // Little-endian 10-bit RGB with SMPTE video levels (64-940) - bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062 // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062, // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormatH265 = /* 'hev1' */ 0x68657631, // High Efficiency Video Coding (HEVC/h.265) + + /* AVID DNxHR */ + + bmdFormatDNxHR = /* 'AVdh' */ 0x41566468 }; /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h index 59a0a47112d23e..979a9aa99af536 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -77,7 +77,17 @@ enum _BMDAudioConnection { bmdAudioConnectionAESEBU = 1 << 1, bmdAudioConnectionAnalog = 1 << 2, bmdAudioConnectionAnalogXLR = 1 << 3, - bmdAudioConnectionAnalogRCA = 1 << 4 + bmdAudioConnectionAnalogRCA = 1 << 4, + bmdAudioConnectionMicrophone = 1 << 5, + bmdAudioConnectionHeadphones = 1 << 6 +}; + +/* Enum BMDDeckControlConnection - Deck control connections */ + +typedef uint32_t BMDDeckControlConnection; +enum _BMDDeckControlConnection { + bmdDeckControlConnectionRS422Remote1 = 1 << 0, + bmdDeckControlConnectionRS422Remote2 = 1 << 1 }; // Forward Declarations diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h index 719ae2bbf66448..dfd1799e540b0f 100644 --- a/plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h @@ -30,7 +30,8 @@ #ifndef __DeckLink_API_Version_h__ #define __DeckLink_API_Version_h__ -#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a030100 -#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.3.1" +#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a080000 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.8" #endif // __DeckLink_API_Version_h__ + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h new file mode 100644 index 00000000000000..a4651330fbb8fa --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h @@ -0,0 +1,55 @@ +/* -LICENSE-START- +** Copyright (c) 2014 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_2_H +#define BMD_DECKLINKAPI_v10_2_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef uint32_t BMDDeckLinkConfigurationID_v10_2; +enum _BMDDeckLinkConfigurationID_v10_2 { + /* Video output flags */ + + bmdDeckLinkConfig3GBpsVideoOutput_v10_2 = '3gbs', +}; + +/* Enum BMDAudioConnection_v10_2 - Audio connection types */ + +typedef uint32_t BMDAudioConnection_v10_2; +enum _BMDAudioConnection_v10_2 { + bmdAudioConnectionEmbedded_v10_2 = /* 'embd' */ 0x656D6264, + bmdAudioConnectionAESEBU_v10_2 = /* 'aes ' */ 0x61657320, + bmdAudioConnectionAnalog_v10_2 = /* 'anlg' */ 0x616E6C67, + bmdAudioConnectionAnalogXLR_v10_2 = /* 'axlr' */ 0x61786C72, + bmdAudioConnectionAnalogRCA_v10_2 = /* 'arca' */ 0x61726361 +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_2_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_4.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_4.h new file mode 100644 index 00000000000000..7e5019ca2b05a0 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_4.h @@ -0,0 +1,45 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_4_H +#define BMD_DECKLINKAPI_v10_4_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef uint32_t BMDDeckLinkConfigurationID_v10_4; +enum _BMDDeckLinkConfigurationID_v10_4 { + + /* Video output flags */ + + bmdDeckLinkConfigSingleLinkVideoOutput_v10_4 = /* 'sglo' */ 0x73676C6F, +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_4_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_5.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_5.h new file mode 100644 index 00000000000000..4439daef7b024e --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_5.h @@ -0,0 +1,46 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_5_H +#define BMD_DECKLINKAPI_v10_5_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef uint32_t BMDDeckLinkAttributeID_v10_5; +enum _BMDDeckLinkAttributeID_v10_5 { + + /* Integers */ + + BMDDeckLinkDeviceBusyState_v10_5 = /* 'dbst' */ 0x64627374, +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_5_H) */ + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_6.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_6.h new file mode 100644 index 00000000000000..3c935789514292 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_6.h @@ -0,0 +1,50 @@ +/* -LICENSE-START- +** Copyright (c) 2016 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_6_H +#define BMD_DECKLINKAPI_v10_6_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef uint32_t BMDDeckLinkAttributeID_c10_6; +enum _BMDDeckLinkAttributeID_v10_6 { + + /* Flags */ + + BMDDeckLinkSupportsDesktopDisplay_v10_6 = /* 'extd' */ 0x65787464, +}; + +typedef uint32_t BMDIdleVideoOutputOperation_v10_6; +enum _BMDIdleVideoOutputOperation_v10_6 { + bmdIdleVideoOutputDesktop_v10_6 = /* 'desk' */ 0x6465736B +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_6_H) */ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h new file mode 100644 index 00000000000000..1602d6a30922a4 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h @@ -0,0 +1,198 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v7_1.h */ + +#ifndef __DeckLink_API_v7_1_h__ +#define __DeckLink_API_v7_1_h__ + +#include "DeckLinkAPI.h" + +// "B28131B6-59AC-4857-B5AC-CD75D5883E2F" +#define IID_IDeckLinkDisplayModeIterator_v7_1 (REFIID){0xB2,0x81,0x31,0xB6,0x59,0xAC,0x48,0x57,0xB5,0xAC,0xCD,0x75,0xD5,0x88,0x3E,0x2F} + +// "AF0CD6D5-8376-435E-8433-54F9DD530AC3" +#define IID_IDeckLinkDisplayMode_v7_1 (REFIID){0xAF,0x0C,0xD6,0xD5,0x83,0x76,0x43,0x5E,0x84,0x33,0x54,0xF9,0xDD,0x53,0x0A,0xC3} + +// "EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9" +#define IID_IDeckLinkVideoOutputCallback_v7_1 (REFIID){0xEB,0xD0,0x1A,0xFA,0xE4,0xB0,0x49,0xC6,0xA0,0x1D,0xED,0xB9,0xD1,0xB5,0x5F,0xD9} + +// "7F94F328-5ED4-4E9F-9729-76A86BDC99CC" +#define IID_IDeckLinkInputCallback_v7_1 (REFIID){0x7F,0x94,0xF3,0x28,0x5E,0xD4,0x4E,0x9F,0x97,0x29,0x76,0xA8,0x6B,0xDC,0x99,0xCC} + +// "AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5" +#define IID_IDeckLinkOutput_v7_1 (REFIID){0xAE,0x5B,0x3E,0x9B,0x4E,0x1E,0x45,0x35,0xB6,0xE8,0x48,0x0F,0xF5,0x2F,0x6C,0xE5} + +// "2B54EDEF-5B32-429F-BA11-BB990596EACD" +#define IID_IDeckLinkInput_v7_1 (REFIID){0x2B,0x54,0xED,0xEF,0x5B,0x32,0x42,0x9F,0xBA,0x11,0xBB,0x99,0x05,0x96,0xEA,0xCD} + +// "333F3A10-8C2D-43CF-B79D-46560FEEA1CE" +#define IID_IDeckLinkVideoFrame_v7_1 (REFIID){0x33,0x3F,0x3A,0x10,0x8C,0x2D,0x43,0xCF,0xB7,0x9D,0x46,0x56,0x0F,0xEE,0xA1,0xCE} + +// "C8B41D95-8848-40EE-9B37-6E3417FB114B" +#define IID_IDeckLinkVideoInputFrame_v7_1 (REFIID){0xC8,0xB4,0x1D,0x95,0x88,0x48,0x40,0xEE,0x9B,0x37,0x6E,0x34,0x17,0xFB,0x11,0x4B} + +// "C86DE4F6-A29F-42E3-AB3A-1363E29F0788" +#define IID_IDeckLinkAudioInputPacket_v7_1 (REFIID){0xC8,0x6D,0xE4,0xF6,0xA2,0x9F,0x42,0xE3,0xAB,0x3A,0x13,0x63,0xE2,0x9F,0x07,0x88} + +#if defined(__cplusplus) + +class IDeckLinkDisplayModeIterator_v7_1; +class IDeckLinkDisplayMode_v7_1; +class IDeckLinkVideoFrame_v7_1; +class IDeckLinkVideoInputFrame_v7_1; +class IDeckLinkAudioInputPacket_v7_1; + +class IDeckLinkDisplayModeIterator_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Next (IDeckLinkDisplayMode_v7_1* *deckLinkDisplayMode) = 0; +}; + + +class IDeckLinkDisplayMode_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetName (const char **name) = 0; + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode () = 0; + virtual long STDMETHODCALLTYPE GetWidth () = 0; + virtual long STDMETHODCALLTYPE GetHeight () = 0; + virtual HRESULT STDMETHODCALLTYPE GetFrameRate (BMDTimeValue *frameDuration, BMDTimeScale *timeScale) = 0; +}; + +class IDeckLinkVideoOutputCallback_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted (IDeckLinkVideoFrame_v7_1* completedFrame, BMDOutputFrameCompletionResult result) = 0; +}; + +class IDeckLinkInputCallback_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived (IDeckLinkVideoInputFrame_v7_1* videoFrame, IDeckLinkAudioInputPacket_v7_1* audioPacket) = 0; +}; + +// IDeckLinkOutput_v7_1. Created by QueryInterface from IDeckLink. +class IDeckLinkOutput_v7_1 : public IUnknown +{ +public: + // Display mode predicates + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDDisplayModeSupport *result) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator (IDeckLinkDisplayModeIterator_v7_1* *iterator) = 0; + + + // Video output + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput (BMDDisplayMode displayMode) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput () = 0; + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator (IDeckLinkMemoryAllocator* theAllocator) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame (int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1* *outFrame) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrameFromBuffer (void* buffer, int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1* *outFrame) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync (IDeckLinkVideoFrame_v7_1* theFrame) = 0; + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame (IDeckLinkVideoFrame_v7_1* theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback (IDeckLinkVideoOutputCallback_v7_1* theCallback) = 0; + + + // Audio output + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput () = 0; + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync (void* buffer, uint32_t sampleFrameCount, uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll () = 0; + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll () = 0; + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples (void* buffer, uint32_t sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount (uint32_t *bufferedSampleCount) = 0; + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples () = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback (IDeckLinkAudioOutputCallback* theCallback) = 0; + + + // Output control + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; +}; + +// IDeckLinkInput_v7_1. Created by QueryInterface from IDeckLink. +class IDeckLinkInput_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDDisplayModeSupport *result) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator (IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0; + + // Video input + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput () = 0; + + // Audio input + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput () = 0; + virtual HRESULT STDMETHODCALLTYPE ReadAudioSamples (void* buffer, uint32_t sampleFrameCount, uint32_t *sampleFramesRead, BMDTimeValue *audioPacketTime, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount (uint32_t *bufferedSampleCount) = 0; + + // Input control + virtual HRESULT STDMETHODCALLTYPE StartStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE StopStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE PauseStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE SetCallback (IDeckLinkInputCallback_v7_1* theCallback) = 0; +}; + +// IDeckLinkVideoFrame_v7_1. Created by IDeckLinkOutput::CreateVideoFrame. +class IDeckLinkVideoFrame_v7_1 : public IUnknown +{ +public: + virtual long STDMETHODCALLTYPE GetWidth () = 0; + virtual long STDMETHODCALLTYPE GetHeight () = 0; + virtual long STDMETHODCALLTYPE GetRowBytes () = 0; + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat () = 0; + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags () = 0; + virtual HRESULT STDMETHODCALLTYPE GetBytes (void* *buffer) = 0; +}; + +// IDeckLinkVideoInputFrame_v7_1. Provided by the IDeckLinkInput_v7_1 frame arrival callback. +class IDeckLinkVideoInputFrame_v7_1 : public IDeckLinkVideoFrame_v7_1 +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetFrameTime (BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; +}; + +// IDeckLinkAudioInputPacket_v7_1. Provided by the IDeckLinkInput_v7_1 callback. +class IDeckLinkAudioInputPacket_v7_1 : public IUnknown +{ +public: + virtual long STDMETHODCALLTYPE GetSampleCount () = 0; + virtual HRESULT STDMETHODCALLTYPE GetBytes (void* *buffer) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale) = 0; +}; + +#endif // defined(__cplusplus) + +#endif // __DeckLink_API_v7_1_h__ + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h new file mode 100644 index 00000000000000..c8b3da80f9f1ad --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h @@ -0,0 +1,173 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_3.h */ + +#ifndef __DeckLink_API_v7_3_h__ +#define __DeckLink_API_v7_3_h__ + +#include "DeckLinkAPI.h" +#include "DeckLinkAPI_v7_6.h" + +/* Interface ID Declarations */ + +#define IID_IDeckLinkInputCallback_v7_3 /* FD6F311D-4D00-444B-9ED4-1F25B5730AD0 */ (REFIID){0xFD,0x6F,0x31,0x1D,0x4D,0x00,0x44,0x4B,0x9E,0xD4,0x1F,0x25,0xB5,0x73,0x0A,0xD0} +#define IID_IDeckLinkOutput_v7_3 /* 271C65E3-C323-4344-A30F-D908BCB20AA3 */ (REFIID){0x27,0x1C,0x65,0xE3,0xC3,0x23,0x43,0x44,0xA3,0x0F,0xD9,0x08,0xBC,0xB2,0x0A,0xA3} +#define IID_IDeckLinkInput_v7_3 /* 4973F012-9925-458C-871C-18774CDBBECB */ (REFIID){0x49,0x73,0xF0,0x12,0x99,0x25,0x45,0x8C,0x87,0x1C,0x18,0x77,0x4C,0xDB,0xBE,0xCB} +#define IID_IDeckLinkVideoInputFrame_v7_3 /* CF317790-2894-11DE-8C30-0800200C9A66 */ (REFIID){0xCF,0x31,0x77,0x90,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66} + +/* End Interface ID Declarations */ + +#if defined(__cplusplus) + +/* Forward Declarations */ + +class IDeckLinkVideoInputFrame_v7_3; + +/* End Forward Declarations */ + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v7_3 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (BMDDisplayMode displayMode, BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; + virtual HRESULT CreateAncillaryData (BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount, BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, uint32_t sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; + +protected: + virtual ~IDeckLinkOutput_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkOutput */ + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +class IDeckLinkInputCallback_v7_3 : public IUnknown +{ +public: + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame_v7_3 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; + +protected: + virtual ~IDeckLinkInputCallback_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkInputCallback */ + + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v7_3 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback_v7_3 *theCallback) = 0; + +protected: + virtual ~IDeckLinkInput_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkInput */ + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +class IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; + +protected: + virtual ~IDeckLinkVideoInputFrame_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkVideoInputFrame */ + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_3_h__ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h new file mode 100644 index 00000000000000..8bc9329d8d2701 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h @@ -0,0 +1,404 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_6.h */ + +#ifndef __DeckLink_API_v7_6_h__ +#define __DeckLink_API_v7_6_h__ + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +#define IID_IDeckLinkVideoOutputCallback_v7_6 /* E763A626-4A3C-49D1-BF13-E7AD3692AE52 */ (REFIID){0xE7,0x63,0xA6,0x26,0x4A,0x3C,0x49,0xD1,0xBF,0x13,0xE7,0xAD,0x36,0x92,0xAE,0x52} +#define IID_IDeckLinkInputCallback_v7_6 /* 31D28EE7-88B6-4CB1-897A-CDBF79A26414 */ (REFIID){0x31,0xD2,0x8E,0xE7,0x88,0xB6,0x4C,0xB1,0x89,0x7A,0xCD,0xBF,0x79,0xA2,0x64,0x14} +#define IID_IDeckLinkDisplayModeIterator_v7_6 /* 455D741F-1779-4800-86F5-0B5D13D79751 */ (REFIID){0x45,0x5D,0x74,0x1F,0x17,0x79,0x48,0x00,0x86,0xF5,0x0B,0x5D,0x13,0xD7,0x97,0x51} +#define IID_IDeckLinkDisplayMode_v7_6 /* 87451E84-2B7E-439E-A629-4393EA4A8550 */ (REFIID){0x87,0x45,0x1E,0x84,0x2B,0x7E,0x43,0x9E,0xA6,0x29,0x43,0x93,0xEA,0x4A,0x85,0x50} +#define IID_IDeckLinkOutput_v7_6 /* 29228142-EB8C-4141-A621-F74026450955 */ (REFIID){0x29,0x22,0x81,0x42,0xEB,0x8C,0x41,0x41,0xA6,0x21,0xF7,0x40,0x26,0x45,0x09,0x55} +#define IID_IDeckLinkInput_v7_6 /* 300C135A-9F43-48E2-9906-6D7911D93CF1 */ (REFIID){0x30,0x0C,0x13,0x5A,0x9F,0x43,0x48,0xE2,0x99,0x06,0x6D,0x79,0x11,0xD9,0x3C,0xF1} +#define IID_IDeckLinkTimecode_v7_6 /* EFB9BCA6-A521-44F7-BD69-2332F24D9EE6 */ (REFIID){0xEF,0xB9,0xBC,0xA6,0xA5,0x21,0x44,0xF7,0xBD,0x69,0x23,0x32,0xF2,0x4D,0x9E,0xE6} +#define IID_IDeckLinkVideoFrame_v7_6 /* A8D8238E-6B18-4196-99E1-5AF717B83D32 */ (REFIID){0xA8,0xD8,0x23,0x8E,0x6B,0x18,0x41,0x96,0x99,0xE1,0x5A,0xF7,0x17,0xB8,0x3D,0x32} +#define IID_IDeckLinkMutableVideoFrame_v7_6 /* 46FCEE00-B4E6-43D0-91C0-023A7FCEB34F */ (REFIID){0x46,0xFC,0xEE,0x00,0xB4,0xE6,0x43,0xD0,0x91,0xC0,0x02,0x3A,0x7F,0xCE,0xB3,0x4F} +#define IID_IDeckLinkVideoInputFrame_v7_6 /* 9A74FA41-AE9F-47AC-8CF4-01F42DD59965 */ (REFIID){0x9A,0x74,0xFA,0x41,0xAE,0x9F,0x47,0xAC,0x8C,0xF4,0x01,0xF4,0x2D,0xD5,0x99,0x65} +#define IID_IDeckLinkScreenPreviewCallback_v7_6 /* 373F499D-4B4D-4518-AD22-6354E5A5825E */ (REFIID){0x37,0x3F,0x49,0x9D,0x4B,0x4D,0x45,0x18,0xAD,0x22,0x63,0x54,0xE5,0xA5,0x82,0x5E} +#define IID_IDeckLinkGLScreenPreviewHelper_v7_6 /* BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA */ (REFIID){0xBA,0x57,0x5C,0xD9,0xA1,0x5E,0x49,0x7B,0xB2,0xC2,0xF9,0xAF,0xE7,0xBE,0x4E,0xBA} +#define IID_IDeckLinkVideoConversion_v7_6 /* 3EB504C9-F97D-40FE-A158-D407D48CB53B */ (REFIID){0x3E,0xB5,0x04,0xC9,0xF9,0x7D,0x40,0xFE,0xA1,0x58,0xD4,0x07,0xD4,0x8C,0xB5,0x3B} +#define IID_IDeckLinkConfiguration_v7_6 /* B8EAD569-B764-47F0-A73F-AE40DF6CBF10 */ (REFIID){0xB8,0xEA,0xD5,0x69,0xB7,0x64,0x47,0xF0,0xA7,0x3F,0xAE,0x40,0xDF,0x6C,0xBF,0x10} + + +#if defined(__cplusplus) + +/* Enum BMDVideoConnection - Video connection types */ + +typedef uint32_t BMDVideoConnection_v7_6; +enum _BMDVideoConnection_v7_6 { + bmdVideoConnectionSDI_v7_6 = 'sdi ', + bmdVideoConnectionHDMI_v7_6 = 'hdmi', + bmdVideoConnectionOpticalSDI_v7_6 = 'opti', + bmdVideoConnectionComponent_v7_6 = 'cpnt', + bmdVideoConnectionComposite_v7_6 = 'cmst', + bmdVideoConnectionSVideo_v7_6 = 'svid' +}; + +// Forward Declarations + +class IDeckLinkVideoOutputCallback_v7_6; +class IDeckLinkInputCallback_v7_6; +class IDeckLinkDisplayModeIterator_v7_6; +class IDeckLinkDisplayMode_v7_6; +class IDeckLinkOutput_v7_6; +class IDeckLinkInput_v7_6; +class IDeckLinkTimecode_v7_6; +class IDeckLinkVideoFrame_v7_6; +class IDeckLinkMutableVideoFrame_v7_6; +class IDeckLinkVideoInputFrame_v7_6; +class IDeckLinkScreenPreviewCallback_v7_6; +class IDeckLinkGLScreenPreviewHelper_v7_6; +class IDeckLinkVideoConversion_v7_6; + + +/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */ + +class IDeckLinkVideoOutputCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame_v7_6 *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; + virtual HRESULT ScheduledPlaybackHasStopped (void) = 0; + +protected: + virtual ~IDeckLinkVideoOutputCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +class IDeckLinkInputCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame_v7_6* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0; + +protected: + virtual ~IDeckLinkInputCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ + +class IDeckLinkDisplayModeIterator_v7_6 : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode) = 0; + +protected: + virtual ~IDeckLinkDisplayModeIterator_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkDisplayMode - represents a display mode */ + +class IDeckLinkDisplayMode_v7_6 : public IUnknown +{ +public: + virtual HRESULT GetName (/* out */ const char **name) = 0; + virtual BMDDisplayMode GetDisplayMode (void) = 0; + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; + virtual BMDFieldDominance GetFieldDominance (void) = 0; + +protected: + virtual ~IDeckLinkDisplayMode_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v7_6 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback_v7_6 *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkOutput_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkInput_v7_6 - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v7_6 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback_v7_6 *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkInput_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkTimecode - Used for video frame timecode representation. */ + +class IDeckLinkTimecode_v7_6 : public IUnknown +{ +public: + virtual BMDTimecodeBCD GetBCD (void) = 0; + virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0; + virtual HRESULT GetString (/* out */ const char **timecode) = 0; + virtual BMDTimecodeFlags GetFlags (void) = 0; + +protected: + virtual ~IDeckLinkTimecode_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ + +class IDeckLinkVideoFrame_v7_6 : public IUnknown +{ +public: + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual long GetRowBytes (void) = 0; + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual BMDFrameFlags GetFlags (void) = 0; + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + + virtual HRESULT GetTimecode (BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode) = 0; + virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; + +protected: + virtual ~IDeckLinkVideoFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */ + +class IDeckLinkMutableVideoFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT SetFlags (BMDFrameFlags newFlags) = 0; + + virtual HRESULT SetTimecode (BMDTimecodeFormat format, /* in */ IDeckLinkTimecode_v7_6 *timecode) = 0; + virtual HRESULT SetTimecodeFromComponents (BMDTimecodeFormat format, uint8_t hours, uint8_t minutes, uint8_t seconds, uint8_t frames, BMDTimecodeFlags flags) = 0; + virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; + +protected: + virtual ~IDeckLinkMutableVideoFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +class IDeckLinkVideoInputFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + +protected: + virtual ~IDeckLinkVideoInputFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */ + +class IDeckLinkScreenPreviewCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + +protected: + virtual ~IDeckLinkScreenPreviewCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ + +class IDeckLinkGLScreenPreviewHelper_v7_6 : public IUnknown +{ +public: + + /* Methods must be called with OpenGL context set */ + + virtual HRESULT InitializeGL (void) = 0; + virtual HRESULT PaintGL (void) = 0; + virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + +protected: + virtual ~IDeckLinkGLScreenPreviewHelper_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ + +class IDeckLinkVideoConversion_v7_6 : public IUnknown +{ +public: + virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame_v7_6* srcFrame, /* in */ IDeckLinkVideoFrame_v7_6* dstFrame) = 0; + +protected: + virtual ~IDeckLinkVideoConversion_v7_6 () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkConfiguration - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkConfiguration_v7_6 : public IUnknown +{ +public: + virtual HRESULT GetConfigurationValidator (/* out */ IDeckLinkConfiguration_v7_6 **configObject) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + + /* Video Output Configuration */ + + virtual HRESULT SetVideoOutputFormat (/* in */ BMDVideoConnection_v7_6 videoOutputConnection) = 0; + virtual HRESULT IsVideoOutputActive (/* in */ BMDVideoConnection_v7_6 videoOutputConnection, /* out */ bool *active) = 0; + + virtual HRESULT SetAnalogVideoOutputFlags (/* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; + virtual HRESULT GetAnalogVideoOutputFlags (/* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; + + virtual HRESULT EnableFieldFlickerRemovalWhenPaused (/* in */ bool enable) = 0; + virtual HRESULT IsEnabledFieldFlickerRemovalWhenPaused (/* out */ bool *enabled) = 0; + + virtual HRESULT Set444And3GBpsVideoOutput (/* in */ bool enable444VideoOutput, /* in */ bool enable3GbsOutput) = 0; + virtual HRESULT Get444And3GBpsVideoOutput (/* out */ bool *is444VideoOutputEnabled, /* out */ bool *threeGbsOutputEnabled) = 0; + + virtual HRESULT SetVideoOutputConversionMode (/* in */ BMDVideoOutputConversionMode conversionMode) = 0; + virtual HRESULT GetVideoOutputConversionMode (/* out */ BMDVideoOutputConversionMode *conversionMode) = 0; + + virtual HRESULT Set_HD1080p24_to_HD1080i5994_Conversion (/* in */ bool enable) = 0; + virtual HRESULT Get_HD1080p24_to_HD1080i5994_Conversion (/* out */ bool *enabled) = 0; + + /* Video Input Configuration */ + + virtual HRESULT SetVideoInputFormat (/* in */ BMDVideoConnection_v7_6 videoInputFormat) = 0; + virtual HRESULT GetVideoInputFormat (/* out */ BMDVideoConnection_v7_6 *videoInputFormat) = 0; + + virtual HRESULT SetAnalogVideoInputFlags (/* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; + virtual HRESULT GetAnalogVideoInputFlags (/* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; + + virtual HRESULT SetVideoInputConversionMode (/* in */ BMDVideoInputConversionMode conversionMode) = 0; + virtual HRESULT GetVideoInputConversionMode (/* out */ BMDVideoInputConversionMode *conversionMode) = 0; + + virtual HRESULT SetBlackVideoOutputDuringCapture (/* in */ bool blackOutInCapture) = 0; + virtual HRESULT GetBlackVideoOutputDuringCapture (/* out */ bool *blackOutInCapture) = 0; + + virtual HRESULT Set32PulldownSequenceInitialTimecodeFrame (/* in */ uint32_t aFrameTimecode) = 0; + virtual HRESULT Get32PulldownSequenceInitialTimecodeFrame (/* out */ uint32_t *aFrameTimecode) = 0; + + virtual HRESULT SetVancSourceLineMapping (/* in */ uint32_t activeLine1VANCsource, /* in */ uint32_t activeLine2VANCsource, /* in */ uint32_t activeLine3VANCsource) = 0; + virtual HRESULT GetVancSourceLineMapping (/* out */ uint32_t *activeLine1VANCsource, /* out */ uint32_t *activeLine2VANCsource, /* out */ uint32_t *activeLine3VANCsource) = 0; + + /* Audio Input Configuration */ + + virtual HRESULT SetAudioInputFormat (/* in */ BMDAudioConnection audioInputFormat) = 0; + virtual HRESULT GetAudioInputFormat (/* out */ BMDAudioConnection *audioInputFormat) = 0; +}; + +/* Functions */ + +extern "C" { + + IDeckLinkIterator* CreateDeckLinkIteratorInstance_v7_6 (void); + IDeckLinkGLScreenPreviewHelper_v7_6* CreateOpenGLScreenPreviewHelper_v7_6 (void); + IDeckLinkVideoConversion_v7_6* CreateVideoConversionInstance_v7_6 (void); + +}; + + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_6_h__ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h new file mode 100644 index 00000000000000..406ce0a2c32a50 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h @@ -0,0 +1,88 @@ +/* -LICENSE-START- +** Copyright (c) 2010 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_9.h */ + +#ifndef __DeckLink_API_v7_9_h__ +#define __DeckLink_API_v7_9_h__ + +#include "DeckLinkAPI.h" + +// Interface ID Declarations +#define IID_IDeckLinkDeckControl_v7_9 /* A4D81043-0619-42B7-8ED6-602D29041DF7 */ (REFIID){0xA4,0xD8,0x10,0x43,0x06,0x19,0x42,0xB7,0x8E,0xD6,0x60,0x2D,0x29,0x04,0x1D,0xF7} + +#if defined(__cplusplus) + + +// Forward Declarations +class IDeckLinkDeckControl_v7_9; + +/* Interface IDeckLinkDeckControl_v7_9 - Deck Control main interface */ +class IDeckLinkDeckControl_v7_9 : public IUnknown +{ +public: + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Close (/* in */ bool standbyOn) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeString (/* out */ const char **currentTimeCode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Abort (void) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; + +protected: + virtual ~IDeckLinkDeckControl_v7_9 () {}; // call Release method to drop reference count +}; + + + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_9_h__ diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h new file mode 100644 index 00000000000000..832664c7481e18 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h @@ -0,0 +1,63 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v8_0_H +#define BMD_DECKLINKAPI_v8_0_H + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +#define IID_IDeckLink_v8_0 /* 62BFF75D-6569-4E55-8D4D-66AA03829ABC */ (REFIID){0x62,0xBF,0xF7,0x5D,0x65,0x69,0x4E,0x55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC} +#define IID_IDeckLinkIterator_v8_0 /* 74E936FC-CC28-4A67-81A0-1E94E52D4E69 */ (REFIID){0x74,0xE9,0x36,0xFC,0xCC,0x28,0x4A,0x67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69} + +#if defined (__cplusplus) + +/* Interface IDeckLink_v8_0 - represents a DeckLink device */ + +class IDeckLink_v8_0 : public IUnknown +{ +public: + virtual HRESULT GetModelName (/* out */ const char **modelName) = 0; +}; + +/* Interface IDeckLinkIterator_v8_0 - enumerates installed DeckLink hardware */ + +class IDeckLinkIterator_v8_0 : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLink_v8_0 **deckLinkInstance) = 0; +}; + +extern "C" { + IDeckLinkIterator_v8_0* CreateDeckLinkIteratorInstance_v8_0 (void); +}; + +#endif // defined __cplusplus + +#endif /* defined(BMD_DECKLINKAPI_v8_0_H) */ + diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h new file mode 100644 index 00000000000000..7f68919b361d2b --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h @@ -0,0 +1,111 @@ +/* -LICENSE-START- + ** Copyright (c) 2011 Blackmagic Design + ** + ** Permission is hereby granted, free of charge, to any person or organization + ** obtaining a copy of the software and accompanying documentation covered by + ** this license (the "Software") to use, reproduce, display, distribute, + ** execute, and transmit the Software, and to prepare derivative works of the + ** Software, and to permit third-parties to whom the Software is furnished to + ** do so, all subject to the following: + ** + ** The copyright notices in the Software and this entire statement, including + ** the above license grant, this restriction and the following disclaimer, + ** must be included in all copies of the Software, in whole or in part, and + ** all derivative works of the Software, unless such copies or derivative + ** works are solely in the form of machine-executable object code generated by + ** a source language processor. + ** + ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + ** DEALINGS IN THE SOFTWARE. + ** -LICENSE-END- + */ + +#ifndef BMD_DECKLINKAPI_v8_1_H +#define BMD_DECKLINKAPI_v8_1_H + +#include "DeckLinkAPI.h" + + +// Interface ID Declarations + +#define IID_IDeckLinkDeckControlStatusCallback_v8_1 /* E5F693C1-4283-4716-B18F-C1431521955B */ (REFIID){0xE5,0xF6,0x93,0xC1,0x42,0x83,0x47,0x16,0xB1,0x8F,0xC1,0x43,0x15,0x21,0x95,0x5B} +#define IID_IDeckLinkDeckControl_v8_1 /* 522A9E39-0F3C-4742-94EE-D80DE335DA1D */ (REFIID){0x52,0x2A,0x9E,0x39,0x0F,0x3C,0x47,0x42,0x94,0xEE,0xD8,0x0D,0xE3,0x35,0xDA,0x1D} + + +/* Enum BMDDeckControlVTRControlState_v8_1 - VTR Control state */ + +typedef uint32_t BMDDeckControlVTRControlState_v8_1; +enum _BMDDeckControlVTRControlState_v8_1 { + bmdDeckControlNotInVTRControlMode_v8_1 = 'nvcm', + bmdDeckControlVTRControlPlaying_v8_1 = 'vtrp', + bmdDeckControlVTRControlRecording_v8_1 = 'vtrr', + bmdDeckControlVTRControlStill_v8_1 = 'vtra', + bmdDeckControlVTRControlSeeking_v8_1 = 'vtrs', + bmdDeckControlVTRControlStopped_v8_1 = 'vtro' +}; + + +/* Interface IDeckLinkDeckControlStatusCallback_v8_1 - Deck control state change callback. */ + +class IDeckLinkDeckControlStatusCallback_v8_1 : public IUnknown +{ +public: + virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0; + virtual HRESULT VTRControlStateChanged (/* in */ BMDDeckControlVTRControlState_v8_1 newState, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlEventReceived (/* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlStatusChanged (/* in */ BMDDeckControlStatusFlags flags, /* in */ uint32_t mask) = 0; + +protected: + virtual ~IDeckLinkDeckControlStatusCallback_v8_1 () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkDeckControl_v8_1 - Deck Control main interface */ + +class IDeckLinkDeckControl_v8_1 : public IUnknown +{ +public: + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Close (/* in */ bool standbyOn) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState_v8_1 *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; + virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeString (/* out */ const char **currentTimeCode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Abort (void) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback_v8_1 *callback) = 0; + +protected: + virtual ~IDeckLinkDeckControl_v8_1 () {}; // call Release method to drop reference count +}; + + +#endif // BMD_DECKLINKAPI_v8_1_H diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h new file mode 100644 index 00000000000000..236d1823bc5bb6 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h @@ -0,0 +1,81 @@ +/* -LICENSE-START- +** Copyright (c) 2012 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v9_2_H +#define BMD_DECKLINKAPI_v9_2_H + +#include "DeckLinkAPI.h" + + +// Interface ID Declarations + +#define IID_IDeckLinkInput_v9_2 /* 6D40EF78-28B9-4E21-990D-95BB7750A04F */ (REFIID){0x6D,0x40,0xEF,0x78,0x28,0xB9,0x4E,0x21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F} + + +#if defined(__cplusplus) + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v9_2 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkInput_v9_2 () {}; // call Release method to drop reference count +}; + + +#endif // defined(__cplusplus) +#endif // BMD_DECKLINKAPI_v9_2_H diff --git a/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h new file mode 100644 index 00000000000000..98d115d50bbf45 --- /dev/null +++ b/plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h @@ -0,0 +1,98 @@ +/* -LICENSE-START- +** Copyright (c) 2013 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v9_9_H +#define BMD_DECKLINKAPI_v9_9_H + +#include "DeckLinkAPI.h" + + +// Interface ID Declarations + +#define IID_IDeckLinkOutput_v9_9 /* A3EF0963-0862-44ED-92A9-EE89ABF431C7 */ (REFIID){0xA3,0xEF,0x09,0x63,0x08,0x62,0x44,0xED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7} + + +#if defined(__cplusplus) + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v9_9 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; + virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkOutput_v9_9 () {}; // call Release method to drop reference count +}; + +#endif // defined(__cplusplus) +#endif // BMD_DECKLINKAPI_v9_9_H diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h index 3b13526d16d1a2..3b0fc117c603e6 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -60,17 +60,24 @@ BMD_CONST REFIID IID_IDeckLinkVideoOutputCallback = /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ {0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE}; BMD_CONST REFIID IID_IDeckLinkInputCallback = /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ {0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A}; +BMD_CONST REFIID IID_IDeckLinkEncoderInputCallback = /* ACF13E61-F4A0-4974-A6A7-59AFF6268B31 */ {0xAC,0xF1,0x3E,0x61,0xF4,0xA0,0x49,0x74,0xA6,0xA7,0x59,0xAF,0xF6,0x26,0x8B,0x31}; BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ {0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8}; BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6}; BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA}; BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4}; BMD_CONST REFIID IID_IDeckLinkOutput = /* CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564 */ {0xCC,0x5C,0x8A,0x6E,0x3F,0x2F,0x4B,0x3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64}; BMD_CONST REFIID IID_IDeckLinkInput = /* AF22762B-DFAC-4846-AA79-FA8883560995 */ {0xAF,0x22,0x76,0x2B,0xDF,0xAC,0x48,0x46,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95}; +BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* 270587DA-6B7D-42E7-A1F0-6D853F581185 */ {0x27,0x05,0x87,0xDA,0x6B,0x7D,0x42,0xE7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85}; BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17}; BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90}; BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7}; +BMD_CONST REFIID IID_IDeckLinkVideoFrameMetadataExtensions = /* D5973DC9-6432-46D0-8F0B-2496F8A1238F */ {0xD5,0x97,0x3D,0xC9,0x64,0x32,0x46,0xD0,0x8F,0x0B,0x24,0x96,0xF8,0xA1,0x23,0x8F}; BMD_CONST REFIID IID_IDeckLinkVideoInputFrame = /* 05CFE374-537C-4094-9A57-680525118F44 */ {0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44}; BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillary = /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ {0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04}; +BMD_CONST REFIID IID_IDeckLinkEncoderPacket = /* B693F36C-316E-4AF1-B6C2-F389A4BCA620 */ {0xB6,0x93,0xF3,0x6C,0x31,0x6E,0x4A,0xF1,0xB6,0xC2,0xF3,0x89,0xA4,0xBC,0xA6,0x20}; +BMD_CONST REFIID IID_IDeckLinkEncoderVideoPacket = /* 4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0 */ {0x4E,0x7F,0xD9,0x44,0xE8,0xC7,0x4E,0xAC,0xB8,0xC0,0x7B,0x77,0xF8,0x0F,0x5A,0xE0}; +BMD_CONST REFIID IID_IDeckLinkEncoderAudioPacket = /* 49E8EDC8-693B-4E14-8EF6-12C658F5A07A */ {0x49,0xE8,0xED,0xC8,0x69,0x3B,0x4E,0x14,0x8E,0xF6,0x12,0xC6,0x58,0xF5,0xA0,0x7A}; +BMD_CONST REFIID IID_IDeckLinkH265NALPacket = /* 639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7 */ {0x63,0x9C,0x8E,0x0B,0x68,0xD5,0x4B,0xDE,0xA6,0xD4,0x95,0xF3,0xAE,0xAF,0xF2,0xE7}; BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-2894-11DE-8C30-0800200C9A66 */ {0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66}; BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38}; BMD_CONST REFIID IID_IDeckLinkCocoaScreenPreviewCallback = /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ {0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA}; @@ -78,6 +85,7 @@ BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209- BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D}; BMD_CONST REFIID IID_IDeckLinkNotification = /* 0A1FB207-E215-441B-9B19-6FA1575946C5 */ {0x0A,0x1F,0xB2,0x07,0xE2,0x15,0x44,0x1B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5}; BMD_CONST REFIID IID_IDeckLinkAttributes = /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ {0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4}; +BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46}; BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3}; BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A}; BMD_CONST REFIID IID_IDeckLinkDeviceNotificationCallback = /* 4997053B-0ADF-4CC8-AC70-7A50C4BE728F */ {0x49,0x97,0x05,0x3B,0x0A,0xDF,0x4C,0xC8,0xAC,0x70,0x7A,0x50,0xC4,0xBE,0x72,0x8F}; @@ -94,12 +102,21 @@ enum _BMDVideoOutputFlags { bmdVideoOutputDualStream3D = 1 << 4 }; +/* Enum BMDPacketType - Type of packet */ + +typedef uint32_t BMDPacketType; +enum _BMDPacketType { + bmdPacketTypeStreamInterruptedMarker = 'sint', // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable + bmdPacketTypeStreamData = 'sdat' // Regular stream data +}; + /* Enum BMDFrameFlags - Frame flags */ typedef uint32_t BMDFrameFlags; enum _BMDFrameFlags { bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = 1 << 0, + bmdFrameContainsHDRMetadata = 1 << 1, /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ @@ -137,6 +154,7 @@ enum _BMDDetectedVideoInputFormatFlags { typedef uint32_t BMDDeckLinkCapturePassthroughMode; enum _BMDDeckLinkCapturePassthroughMode { + bmdDeckLinkCapturePassthroughModeDisabled = 'pdis', bmdDeckLinkCapturePassthroughModeDirect = 'pdir', bmdDeckLinkCapturePassthroughModeCleanSwitch = 'pcln' }; @@ -159,6 +177,13 @@ enum _BMDReferenceStatus { bmdReferenceLocked = 1 << 1 }; +/* Enum BMDAudioFormat - Audio Format */ + +typedef uint32_t BMDAudioFormat; +enum _BMDAudioFormat { + bmdAudioFormatPCM = 'lpcm' // Linear signed PCM samples +}; + /* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */ typedef uint32_t BMDAudioSampleRate; @@ -271,8 +296,71 @@ enum _BMDVideo3DPackingFormat { typedef uint32_t BMDIdleVideoOutputOperation; enum _BMDIdleVideoOutputOperation { bmdIdleVideoOutputBlack = 'blac', - bmdIdleVideoOutputLastFrame = 'lafa', - bmdIdleVideoOutputDesktop = 'desk' + bmdIdleVideoOutputLastFrame = 'lafa' +}; + +/* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */ + +typedef uint32_t BMDVideoEncoderFrameCodingMode; +enum _BMDVideoEncoderFrameCodingMode { + bmdVideoEncoderFrameCodingModeInter = 'inte', + bmdVideoEncoderFrameCodingModeIntra = 'intr' +}; + +/* Enum BMDDNxHRLevel - DNxHR Levels */ + +typedef uint32_t BMDDNxHRLevel; +enum _BMDDNxHRLevel { + bmdDNxHRLevelSQ = 'dnsq', + bmdDNxHRLevelLB = 'dnlb', + bmdDNxHRLevelHQ = 'dnhq', + bmdDNxHRLevelHQX = 'dhqx', + bmdDNxHRLevel444 = 'd444' +}; + +/* Enum BMDLinkConfiguration - Video link configuration */ + +typedef uint32_t BMDLinkConfiguration; +enum _BMDLinkConfiguration { + bmdLinkConfigurationSingleLink = 'lcsl', + bmdLinkConfigurationDualLink = 'lcdl', + bmdLinkConfigurationQuadLink = 'lcql' +}; + +/* Enum BMDDeviceInterface - Device interface type */ + +typedef uint32_t BMDDeviceInterface; +enum _BMDDeviceInterface { + bmdDeviceInterfacePCI = 'pci ', + bmdDeviceInterfaceUSB = 'usb ', + bmdDeviceInterfaceThunderbolt = 'thun' +}; + +/* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */ + +typedef uint32_t BMDDeckLinkFrameMetadataID; +enum _BMDDeckLinkFrameMetadataID { + bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = 'eotf', // EOTF in range 0-7 as per CEA 861.3 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = 'hdrx', // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = 'hdry', // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = 'hdgx', // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = 'hdgy', // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = 'hdbx', // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = 'hdby', // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointX = 'hdwx', // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointY = 'hdwy', // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = 'hdml', // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = 'hmil', // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = 'mcll', // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = 'fall' // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 +}; + +/* Enum BMDDuplexMode - Duplex for configurable ports */ + +typedef uint32_t BMDDuplexMode; +enum _BMDDuplexMode { + bmdDuplexModeFull = 'fdup', + bmdDuplexModeHalf = 'hdup' }; /* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ @@ -292,10 +380,16 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = 'ovog', BMDDeckLinkHasVideoInputAntiAliasingFilter = 'aafl', BMDDeckLinkHasBypass = 'byps', - BMDDeckLinkSupportsDesktopDisplay = 'extd', BMDDeckLinkSupportsClockTimingAdjustment = 'ctad', BMDDeckLinkSupportsFullDuplex = 'fdup', BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = 'frin', + BMDDeckLinkSupportsSMPTELevelAOutput = 'lvla', + BMDDeckLinkSupportsDualLinkSDI = 'sdls', + BMDDeckLinkSupportsQuadLinkSDI = 'sqls', + BMDDeckLinkSupportsIdleOutput = 'idou', + BMDDeckLinkHasLTCTimecodeInput = 'hltc', + BMDDeckLinkSupportsDuplexModeConfiguration = 'dupx', + BMDDeckLinkSupportsHDRMetadata = 'hdrm', /* Integers */ @@ -304,13 +398,20 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkNumberOfSubDevices = 'nsbd', BMDDeckLinkSubDeviceIndex = 'subi', BMDDeckLinkPersistentID = 'peid', + BMDDeckLinkDeviceGroupID = 'dgid', BMDDeckLinkTopologicalID = 'toid', BMDDeckLinkVideoOutputConnections = 'vocn', BMDDeckLinkVideoInputConnections = 'vicn', BMDDeckLinkAudioOutputConnections = 'aocn', BMDDeckLinkAudioInputConnections = 'aicn', - BMDDeckLinkDeviceBusyState = 'dbst', BMDDeckLinkVideoIOSupport = 'vios', // Returns a BMDVideoIOSupport bit field + BMDDeckLinkDeckControlConnections = 'dccn', + BMDDeckLinkDeviceInterface = 'dbus', // Returns a BMDDeviceInterface + BMDDeckLinkAudioInputRCAChannelCount = 'airc', + BMDDeckLinkAudioInputXLRChannelCount = 'aixc', + BMDDeckLinkAudioOutputRCAChannelCount = 'aorc', + BMDDeckLinkAudioOutputXLRChannelCount = 'aoxc', + BMDDeckLinkPairedDevicePersistentID = 'ppid', /* Floats */ @@ -318,10 +419,16 @@ enum _BMDDeckLinkAttributeID { BMDDeckLinkVideoInputGainMaximum = 'vigx', BMDDeckLinkVideoOutputGainMinimum = 'vogm', BMDDeckLinkVideoOutputGainMaximum = 'vogx', + BMDDeckLinkMicrophoneInputGainMinimum = 'migm', + BMDDeckLinkMicrophoneInputGainMaximum = 'migx', /* Strings */ - BMDDeckLinkSerialPortDeviceName = 'slpn' + BMDDeckLinkSerialPortDeviceName = 'slpn', + BMDDeckLinkVendorName = 'vndr', + BMDDeckLinkDisplayName = 'dspn', + BMDDeckLinkModelName = 'mdln', + BMDDeckLinkDeviceHandle = 'devh' }; /* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */ @@ -331,6 +438,52 @@ enum _BMDDeckLinkAPIInformationID { BMDDeckLinkAPIVersion = 'vers' }; +/* Enum BMDDeckLinkStatusID - DeckLink Status ID */ + +typedef uint32_t BMDDeckLinkStatusID; +enum _BMDDeckLinkStatusID { + + /* Integers */ + + bmdDeckLinkStatusDetectedVideoInputMode = 'dvim', + bmdDeckLinkStatusDetectedVideoInputFlags = 'dvif', + bmdDeckLinkStatusCurrentVideoInputMode = 'cvim', + bmdDeckLinkStatusCurrentVideoInputPixelFormat = 'cvip', + bmdDeckLinkStatusCurrentVideoInputFlags = 'cvif', + bmdDeckLinkStatusCurrentVideoOutputMode = 'cvom', + bmdDeckLinkStatusCurrentVideoOutputFlags = 'cvof', + bmdDeckLinkStatusPCIExpressLinkWidth = 'pwid', + bmdDeckLinkStatusPCIExpressLinkSpeed = 'plnk', + bmdDeckLinkStatusLastVideoOutputPixelFormat = 'opix', + bmdDeckLinkStatusReferenceSignalMode = 'refm', + bmdDeckLinkStatusReferenceSignalFlags = 'reff', + bmdDeckLinkStatusDuplexMode = 'dupx', + bmdDeckLinkStatusBusy = 'busy', + + /* Flags */ + + bmdDeckLinkStatusVideoInputSignalLocked = 'visl', + bmdDeckLinkStatusReferenceSignalLocked = 'refl' +}; + +/* Enum BMDDeckLinkVideoStatusFlags - */ + +typedef uint32_t BMDDeckLinkVideoStatusFlags; +enum _BMDDeckLinkVideoStatusFlags { + bmdDeckLinkVideoStatusPsF = 1 << 0, + bmdDeckLinkVideoStatusDualStream3D = 1 << 1 +}; + +/* Enum BMDDuplexStatus - Duplex status of the device */ + +typedef uint32_t BMDDuplexStatus; +enum _BMDDuplexStatus { + bmdDuplexStatusFullDuplex = 'fdup', + bmdDuplexStatusHalfDuplex = 'hdup', + bmdDuplexStatusSimplex = 'splx', + bmdDuplexStatusInactive = 'inac' +}; + /* Enum BMDDeviceBusyState - Current device busy state */ typedef uint32_t BMDDeviceBusyState; @@ -363,7 +516,8 @@ enum _BMD3DPreviewFormat { typedef uint32_t BMDNotifications; enum _BMDNotifications { - bmdPreferencesChanged = 'pref' + bmdPreferencesChanged = 'pref', + bmdStatusChanged = 'stat' }; #if defined(__cplusplus) @@ -372,17 +526,24 @@ enum _BMDNotifications { class IDeckLinkVideoOutputCallback; class IDeckLinkInputCallback; +class IDeckLinkEncoderInputCallback; class IDeckLinkMemoryAllocator; class IDeckLinkAudioOutputCallback; class IDeckLinkIterator; class IDeckLinkAPIInformation; class IDeckLinkOutput; class IDeckLinkInput; +class IDeckLinkEncoderInput; class IDeckLinkVideoFrame; class IDeckLinkMutableVideoFrame; class IDeckLinkVideoFrame3DExtensions; +class IDeckLinkVideoFrameMetadataExtensions; class IDeckLinkVideoInputFrame; class IDeckLinkVideoFrameAncillary; +class IDeckLinkEncoderPacket; +class IDeckLinkEncoderVideoPacket; +class IDeckLinkEncoderAudioPacket; +class IDeckLinkH265NALPacket; class IDeckLinkAudioInputPacket; class IDeckLinkScreenPreviewCallback; class IDeckLinkCocoaScreenPreviewCallback; @@ -390,6 +551,7 @@ class IDeckLinkGLScreenPreviewHelper; class IDeckLinkNotificationCallback; class IDeckLinkNotification; class IDeckLinkAttributes; +class IDeckLinkStatus; class IDeckLinkKeyer; class IDeckLinkVideoConversion; class IDeckLinkDeviceNotificationCallback; @@ -419,6 +581,19 @@ class IDeckLinkInputCallback : public IUnknown virtual ~IDeckLinkInputCallback () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */ + +class IDeckLinkEncoderInputCallback : public IUnknown +{ +public: + virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoPacketArrived (/* in */ IDeckLinkEncoderVideoPacket* videoPacket) = 0; + virtual HRESULT AudioPacketArrived (/* in */ IDeckLinkEncoderAudioPacket* audioPacket) = 0; + +protected: + virtual ~IDeckLinkEncoderInputCallback () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */ class IDeckLinkMemoryAllocator : public IUnknown @@ -557,6 +732,43 @@ class IDeckLinkInput : public IUnknown virtual ~IDeckLinkInput () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkEncoderInput : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailablePacketsCount (/* out */ uint32_t *availablePacketsCount) = 0; + virtual HRESULT SetMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioFormat audioFormat, /* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkEncoderInputCallback *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkEncoderInput () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ class IDeckLinkVideoFrame : public IUnknown @@ -604,6 +816,20 @@ class IDeckLinkVideoFrame3DExtensions : public IUnknown virtual ~IDeckLinkVideoFrame3DExtensions () {} // call Release method to drop reference count }; +/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */ + +class IDeckLinkVideoFrameMetadataExtensions : public IUnknown +{ +public: + virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ double *value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ bool* value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ CFStringRef *value) = 0; + +protected: + virtual ~IDeckLinkVideoFrameMetadataExtensions () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame @@ -630,6 +856,58 @@ class IDeckLinkVideoFrameAncillary : public IUnknown virtual ~IDeckLinkVideoFrameAncillary () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */ + +class IDeckLinkEncoderPacket : public IUnknown +{ +public: + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + virtual long GetSize (void) = 0; + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* in */ BMDTimeScale timeScale) = 0; + virtual BMDPacketType GetPacketType (void) = 0; + +protected: + virtual ~IDeckLinkEncoderPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */ + +class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket +{ +public: + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; + +protected: + virtual ~IDeckLinkEncoderVideoPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */ + +class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket +{ +public: + virtual BMDAudioFormat GetAudioFormat (void) = 0; + +protected: + virtual ~IDeckLinkEncoderAudioPacket () {} // call Release method to drop reference count +}; + +/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */ + +class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket +{ +public: + virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0; + virtual HRESULT GetBytesNoPrefix (/* out */ void **buffer) = 0; + virtual long GetSizeNoPrefix (void) = 0; + +protected: + virtual ~IDeckLinkH265NALPacket () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */ class IDeckLinkAudioInputPacket : public IUnknown @@ -712,6 +990,21 @@ class IDeckLinkAttributes : public IUnknown virtual ~IDeckLinkAttributes () {} // call Release method to drop reference count }; +/* Interface IDeckLinkStatus - DeckLink Status interface */ + +class IDeckLinkStatus : public IUnknown +{ +public: + virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkStatusID statusID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkStatusID statusID, /* out */ double *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkStatusID statusID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkStatusID statusID, /* out */ void *buffer, /* in, out */ uint32_t *bufferSize) = 0; + +protected: + virtual ~IDeckLinkStatus () {} // call Release method to drop reference count +}; + /* Interface IDeckLinkKeyer - DeckLink Keyer interface */ class IDeckLinkKeyer : public IUnknown diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h index 10a1d6e1767619..31b652ba6e5d36 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -42,7 +42,8 @@ // Interface ID Declarations -BMD_CONST REFIID IID_IDeckLinkConfiguration = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB}; +BMD_CONST REFIID IID_IDeckLinkConfiguration = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2}; +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration = /* 138050E5-C60A-4552-BF3F-0F358049327E */ {0x13,0x80,0x50,0xE5,0xC6,0x0A,0x45,0x52,0xBF,0x3F,0x0F,0x35,0x80,0x49,0x32,0x7E}; /* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ @@ -62,6 +63,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigHDMI3DPackingFormat = '3dpf', bmdDeckLinkConfigBypass = 'byps', bmdDeckLinkConfigClockTimingAdjustment = 'ctad', + bmdDeckLinkConfigDuplexMode = 'dupx', /* Audio Input/Output Flags */ @@ -72,9 +74,10 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigFieldFlickerRemoval = 'fdfr', bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 'to59', bmdDeckLinkConfig444SDIVideoOutput = '444o', - bmdDeckLinkConfigSingleLinkVideoOutput = 'sglo', bmdDeckLinkConfigBlackVideoOutputDuringCapture = 'bvoc', bmdDeckLinkConfigLowLatencyVideoOutput = 'llvo', + bmdDeckLinkConfigDownConversionOnAllAnalogOutput = 'caao', + bmdDeckLinkConfigSMPTELevelAOutput = 'smta', /* Video Output Integers */ @@ -85,6 +88,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoOutputIdleOperation = 'voio', bmdDeckLinkConfigDefaultVideoOutputMode = 'dvom', bmdDeckLinkConfigDefaultVideoOutputModeFlags = 'dvof', + bmdDeckLinkConfigSDIOutputLinkConfiguration = 'solc', /* Video Output Floats */ @@ -100,6 +104,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputScanning = 'visc', // Applicable to H264 Pro Recorder only bmdDeckLinkConfigUseDedicatedLTCInput = 'dltc', // Use timecode from LTC input instead of SDI stream + bmdDeckLinkConfigSDIInput3DPayloadOverride = '3dds', /* Video Input Integers */ @@ -122,6 +127,10 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputSVideoLumaGain = 'islg', bmdDeckLinkConfigVideoInputSVideoChromaGain = 'iscg', + /* Audio Input Flags */ + + bmdDeckLinkConfigMicrophonePhantomPower = 'mphp', + /* Audio Input Integers */ bmdDeckLinkConfigAudioInputConnection = 'aicn', @@ -133,6 +142,7 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = 'ais3', bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = 'ais4', bmdDeckLinkConfigDigitalAudioInputScale = 'dais', + bmdDeckLinkConfigMicrophoneInputGain = 'micg', /* Audio Output Integers */ @@ -144,12 +154,55 @@ enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = 'aos2', bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = 'aos3', bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = 'aos4', - bmdDeckLinkConfigDigitalAudioOutputScale = 'daos' + bmdDeckLinkConfigDigitalAudioOutputScale = 'daos', + bmdDeckLinkConfigHeadphoneVolume = 'hvol', + + /* Device Information Strings */ + + bmdDeckLinkConfigDeviceInformationLabel = 'dila', + bmdDeckLinkConfigDeviceInformationSerialNumber = 'disn', + bmdDeckLinkConfigDeviceInformationCompany = 'dico', + bmdDeckLinkConfigDeviceInformationPhone = 'diph', + bmdDeckLinkConfigDeviceInformationEmail = 'diem', + bmdDeckLinkConfigDeviceInformationDate = 'dida', + + /* Deck Control Integers */ + + bmdDeckLinkConfigDeckControlConnection = 'dcco' +}; + +/* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */ + +typedef uint32_t BMDDeckLinkEncoderConfigurationID; +enum _BMDDeckLinkEncoderConfigurationID { + + /* Video Encoder Integers */ + + bmdDeckLinkEncoderConfigPreferredBitDepth = 'epbr', + bmdDeckLinkEncoderConfigFrameCodingMode = 'efcm', + + /* HEVC/H.265 Encoder Integers */ + + bmdDeckLinkEncoderConfigH265TargetBitrate = 'htbr', + + /* DNxHR/DNxHD Compression ID */ + + bmdDeckLinkEncoderConfigDNxHRCompressionID = 'dcid', + + /* DNxHR/DNxHD Level */ + + bmdDeckLinkEncoderConfigDNxHRLevel = 'dlev', + + /* Encoded Sample Decriptions */ + + bmdDeckLinkEncoderConfigMPEG4SampleDescription = 'stsE', // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more + bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = 'esds' // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more }; // Forward Declarations class IDeckLinkConfiguration; +class IDeckLinkEncoderConfiguration; /* Interface IDeckLinkConfiguration - DeckLink Configuration interface */ @@ -170,6 +223,25 @@ class IDeckLinkConfiguration : public IUnknown virtual ~IDeckLinkConfiguration () {} // call Release method to drop reference count }; +/* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +class IDeckLinkEncoderConfiguration : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ CFStringRef value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetBytes (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ void *buffer /* optional */, /* in, out */ uint32_t *bufferSize) = 0; + +protected: + virtual ~IDeckLinkEncoderConfiguration () {} // call Release method to drop reference count +}; + /* Functions */ extern "C" { diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h new file mode 100644 index 00000000000000..ca7f8152016cf2 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h @@ -0,0 +1,60 @@ +/* -LICENSE-START- +** Copyright (c) 2014 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_2_H +#define BMD_DECKLINKAPICONFIGURATION_v10_2_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_2 = /* C679A35B-610C-4D09-B748-1D0478100FC0 */ {0xC6,0x79,0xA3,0x5B,0x61,0x0C,0x4D,0x09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0}; + +// Forward Declarations + +class IDeckLinkConfiguration_v10_2; + +/* Interface IDeckLinkConfiguration_v10_2 - DeckLink Configuration interface */ + +class IDeckLinkConfiguration_v10_2 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ CFStringRef value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + +protected: + virtual ~IDeckLinkConfiguration_v10_2 () {} // call Release method to drop reference count +}; + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_2_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h new file mode 100644 index 00000000000000..21e02ee353934f --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h @@ -0,0 +1,62 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_4_H +#define BMD_DECKLINKAPICONFIGURATION_v10_4_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_4 = /* 1E69FCF6-4203-4936-8076-2A9F4CFD50CB */ {0x1E,0x69,0xFC,0xF6,0x42,0x03,0x49,0x36,0x80,0x76,0x2A,0x9F,0x4C,0xFD,0x50,0xCB}; + +// +// Forward Declarations + +class IDeckLinkConfiguration_v10_4; + +/* Interface IDeckLinkConfiguration_v10_4 - DeckLink Configuration interface */ + +class IDeckLinkConfiguration_v10_4 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ CFStringRef value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + +protected: + virtual ~IDeckLinkConfiguration_v10_4 () {} // call Release method to drop reference count +}; + + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_4_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h new file mode 100644 index 00000000000000..29695cfe7da3cc --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h @@ -0,0 +1,60 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_v10_5_H +#define BMD_DECKLINKAPICONFIGURATION_v10_5_H + +#include "DeckLinkAPIConfiguration.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkEncoderConfiguration_v10_5 = /* 67455668-0848-45DF-8D8E-350A77C9A028 */ {0x67,0x45,0x56,0x68,0x08,0x48,0x45,0xDF,0x8D,0x8E,0x35,0x0A,0x77,0xC9,0xA0,0x28}; + +// Forward Declarations + +class IDeckLinkConfiguration_v10_5; + +/* Interface IDeckLinkEncoderConfiguration_v10_5 - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +class IDeckLinkEncoderConfiguration_v10_5 : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ CFStringRef value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT GetDecoderConfigurationInfo (/* out */ void *buffer, /* in */ long bufferSize, /* out */ long *returnedSize) = 0; + +protected: + virtual ~IDeckLinkEncoderConfiguration_v10_5 () {} // call Release method to drop reference count +}; + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_5_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h index 886f632d021b0c..6237ab75862a71 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h index 016750e4642707..3715a038403543 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp new file mode 100644 index 00000000000000..8b0c0cc883f48d --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp @@ -0,0 +1,105 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPIDispatch_v7_6.cpp */ + +#include "DeckLinkAPI_v7_6.h" +#include + +#define kDeckLinkAPI_BundlePath "/Library/Frameworks/DeckLinkAPI.framework" + +typedef IDeckLinkIterator* (*CreateIteratorFunc_v7_6)(void); +typedef IDeckLinkGLScreenPreviewHelper_v7_6* (*CreateOpenGLScreenPreviewHelperFunc_v7_6)(void); +typedef IDeckLinkCocoaScreenPreviewCallback_v7_6* (*CreateCocoaScreenPreviewFunc_v7_6)(void*); +typedef IDeckLinkVideoConversion_v7_6* (*CreateVideoConversionInstanceFunc_v7_6)(void); + +static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; +static CFBundleRef gBundleRef = NULL; +static CreateIteratorFunc_v7_6 gCreateIteratorFunc = NULL; +static CreateOpenGLScreenPreviewHelperFunc_v7_6 gCreateOpenGLPreviewFunc = NULL; +static CreateCocoaScreenPreviewFunc_v7_6 gCreateCocoaPreviewFunc = NULL; +static CreateVideoConversionInstanceFunc_v7_6 gCreateVideoConversionFunc = NULL; + + +void InitDeckLinkAPI_v7_6 (void) +{ + CFURLRef bundleURL; + + bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kDeckLinkAPI_BundlePath), kCFURLPOSIXPathStyle, true); + if (bundleURL != NULL) + { + gBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL); + if (gBundleRef != NULL) + { + gCreateIteratorFunc = (CreateIteratorFunc_v7_6)CFBundleGetFunctionPointerForName(gBundleRef, CFSTR("CreateDeckLinkIteratorInstance")); + gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc_v7_6)CFBundleGetFunctionPointerForName(gBundleRef, CFSTR("CreateOpenGLScreenPreviewHelper")); + gCreateCocoaPreviewFunc = (CreateCocoaScreenPreviewFunc_v7_6)CFBundleGetFunctionPointerForName(gBundleRef, CFSTR("CreateCocoaScreenPreview")); + gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc_v7_6)CFBundleGetFunctionPointerForName(gBundleRef, CFSTR("CreateVideoConversionInstance")); + } + CFRelease(bundleURL); + } +} + +IDeckLinkIterator* CreateDeckLinkIteratorInstance_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateIteratorFunc == NULL) + return NULL; + + return gCreateIteratorFunc(); +} + +IDeckLinkGLScreenPreviewHelper_v7_6* CreateOpenGLScreenPreviewHelper_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateOpenGLPreviewFunc == NULL) + return NULL; + + return gCreateOpenGLPreviewFunc(); +} + +IDeckLinkCocoaScreenPreviewCallback_v7_6* CreateCocoaScreenPreview_v7_6 (void* parentView) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateCocoaPreviewFunc == NULL) + return NULL; + + return gCreateCocoaPreviewFunc(parentView); +} + +IDeckLinkVideoConversion_v7_6* CreateVideoConversionInstance_v7_6 (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6); + + if (gCreateVideoConversionFunc == NULL) + return NULL; + + return gCreateVideoConversionFunc(); +} + diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp new file mode 100644 index 00000000000000..898d739a8c7974 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp @@ -0,0 +1,131 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPIDispatch.cpp */ + +#include "DeckLinkAPI_v8_0.h" +#include + +#if BLACKMAGIC_DECKLINK_API_MAGIC != 1 + #error The DeckLink API version of DeckLinkAPIDispatch.cpp is not the same version as DeckLinkAPI.h +#endif + +#define kDeckLinkAPI_BundlePath "/Library/Frameworks/DeckLinkAPI.framework" + +typedef IDeckLinkIterator_v8_0* (*CreateIteratorFunc)(void); +typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void); +typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void); +typedef IDeckLinkCocoaScreenPreviewCallback* (*CreateCocoaScreenPreviewFunc)(void*); +typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void); + +static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; +static CFBundleRef gDeckLinkAPIBundleRef = NULL; +static CreateIteratorFunc gCreateIteratorFunc = NULL; +static CreateAPIInformationFunc gCreateAPIInformationFunc = NULL; +static CreateOpenGLScreenPreviewHelperFunc gCreateOpenGLPreviewFunc = NULL; +static CreateCocoaScreenPreviewFunc gCreateCocoaPreviewFunc = NULL; +static CreateVideoConversionInstanceFunc gCreateVideoConversionFunc = NULL; + + +void InitDeckLinkAPI (void) +{ + CFURLRef bundleURL; + + bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kDeckLinkAPI_BundlePath), kCFURLPOSIXPathStyle, true); + if (bundleURL != NULL) + { + gDeckLinkAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL); + if (gDeckLinkAPIBundleRef != NULL) + { + gCreateIteratorFunc = (CreateIteratorFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkIteratorInstance_0001")); + gCreateAPIInformationFunc = (CreateAPIInformationFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkAPIInformationInstance_0001")); + gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateOpenGLScreenPreviewHelper_0001")); + gCreateCocoaPreviewFunc = (CreateCocoaScreenPreviewFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateCocoaScreenPreview_0001")); + gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateVideoConversionInstance_0001")); + } + CFRelease(bundleURL); + } +} + +bool IsDeckLinkAPIPresent (void) +{ + // If the DeckLink API bundle was successfully loaded, return this knowledge to the caller + if (gDeckLinkAPIBundleRef != NULL) + return true; + + return false; +} + +IDeckLinkIterator_v8_0* CreateDeckLinkIteratorInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateIteratorFunc == NULL) + return NULL; + + return gCreateIteratorFunc(); +} + +IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateAPIInformationFunc == NULL) + return NULL; + + return gCreateAPIInformationFunc(); +} + +IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateOpenGLPreviewFunc == NULL) + return NULL; + + return gCreateOpenGLPreviewFunc(); +} + +IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* parentView) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateCocoaPreviewFunc == NULL) + return NULL; + + return gCreateCocoaPreviewFunc(parentView); +} + +IDeckLinkVideoConversion* CreateVideoConversionInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateVideoConversionFunc == NULL) + return NULL; + + return gCreateVideoConversionFunc(); +} + diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h index c61b1d490023ce..3bc3429496db76 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -135,7 +135,12 @@ enum _BMDPixelFormat { bmdFormat12BitRGB = 'R12B', // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat12BitRGBLE = 'R12L', // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat10BitRGBXLE = 'R10l', // Little-endian 10-bit RGB with SMPTE video levels (64-940) - bmdFormat10BitRGBX = 'R10b' // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormat10BitRGBX = 'R10b', // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormatH265 = 'hev1', // High Efficiency Video Coding (HEVC/h.265) + + /* AVID DNxHR */ + + bmdFormatDNxHR = 'AVdh' }; /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h index 875ec065886189..6bb5168ff536f8 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h index 58f87e6e78c9df..04da49f1fb9ba5 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -77,7 +77,17 @@ enum _BMDAudioConnection { bmdAudioConnectionAESEBU = 1 << 1, bmdAudioConnectionAnalog = 1 << 2, bmdAudioConnectionAnalogXLR = 1 << 3, - bmdAudioConnectionAnalogRCA = 1 << 4 + bmdAudioConnectionAnalogRCA = 1 << 4, + bmdAudioConnectionMicrophone = 1 << 5, + bmdAudioConnectionHeadphones = 1 << 6 +}; + +/* Enum BMDDeckControlConnection - Deck control connections */ + +typedef uint32_t BMDDeckControlConnection; +enum _BMDDeckControlConnection { + bmdDeckControlConnectionRS422Remote1 = 1 << 0, + bmdDeckControlConnectionRS422Remote2 = 1 << 1 }; // Forward Declarations diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h index 719ae2bbf66448..55b24b1b539f3c 100644 --- a/plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h @@ -30,7 +30,7 @@ #ifndef __DeckLink_API_Version_h__ #define __DeckLink_API_Version_h__ -#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a030100 -#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.3.1" +#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a080000 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.8" #endif // __DeckLink_API_Version_h__ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h new file mode 100644 index 00000000000000..29ff820128b16f --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h @@ -0,0 +1,55 @@ +/* -LICENSE-START- +** Copyright (c) 2014 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_2_H +#define BMD_DECKLINKAPI_v10_2_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef uint32_t BMDDeckLinkConfigurationID_v10_2; +enum _BMDDeckLinkConfigurationID_v10_2 { + /* Video output flags */ + + bmdDeckLinkConfig3GBpsVideoOutput_v10_2 = '3gbs', +}; + +/* Enum BMDAudioConnection_v10_2 - Audio connection types */ + +typedef uint32_t BMDAudioConnection_v10_2; +enum _BMDAudioConnection_v10_2 { + bmdAudioConnectionEmbedded_v10_2 = 'embd', + bmdAudioConnectionAESEBU_v10_2 = 'aes ', + bmdAudioConnectionAnalog_v10_2 = 'anlg', + bmdAudioConnectionAnalogXLR_v10_2 = 'axlr', + bmdAudioConnectionAnalogRCA_v10_2 = 'arca' +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_2_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_4.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_4.h new file mode 100644 index 00000000000000..7e5019ca2b05a0 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_4.h @@ -0,0 +1,45 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_4_H +#define BMD_DECKLINKAPI_v10_4_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef uint32_t BMDDeckLinkConfigurationID_v10_4; +enum _BMDDeckLinkConfigurationID_v10_4 { + + /* Video output flags */ + + bmdDeckLinkConfigSingleLinkVideoOutput_v10_4 = /* 'sglo' */ 0x73676C6F, +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_4_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_5.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_5.h new file mode 100644 index 00000000000000..4439daef7b024e --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_5.h @@ -0,0 +1,46 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_5_H +#define BMD_DECKLINKAPI_v10_5_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef uint32_t BMDDeckLinkAttributeID_v10_5; +enum _BMDDeckLinkAttributeID_v10_5 { + + /* Integers */ + + BMDDeckLinkDeviceBusyState_v10_5 = /* 'dbst' */ 0x64627374, +}; + +#endif /* defined(BMD_DECKLINKAPI_v10_5_H) */ + diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_6.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_6.h new file mode 100644 index 00000000000000..7f78e53e6d1326 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_6.h @@ -0,0 +1,51 @@ +/* -LICENSE-START- +** Copyright (c) 2016 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v10_6_H +#define BMD_DECKLINKAPI_v10_6_H + +#include "DeckLinkAPI.h" + +// Type Declarations + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef uint32_t BMDDeckLinkAttributeID_c10_6; +enum _BMDDeckLinkAttributeID_v10_6 { + + /* Flags */ + + BMDDeckLinkSupportsDesktopDisplay_v10_6 = 'extd', +}; + +typedef uint32_t BMDIdleVideoOutputOperation_v10_6; +enum _BMDIdleVideoOutputOperation_v10_6 { + bmdIdleVideoOutputDesktop_v10_6 = 'desk' +}; + + +#endif /* defined(BMD_DECKLINKAPI_v10_6_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h new file mode 100644 index 00000000000000..50e0d11f5acd36 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h @@ -0,0 +1,198 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v7_1.h */ + +#ifndef __DeckLink_API_v7_1_h__ +#define __DeckLink_API_v7_1_h__ + +#include "DeckLinkAPI.h" + +// "B28131B6-59AC-4857-B5AC-CD75D5883E2F" +#define IID_IDeckLinkDisplayModeIterator_v7_1 (REFIID){0xB2,0x81,0x31,0xB6,0x59,0xAC,0x48,0x57,0xB5,0xAC,0xCD,0x75,0xD5,0x88,0x3E,0x2F} + +// "AF0CD6D5-8376-435E-8433-54F9DD530AC3" +#define IID_IDeckLinkDisplayMode_v7_1 (REFIID){0xAF,0x0C,0xD6,0xD5,0x83,0x76,0x43,0x5E,0x84,0x33,0x54,0xF9,0xDD,0x53,0x0A,0xC3} + +// "EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9" +#define IID_IDeckLinkVideoOutputCallback_v7_1 (REFIID){0xEB,0xD0,0x1A,0xFA,0xE4,0xB0,0x49,0xC6,0xA0,0x1D,0xED,0xB9,0xD1,0xB5,0x5F,0xD9} + +// "7F94F328-5ED4-4E9F-9729-76A86BDC99CC" +#define IID_IDeckLinkInputCallback_v7_1 (REFIID){0x7F,0x94,0xF3,0x28,0x5E,0xD4,0x4E,0x9F,0x97,0x29,0x76,0xA8,0x6B,0xDC,0x99,0xCC} + +// "AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5" +#define IID_IDeckLinkOutput_v7_1 (REFIID){0xAE,0x5B,0x3E,0x9B,0x4E,0x1E,0x45,0x35,0xB6,0xE8,0x48,0x0F,0xF5,0x2F,0x6C,0xE5} + +// "2B54EDEF-5B32-429F-BA11-BB990596EACD" +#define IID_IDeckLinkInput_v7_1 (REFIID){0x2B,0x54,0xED,0xEF,0x5B,0x32,0x42,0x9F,0xBA,0x11,0xBB,0x99,0x05,0x96,0xEA,0xCD} + +// "333F3A10-8C2D-43CF-B79D-46560FEEA1CE" +#define IID_IDeckLinkVideoFrame_v7_1 (REFIID){0x33,0x3F,0x3A,0x10,0x8C,0x2D,0x43,0xCF,0xB7,0x9D,0x46,0x56,0x0F,0xEE,0xA1,0xCE} + +// "C8B41D95-8848-40EE-9B37-6E3417FB114B" +#define IID_IDeckLinkVideoInputFrame_v7_1 (REFIID){0xC8,0xB4,0x1D,0x95,0x88,0x48,0x40,0xEE,0x9B,0x37,0x6E,0x34,0x17,0xFB,0x11,0x4B} + +// "C86DE4F6-A29F-42E3-AB3A-1363E29F0788" +#define IID_IDeckLinkAudioInputPacket_v7_1 (REFIID){0xC8,0x6D,0xE4,0xF6,0xA2,0x9F,0x42,0xE3,0xAB,0x3A,0x13,0x63,0xE2,0x9F,0x07,0x88} + +#if defined(__cplusplus) + +class IDeckLinkVideoFrame_v7_1; +class IDeckLinkDisplayModeIterator_v7_1; +class IDeckLinkDisplayMode_v7_1; +class IDeckLinkVideoInputFrame_v7_1; +class IDeckLinkAudioInputPacket_v7_1; + +class IDeckLinkDisplayModeIterator_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Next (IDeckLinkDisplayMode_v7_1* *deckLinkDisplayMode) = 0; +}; + + +class IDeckLinkDisplayMode_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetName (CFStringRef* name) = 0; + virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode () = 0; + virtual long STDMETHODCALLTYPE GetWidth () = 0; + virtual long STDMETHODCALLTYPE GetHeight () = 0; + virtual HRESULT STDMETHODCALLTYPE GetFrameRate (BMDTimeValue *frameDuration, BMDTimeScale *timeScale) = 0; +}; + +class IDeckLinkVideoOutputCallback_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted (IDeckLinkVideoFrame_v7_1* completedFrame, BMDOutputFrameCompletionResult result) = 0; +}; + +class IDeckLinkInputCallback_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived (IDeckLinkVideoInputFrame_v7_1* videoFrame, IDeckLinkAudioInputPacket_v7_1* audioPacket) = 0; +}; + +// IDeckLinkOutput_v7_1. Created by QueryInterface from IDeckLink. +class IDeckLinkOutput_v7_1 : public IUnknown +{ +public: + // Display mode predicates + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDDisplayModeSupport *result) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator (IDeckLinkDisplayModeIterator_v7_1* *iterator) = 0; + + + // Video output + virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput (BMDDisplayMode displayMode) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput () = 0; + + virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator (IDeckLinkMemoryAllocator* theAllocator) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame (int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1* *outFrame) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateVideoFrameFromBuffer (void* buffer, int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1* *outFrame) = 0; + + virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync (IDeckLinkVideoFrame_v7_1* theFrame) = 0; + virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame (IDeckLinkVideoFrame_v7_1* theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback (IDeckLinkVideoOutputCallback_v7_1* theCallback) = 0; + + + // Audio output + virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput () = 0; + + virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync (void* buffer, uint32_t sampleFrameCount, uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll () = 0; + virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll () = 0; + virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples (void* buffer, uint32_t sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount (uint32_t *bufferedSampleCount) = 0; + virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples () = 0; + + virtual HRESULT STDMETHODCALLTYPE SetAudioCallback (IDeckLinkAudioOutputCallback* theCallback) = 0; + + + // Output control + virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; + virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; +}; + +// IDeckLinkInput_v7_1. Created by QueryInterface from IDeckLink. +class IDeckLinkInput_v7_1 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDDisplayModeSupport *result) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator (IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0; + + // Video input + virtual HRESULT STDMETHODCALLTYPE EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableVideoInput () = 0; + + // Audio input + virtual HRESULT STDMETHODCALLTYPE EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT STDMETHODCALLTYPE DisableAudioInput () = 0; + virtual HRESULT STDMETHODCALLTYPE ReadAudioSamples (void* buffer, uint32_t sampleFrameCount, uint32_t *sampleFramesRead, BMDTimeValue *audioPacketTime, BMDTimeScale timeScale) = 0; + virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount (uint32_t *bufferedSampleCount) = 0; + + // Input control + virtual HRESULT STDMETHODCALLTYPE StartStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE StopStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE PauseStreams () = 0; + virtual HRESULT STDMETHODCALLTYPE SetCallback (IDeckLinkInputCallback_v7_1* theCallback) = 0; +}; + +// IDeckLinkVideoFrame_v7_1. Created by IDeckLinkOutput::CreateVideoFrame. +class IDeckLinkVideoFrame_v7_1 : public IUnknown +{ +public: + virtual long STDMETHODCALLTYPE GetWidth () = 0; + virtual long STDMETHODCALLTYPE GetHeight () = 0; + virtual long STDMETHODCALLTYPE GetRowBytes () = 0; + virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat () = 0; + virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags () = 0; + virtual HRESULT STDMETHODCALLTYPE GetBytes (void* *buffer) = 0; +}; + +// IDeckLinkVideoInputFrame_v7_1. Provided by the IDeckLinkInput_v7_1 frame arrival callback. +class IDeckLinkVideoInputFrame_v7_1 : public IDeckLinkVideoFrame_v7_1 +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetFrameTime (BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; +}; + +// IDeckLinkAudioInputPacket_v7_1. Provided by the IDeckLinkInput_v7_1 callback. +class IDeckLinkAudioInputPacket_v7_1 : public IUnknown +{ +public: + virtual long STDMETHODCALLTYPE GetSampleCount () = 0; + virtual HRESULT STDMETHODCALLTYPE GetBytes (void* *buffer) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale) = 0; +}; + +#endif // defined(__cplusplus) + +#endif // __DeckLink_API_v7_1_h__ + diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h new file mode 100644 index 00000000000000..c8b3da80f9f1ad --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h @@ -0,0 +1,173 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_3.h */ + +#ifndef __DeckLink_API_v7_3_h__ +#define __DeckLink_API_v7_3_h__ + +#include "DeckLinkAPI.h" +#include "DeckLinkAPI_v7_6.h" + +/* Interface ID Declarations */ + +#define IID_IDeckLinkInputCallback_v7_3 /* FD6F311D-4D00-444B-9ED4-1F25B5730AD0 */ (REFIID){0xFD,0x6F,0x31,0x1D,0x4D,0x00,0x44,0x4B,0x9E,0xD4,0x1F,0x25,0xB5,0x73,0x0A,0xD0} +#define IID_IDeckLinkOutput_v7_3 /* 271C65E3-C323-4344-A30F-D908BCB20AA3 */ (REFIID){0x27,0x1C,0x65,0xE3,0xC3,0x23,0x43,0x44,0xA3,0x0F,0xD9,0x08,0xBC,0xB2,0x0A,0xA3} +#define IID_IDeckLinkInput_v7_3 /* 4973F012-9925-458C-871C-18774CDBBECB */ (REFIID){0x49,0x73,0xF0,0x12,0x99,0x25,0x45,0x8C,0x87,0x1C,0x18,0x77,0x4C,0xDB,0xBE,0xCB} +#define IID_IDeckLinkVideoInputFrame_v7_3 /* CF317790-2894-11DE-8C30-0800200C9A66 */ (REFIID){0xCF,0x31,0x77,0x90,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66} + +/* End Interface ID Declarations */ + +#if defined(__cplusplus) + +/* Forward Declarations */ + +class IDeckLinkVideoInputFrame_v7_3; + +/* End Forward Declarations */ + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v7_3 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (BMDDisplayMode displayMode, BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (int32_t width, int32_t height, int32_t rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; + virtual HRESULT CreateAncillaryData (BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount, BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, uint32_t sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0; + +protected: + virtual ~IDeckLinkOutput_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkOutput */ + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +class IDeckLinkInputCallback_v7_3 : public IUnknown +{ +public: + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame_v7_3 *videoFrame, /* in */ IDeckLinkAudioInputPacket *audioPacket) = 0; + +protected: + virtual ~IDeckLinkInputCallback_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkInputCallback */ + + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v7_3 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback_v7_3 *theCallback) = 0; + +protected: + virtual ~IDeckLinkInput_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkInput */ + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +class IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; + +protected: + virtual ~IDeckLinkVideoInputFrame_v7_3 () {}; // call Release method to drop reference count +}; + +/* End Interface IDeckLinkVideoInputFrame */ + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_3_h__ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h new file mode 100644 index 00000000000000..93d7c04b7e660b --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h @@ -0,0 +1,421 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_6.h */ + +#ifndef __DeckLink_API_v7_6_h__ +#define __DeckLink_API_v7_6_h__ + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +#define IID_IDeckLinkVideoOutputCallback_v7_6 /* E763A626-4A3C-49D1-BF13-E7AD3692AE52 */ (REFIID){0xE7,0x63,0xA6,0x26,0x4A,0x3C,0x49,0xD1,0xBF,0x13,0xE7,0xAD,0x36,0x92,0xAE,0x52} +#define IID_IDeckLinkInputCallback_v7_6 /* 31D28EE7-88B6-4CB1-897A-CDBF79A26414 */ (REFIID){0x31,0xD2,0x8E,0xE7,0x88,0xB6,0x4C,0xB1,0x89,0x7A,0xCD,0xBF,0x79,0xA2,0x64,0x14} +#define IID_IDeckLinkDisplayModeIterator_v7_6 /* 455D741F-1779-4800-86F5-0B5D13D79751 */ (REFIID){0x45,0x5D,0x74,0x1F,0x17,0x79,0x48,0x00,0x86,0xF5,0x0B,0x5D,0x13,0xD7,0x97,0x51} +#define IID_IDeckLinkDisplayMode_v7_6 /* 87451E84-2B7E-439E-A629-4393EA4A8550 */ (REFIID){0x87,0x45,0x1E,0x84,0x2B,0x7E,0x43,0x9E,0xA6,0x29,0x43,0x93,0xEA,0x4A,0x85,0x50} +#define IID_IDeckLinkOutput_v7_6 /* 29228142-EB8C-4141-A621-F74026450955 */ (REFIID){0x29,0x22,0x81,0x42,0xEB,0x8C,0x41,0x41,0xA6,0x21,0xF7,0x40,0x26,0x45,0x09,0x55} +#define IID_IDeckLinkInput_v7_6 /* 300C135A-9F43-48E2-9906-6D7911D93CF1 */ (REFIID){0x30,0x0C,0x13,0x5A,0x9F,0x43,0x48,0xE2,0x99,0x06,0x6D,0x79,0x11,0xD9,0x3C,0xF1} +#define IID_IDeckLinkTimecode_v7_6 /* EFB9BCA6-A521-44F7-BD69-2332F24D9EE6 */ (REFIID){0xEF,0xB9,0xBC,0xA6,0xA5,0x21,0x44,0xF7,0xBD,0x69,0x23,0x32,0xF2,0x4D,0x9E,0xE6} +#define IID_IDeckLinkVideoFrame_v7_6 /* A8D8238E-6B18-4196-99E1-5AF717B83D32 */ (REFIID){0xA8,0xD8,0x23,0x8E,0x6B,0x18,0x41,0x96,0x99,0xE1,0x5A,0xF7,0x17,0xB8,0x3D,0x32} +#define IID_IDeckLinkMutableVideoFrame_v7_6 /* 46FCEE00-B4E6-43D0-91C0-023A7FCEB34F */ (REFIID){0x46,0xFC,0xEE,0x00,0xB4,0xE6,0x43,0xD0,0x91,0xC0,0x02,0x3A,0x7F,0xCE,0xB3,0x4F} +#define IID_IDeckLinkVideoInputFrame_v7_6 /* 9A74FA41-AE9F-47AC-8CF4-01F42DD59965 */ (REFIID){0x9A,0x74,0xFA,0x41,0xAE,0x9F,0x47,0xAC,0x8C,0xF4,0x01,0xF4,0x2D,0xD5,0x99,0x65} +#define IID_IDeckLinkScreenPreviewCallback_v7_6 /* 373F499D-4B4D-4518-AD22-6354E5A5825E */ (REFIID){0x37,0x3F,0x49,0x9D,0x4B,0x4D,0x45,0x18,0xAD,0x22,0x63,0x54,0xE5,0xA5,0x82,0x5E} +#define IID_IDeckLinkCocoaScreenPreviewCallback_v7_6 /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ (REFIID){0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA} +#define IID_IDeckLinkGLScreenPreviewHelper_v7_6 /* BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA */ (REFIID){0xBA,0x57,0x5C,0xD9,0xA1,0x5E,0x49,0x7B,0xB2,0xC2,0xF9,0xAF,0xE7,0xBE,0x4E,0xBA} +#define IID_IDeckLinkVideoConversion_v7_6 /* 3EB504C9-F97D-40FE-A158-D407D48CB53B */ (REFIID){0x3E,0xB5,0x04,0xC9,0xF9,0x7D,0x40,0xFE,0xA1,0x58,0xD4,0x07,0xD4,0x8C,0xB5,0x3B} +#define IID_IDeckLinkConfiguration_v7_6 /* B8EAD569-B764-47F0-A73F-AE40DF6CBF10 */ (REFIID){0xB8,0xEA,0xD5,0x69,0xB7,0x64,0x47,0xF0,0xA7,0x3F,0xAE,0x40,0xDF,0x6C,0xBF,0x10} + + +#if defined(__cplusplus) + +/* Enum BMDVideoConnection - Video connection types */ + +typedef uint32_t BMDVideoConnection_v7_6; +enum _BMDVideoConnection_v7_6 { + bmdVideoConnectionSDI_v7_6 = 'sdi ', + bmdVideoConnectionHDMI_v7_6 = 'hdmi', + bmdVideoConnectionOpticalSDI_v7_6 = 'opti', + bmdVideoConnectionComponent_v7_6 = 'cpnt', + bmdVideoConnectionComposite_v7_6 = 'cmst', + bmdVideoConnectionSVideo_v7_6 = 'svid' +}; + + +// Forward Declarations + +class IDeckLinkVideoOutputCallback_v7_6; +class IDeckLinkInputCallback_v7_6; +class IDeckLinkDisplayModeIterator_v7_6; +class IDeckLinkDisplayMode_v7_6; +class IDeckLinkOutput_v7_6; +class IDeckLinkInput_v7_6; +class IDeckLinkTimecode_v7_6; +class IDeckLinkVideoFrame_v7_6; +class IDeckLinkMutableVideoFrame_v7_6; +class IDeckLinkVideoInputFrame_v7_6; +class IDeckLinkScreenPreviewCallback_v7_6; +class IDeckLinkCocoaScreenPreviewCallback_v7_6; +class IDeckLinkGLScreenPreviewHelper_v7_6; +class IDeckLinkVideoConversion_v7_6; + + +/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */ + +class IDeckLinkVideoOutputCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame_v7_6 *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; + virtual HRESULT ScheduledPlaybackHasStopped (void) = 0; + +protected: + virtual ~IDeckLinkVideoOutputCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +class IDeckLinkInputCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame_v7_6* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0; + +protected: + virtual ~IDeckLinkInputCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ + +class IDeckLinkDisplayModeIterator_v7_6 : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode) = 0; + +protected: + virtual ~IDeckLinkDisplayModeIterator_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkDisplayMode - represents a display mode */ + +class IDeckLinkDisplayMode_v7_6 : public IUnknown +{ +public: + virtual HRESULT GetName (/* out */ CFStringRef *name) = 0; + virtual BMDDisplayMode GetDisplayMode (void) = 0; + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; + virtual BMDFieldDominance GetFieldDominance (void) = 0; + +protected: + virtual ~IDeckLinkDisplayMode_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v7_6 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame_v7_6 **outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback_v7_6 *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkOutput_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkInput_v7_6 - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v7_6 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator_v7_6 **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback_v7_6 *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback_v7_6 *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkInput_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkTimecode - Used for video frame timecode representation. */ + +class IDeckLinkTimecode_v7_6 : public IUnknown +{ +public: + virtual BMDTimecodeBCD GetBCD (void) = 0; + virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0; + virtual HRESULT GetString (/* out */ CFStringRef *timecode) = 0; + virtual BMDTimecodeFlags GetFlags (void) = 0; + +protected: + virtual ~IDeckLinkTimecode_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ + +class IDeckLinkVideoFrame_v7_6 : public IUnknown +{ +public: + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual long GetRowBytes (void) = 0; + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual BMDFrameFlags GetFlags (void) = 0; + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + + virtual HRESULT GetTimecode (BMDTimecodeFormat format, /* out */ IDeckLinkTimecode_v7_6 **timecode) = 0; + virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; + +protected: + virtual ~IDeckLinkVideoFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */ + +class IDeckLinkMutableVideoFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT SetFlags (BMDFrameFlags newFlags) = 0; + + virtual HRESULT SetTimecode (BMDTimecodeFormat format, /* in */ IDeckLinkTimecode_v7_6 *timecode) = 0; + virtual HRESULT SetTimecodeFromComponents (BMDTimecodeFormat format, uint8_t hours, uint8_t minutes, uint8_t seconds, uint8_t frames, BMDTimecodeFlags flags) = 0; + virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; + +protected: + virtual ~IDeckLinkMutableVideoFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +class IDeckLinkVideoInputFrame_v7_6 : public IDeckLinkVideoFrame_v7_6 +{ +public: + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + +protected: + virtual ~IDeckLinkVideoInputFrame_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */ + +class IDeckLinkScreenPreviewCallback_v7_6 : public IUnknown +{ +public: + virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + +protected: + virtual ~IDeckLinkScreenPreviewCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications */ + +class IDeckLinkCocoaScreenPreviewCallback_v7_6 : public IDeckLinkScreenPreviewCallback_v7_6 +{ +public: + +protected: + virtual ~IDeckLinkCocoaScreenPreviewCallback_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ + +class IDeckLinkGLScreenPreviewHelper_v7_6 : public IUnknown +{ +public: + + /* Methods must be called with OpenGL context set */ + + virtual HRESULT InitializeGL (void) = 0; + virtual HRESULT PaintGL (void) = 0; + virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0; + +protected: + virtual ~IDeckLinkGLScreenPreviewHelper_v7_6 () {}; // call Release method to drop reference count +}; + + +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ + +class IDeckLinkVideoConversion_v7_6 : public IUnknown +{ +public: + virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame_v7_6* srcFrame, /* in */ IDeckLinkVideoFrame_v7_6* dstFrame) = 0; + +protected: + virtual ~IDeckLinkVideoConversion_v7_6 () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkConfiguration - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkConfiguration_v7_6 : public IUnknown +{ +public: + virtual HRESULT GetConfigurationValidator (/* out */ IDeckLinkConfiguration_v7_6 **configObject) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + + /* Video Output Configuration */ + + virtual HRESULT SetVideoOutputFormat (/* in */ BMDVideoConnection_v7_6 videoOutputConnection) = 0; + virtual HRESULT IsVideoOutputActive (/* in */ BMDVideoConnection_v7_6 videoOutputConnection, /* out */ bool *active) = 0; + + virtual HRESULT SetAnalogVideoOutputFlags (/* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; + virtual HRESULT GetAnalogVideoOutputFlags (/* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; + + virtual HRESULT EnableFieldFlickerRemovalWhenPaused (/* in */ bool enable) = 0; + virtual HRESULT IsEnabledFieldFlickerRemovalWhenPaused (/* out */ bool *enabled) = 0; + + virtual HRESULT Set444And3GBpsVideoOutput (/* in */ bool enable444VideoOutput, /* in */ bool enable3GbsOutput) = 0; + virtual HRESULT Get444And3GBpsVideoOutput (/* out */ bool *is444VideoOutputEnabled, /* out */ bool *threeGbsOutputEnabled) = 0; + + virtual HRESULT SetVideoOutputConversionMode (/* in */ BMDVideoOutputConversionMode conversionMode) = 0; + virtual HRESULT GetVideoOutputConversionMode (/* out */ BMDVideoOutputConversionMode *conversionMode) = 0; + + virtual HRESULT Set_HD1080p24_to_HD1080i5994_Conversion (/* in */ bool enable) = 0; + virtual HRESULT Get_HD1080p24_to_HD1080i5994_Conversion (/* out */ bool *enabled) = 0; + + /* Video Input Configuration */ + + virtual HRESULT SetVideoInputFormat (/* in */ BMDVideoConnection_v7_6 videoInputFormat) = 0; + virtual HRESULT GetVideoInputFormat (/* out */ BMDVideoConnection_v7_6 *videoInputFormat) = 0; + + virtual HRESULT SetAnalogVideoInputFlags (/* in */ BMDAnalogVideoFlags analogVideoFlags) = 0; + virtual HRESULT GetAnalogVideoInputFlags (/* out */ BMDAnalogVideoFlags *analogVideoFlags) = 0; + + virtual HRESULT SetVideoInputConversionMode (/* in */ BMDVideoInputConversionMode conversionMode) = 0; + virtual HRESULT GetVideoInputConversionMode (/* out */ BMDVideoInputConversionMode *conversionMode) = 0; + + virtual HRESULT SetBlackVideoOutputDuringCapture (/* in */ bool blackOutInCapture) = 0; + virtual HRESULT GetBlackVideoOutputDuringCapture (/* out */ bool *blackOutInCapture) = 0; + + virtual HRESULT Set32PulldownSequenceInitialTimecodeFrame (/* in */ uint32_t aFrameTimecode) = 0; + virtual HRESULT Get32PulldownSequenceInitialTimecodeFrame (/* out */ uint32_t *aFrameTimecode) = 0; + + virtual HRESULT SetVancSourceLineMapping (/* in */ uint32_t activeLine1VANCsource, /* in */ uint32_t activeLine2VANCsource, /* in */ uint32_t activeLine3VANCsource) = 0; + virtual HRESULT GetVancSourceLineMapping (/* out */ uint32_t *activeLine1VANCsource, /* out */ uint32_t *activeLine2VANCsource, /* out */ uint32_t *activeLine3VANCsource) = 0; + + /* Audio Input Configuration */ + + virtual HRESULT SetAudioInputFormat (/* in */ BMDAudioConnection audioInputFormat) = 0; + virtual HRESULT GetAudioInputFormat (/* out */ BMDAudioConnection *audioInputFormat) = 0; +}; + + + +/* Functions */ + +extern "C" { + + IDeckLinkIterator* CreateDeckLinkIteratorInstance_v7_6 (void); + IDeckLinkGLScreenPreviewHelper_v7_6* CreateOpenGLScreenPreviewHelper_v7_6 (void); + IDeckLinkCocoaScreenPreviewCallback_v7_6* CreateCocoaScreenPreview_v7_6 (void* /* (NSView*) */ parentView); + IDeckLinkVideoConversion_v7_6* CreateVideoConversionInstance_v7_6 (void); + +}; + + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_6_h__ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h new file mode 100644 index 00000000000000..327a3825753cc7 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h @@ -0,0 +1,91 @@ +/* -LICENSE-START- +** Copyright (c) 2010 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v7_9.h */ + +#ifndef __DeckLink_API_v7_9_h__ +#define __DeckLink_API_v7_9_h__ + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +#define IID_IDeckLinkDeckControl_v7_9 /* A4D81043-0619-42B7-8ED6-602D29041DF7 */ (REFIID){0xA4,0xD8,0x10,0x43,0x06,0x19,0x42,0xB7,0x8E,0xD6,0x60,0x2D,0x29,0x04,0x1D,0xF7} + + +#if defined(__cplusplus) + +// Forward Declarations + +class IDeckLinkDeckControl_v7_9; + + +/* Interface IDeckLinkDeckControl_v7_9 - Deck Control main interface */ + +class IDeckLinkDeckControl_v7_9 : public IUnknown +{ +public: + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Close (/* in */ bool standbyOn) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeString (/* out */ BMDstring *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Abort (void) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; + +protected: + virtual ~IDeckLinkDeckControl_v7_9 () {}; // call Release method to drop reference count +}; + + +#endif // defined(__cplusplus) +#endif // __DeckLink_API_v7_9_h__ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h new file mode 100644 index 00000000000000..b4e8f2106c759f --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h @@ -0,0 +1,63 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v8_0_H +#define BMD_DECKLINKAPI_v8_0_H + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +#define IID_IDeckLink_v8_0 /* 62BFF75D-6569-4E55-8D4D-66AA03829ABC */ (REFIID){0x62,0xBF,0xF7,0x5D,0x65,0x69,0x4E,0x55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC} +#define IID_IDeckLinkIterator_v8_0 /* 74E936FC-CC28-4A67-81A0-1E94E52D4E69 */ (REFIID){0x74,0xE9,0x36,0xFC,0xCC,0x28,0x4A,0x67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69} + +#if defined (__cplusplus) + +/* Interface IDeckLink_v8_0 - represents a DeckLink device */ + +class IDeckLink_v8_0 : public IUnknown +{ +public: + virtual HRESULT GetModelName (/* out */ CFStringRef *modelName) = 0; +}; + +/* Interface IDeckLinkIterator_v8_0 - enumerates installed DeckLink hardware */ + +class IDeckLinkIterator_v8_0 : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLink_v8_0 **deckLinkInstance) = 0; +}; + +extern "C" { + IDeckLinkIterator_v8_0* CreateDeckLinkIteratorInstance_v8_0 (void); +}; + + +#endif // defined __cplusplus + +#endif /* defined(BMD_DECKLINKAPI_v8_0_H) */ diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h new file mode 100644 index 00000000000000..e1444cd093950e --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h @@ -0,0 +1,111 @@ +/* -LICENSE-START- + ** Copyright (c) 2011 Blackmagic Design + ** + ** Permission is hereby granted, free of charge, to any person or organization + ** obtaining a copy of the software and accompanying documentation covered by + ** this license (the "Software") to use, reproduce, display, distribute, + ** execute, and transmit the Software, and to prepare derivative works of the + ** Software, and to permit third-parties to whom the Software is furnished to + ** do so, all subject to the following: + ** + ** The copyright notices in the Software and this entire statement, including + ** the above license grant, this restriction and the following disclaimer, + ** must be included in all copies of the Software, in whole or in part, and + ** all derivative works of the Software, unless such copies or derivative + ** works are solely in the form of machine-executable object code generated by + ** a source language processor. + ** + ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + ** DEALINGS IN THE SOFTWARE. + ** -LICENSE-END- + */ + +#ifndef BMD_DECKLINKAPI_v8_1_H +#define BMD_DECKLINKAPI_v8_1_H + +#include "DeckLinkAPI.h" + + +// Interface ID Declarations + +#define IID_IDeckLinkDeckControlStatusCallback_v8_1 /* E5F693C1-4283-4716-B18F-C1431521955B */ (REFIID){0xE5,0xF6,0x93,0xC1,0x42,0x83,0x47,0x16,0xB1,0x8F,0xC1,0x43,0x15,0x21,0x95,0x5B} +#define IID_IDeckLinkDeckControl_v8_1 /* 522A9E39-0F3C-4742-94EE-D80DE335DA1D */ (REFIID){0x52,0x2A,0x9E,0x39,0x0F,0x3C,0x47,0x42,0x94,0xEE,0xD8,0x0D,0xE3,0x35,0xDA,0x1D} + + +/* Enum BMDDeckControlVTRControlState_v8_1 - VTR Control state */ + +typedef uint32_t BMDDeckControlVTRControlState_v8_1; +enum _BMDDeckControlVTRControlState_v8_1 { + bmdDeckControlNotInVTRControlMode_v8_1 = 'nvcm', + bmdDeckControlVTRControlPlaying_v8_1 = 'vtrp', + bmdDeckControlVTRControlRecording_v8_1 = 'vtrr', + bmdDeckControlVTRControlStill_v8_1 = 'vtra', + bmdDeckControlVTRControlSeeking_v8_1 = 'vtrs', + bmdDeckControlVTRControlStopped_v8_1 = 'vtro' +}; + + +/* Interface IDeckLinkDeckControlStatusCallback_v8_1 - Deck control state change callback. */ + +class IDeckLinkDeckControlStatusCallback_v8_1 : public IUnknown +{ +public: + virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0; + virtual HRESULT VTRControlStateChanged (/* in */ BMDDeckControlVTRControlState_v8_1 newState, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlEventReceived (/* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlStatusChanged (/* in */ BMDDeckControlStatusFlags flags, /* in */ uint32_t mask) = 0; + +protected: + virtual ~IDeckLinkDeckControlStatusCallback_v8_1 () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkDeckControl_v8_1 - Deck Control main interface */ + +class IDeckLinkDeckControl_v8_1 : public IUnknown +{ +public: + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Close (/* in */ bool standbyOn) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState_v8_1 *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; + virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeString (/* out */ CFStringRef *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Abort (void) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback_v8_1 *callback) = 0; + +protected: + virtual ~IDeckLinkDeckControl_v8_1 () {}; // call Release method to drop reference count +}; + + +#endif // BMD_DECKLINKAPI_v8_1_H diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h new file mode 100644 index 00000000000000..236d1823bc5bb6 --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h @@ -0,0 +1,81 @@ +/* -LICENSE-START- +** Copyright (c) 2012 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v9_2_H +#define BMD_DECKLINKAPI_v9_2_H + +#include "DeckLinkAPI.h" + + +// Interface ID Declarations + +#define IID_IDeckLinkInput_v9_2 /* 6D40EF78-28B9-4E21-990D-95BB7750A04F */ (REFIID){0x6D,0x40,0xEF,0x78,0x28,0xB9,0x4E,0x21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F} + + +#if defined(__cplusplus) + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput_v9_2 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkInput_v9_2 () {}; // call Release method to drop reference count +}; + + +#endif // defined(__cplusplus) +#endif // BMD_DECKLINKAPI_v9_2_H diff --git a/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h new file mode 100644 index 00000000000000..3fa3a50bb5fa9b --- /dev/null +++ b/plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h @@ -0,0 +1,101 @@ +/* -LICENSE-START- +** Copyright (c) 2013 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_v9_9_H +#define BMD_DECKLINKAPI_v9_9_H + +#include "DeckLinkAPI.h" + +// Interface ID Declarations + +BMD_CONST REFIID IID_IDeckLinkOutput_v9_9 = /* A3EF0963-0862-44ED-92A9-EE89ABF431C7 */ {0xA3,0xEF,0x09,0x63,0x08,0x62,0x44,0xED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7}; + + +#if defined(__cplusplus) + +// Forward Declarations +class IDeckLinkOutput_v9_9; + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput_v9_9 : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; + virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkOutput_v9_9 () {}; // call Release method to drop reference count +}; + +#endif // defined(__cplusplus) +#endif /* defined(BMD_DECKLINKAPI_v9_9_H) */ + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl index 706f4c94ce4831..786d68d0d2c661 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -55,13 +55,13 @@ library DeckLinkAPI // Enumeration Mapping -cpp_quote("typedef unsigned long BMDFrameFlags;") -cpp_quote("typedef unsigned long BMDVideoInputFlags;") -cpp_quote("typedef unsigned long BMDVideoInputFormatChangedEvents;") -cpp_quote("typedef unsigned long BMDDetectedVideoInputFormatFlags;") -cpp_quote("typedef unsigned long BMDDeckLinkCapturePassthroughMode;") -cpp_quote("typedef unsigned long BMDAnalogVideoFlags;") -cpp_quote("typedef unsigned long BMDDeviceBusyState;") +cpp_quote("typedef unsigned int BMDFrameFlags;") +cpp_quote("typedef unsigned int BMDVideoInputFlags;") +cpp_quote("typedef unsigned int BMDVideoInputFormatChangedEvents;") +cpp_quote("typedef unsigned int BMDDetectedVideoInputFormatFlags;") +cpp_quote("typedef unsigned int BMDDeckLinkCapturePassthroughMode;") +cpp_quote("typedef unsigned int BMDAnalogVideoFlags;") +cpp_quote("typedef unsigned int BMDDeviceBusyState;") cpp_quote("#if 0") typedef enum _BMDFrameFlags BMDFrameFlags; typedef enum _BMDVideoInputFlags BMDVideoInputFlags; @@ -82,11 +82,19 @@ typedef [v1_enum] enum _BMDVideoOutputFlags { bmdVideoOutputDualStream3D = 1 << 4 } BMDVideoOutputFlags; +/* Enum BMDPacketType - Type of packet */ + +typedef [v1_enum] enum _BMDPacketType { + bmdPacketTypeStreamInterruptedMarker = /* 'sint' */ 0x73696E74, // A packet of this type marks the time when a video stream was interrupted, for example by a disconnected cable + bmdPacketTypeStreamData = /* 'sdat' */ 0x73646174 // Regular stream data +} BMDPacketType; + /* Enum BMDFrameFlags - Frame flags */ [v1_enum] enum _BMDFrameFlags { bmdFrameFlagDefault = 0, bmdFrameFlagFlipVertical = 1 << 0, + bmdFrameContainsHDRMetadata = 1 << 1, /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ @@ -120,6 +128,7 @@ typedef [v1_enum] enum _BMDVideoOutputFlags { /* Enum BMDDeckLinkCapturePassthroughMode - Enumerates whether the video output is electrically connected to the video input or if the clean switching mode is enabled */ [v1_enum] enum _BMDDeckLinkCapturePassthroughMode { + bmdDeckLinkCapturePassthroughModeDisabled = /* 'pdis' */ 0x70646973, bmdDeckLinkCapturePassthroughModeDirect = /* 'pdir' */ 0x70646972, bmdDeckLinkCapturePassthroughModeCleanSwitch = /* 'pcln' */ 0x70636C6E }; @@ -140,6 +149,12 @@ typedef [v1_enum] enum _BMDReferenceStatus { bmdReferenceLocked = 1 << 1 } BMDReferenceStatus; +/* Enum BMDAudioFormat - Audio Format */ + +typedef [v1_enum] enum _BMDAudioFormat { + bmdAudioFormatPCM = /* 'lpcm' */ 0x6C70636D // Linear signed PCM samples +} BMDAudioFormat; + /* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */ typedef [v1_enum] enum _BMDAudioSampleRate { @@ -241,10 +256,67 @@ typedef [v1_enum] enum _BMDVideo3DPackingFormat { typedef [v1_enum] enum _BMDIdleVideoOutputOperation { bmdIdleVideoOutputBlack = /* 'blac' */ 0x626C6163, - bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661, - bmdIdleVideoOutputDesktop = /* 'desk' */ 0x6465736B + bmdIdleVideoOutputLastFrame = /* 'lafa' */ 0x6C616661 } BMDIdleVideoOutputOperation; +/* Enum BMDVideoEncoderFrameCodingMode - Video frame coding mode */ + +typedef [v1_enum] enum _BMDVideoEncoderFrameCodingMode { + bmdVideoEncoderFrameCodingModeInter = /* 'inte' */ 0x696E7465, + bmdVideoEncoderFrameCodingModeIntra = /* 'intr' */ 0x696E7472 +} BMDVideoEncoderFrameCodingMode; + +/* Enum BMDDNxHRLevel - DNxHR Levels */ + +typedef [v1_enum] enum _BMDDNxHRLevel { + bmdDNxHRLevelSQ = /* 'dnsq' */ 0x646E7371, + bmdDNxHRLevelLB = /* 'dnlb' */ 0x646E6C62, + bmdDNxHRLevelHQ = /* 'dnhq' */ 0x646E6871, + bmdDNxHRLevelHQX = /* 'dhqx' */ 0x64687178, + bmdDNxHRLevel444 = /* 'd444' */ 0x64343434 +} BMDDNxHRLevel; + +/* Enum BMDLinkConfiguration - Video link configuration */ + +typedef [v1_enum] enum _BMDLinkConfiguration { + bmdLinkConfigurationSingleLink = /* 'lcsl' */ 0x6C63736C, + bmdLinkConfigurationDualLink = /* 'lcdl' */ 0x6C63646C, + bmdLinkConfigurationQuadLink = /* 'lcql' */ 0x6C63716C +} BMDLinkConfiguration; + +/* Enum BMDDeviceInterface - Device interface type */ + +typedef [v1_enum] enum _BMDDeviceInterface { + bmdDeviceInterfacePCI = /* 'pci ' */ 0x70636920, + bmdDeviceInterfaceUSB = /* 'usb ' */ 0x75736220, + bmdDeviceInterfaceThunderbolt = /* 'thun' */ 0x7468756E +} BMDDeviceInterface; + +/* Enum BMDDeckLinkFrameMetadataID - DeckLink Frame Metadata ID */ + +typedef [v1_enum] enum _BMDDeckLinkFrameMetadataID { + bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc = /* 'eotf' */ 0x656F7466, // EOTF in range 0-7 as per CEA 861.3 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedX = /* 'hdrx' */ 0x68647278, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesRedY = /* 'hdry' */ 0x68647279, // Red display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenX = /* 'hdgx' */ 0x68646778, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesGreenY = /* 'hdgy' */ 0x68646779, // Green display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueX = /* 'hdbx' */ 0x68646278, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRDisplayPrimariesBlueY = /* 'hdby' */ 0x68646279, // Blue display primaries in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointX = /* 'hdwx' */ 0x68647778, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRWhitePointY = /* 'hdwy' */ 0x68647779, // White point in range 0.0 - 1.0 + bmdDeckLinkFrameMetadataHDRMaxDisplayMasteringLuminance = /* 'hdml' */ 0x68646D6C, // Max display mastering luminance in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMinDisplayMasteringLuminance = /* 'hmil' */ 0x686D696C, // Min display mastering luminance in range 0.0001 cd/m2 - 6.5535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumContentLightLevel = /* 'mcll' */ 0x6D636C6C, // Maximum Content Light Level in range 1 cd/m2 - 65535 cd/m2 + bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel = /* 'fall' */ 0x66616C6C // Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2 +} BMDDeckLinkFrameMetadataID; + +/* Enum BMDDuplexMode - Duplex for configurable ports */ + +typedef [v1_enum] enum _BMDDuplexMode { + bmdDuplexModeFull = /* 'fdup' */ 0x66647570, + bmdDuplexModeHalf = /* 'hdup' */ 0x68647570 +} BMDDuplexMode; + /* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ typedef [v1_enum] enum _BMDDeckLinkAttributeID { @@ -261,10 +333,16 @@ typedef [v1_enum] enum _BMDDeckLinkAttributeID { BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = /* 'ovog' */ 0x6F766F67, BMDDeckLinkHasVideoInputAntiAliasingFilter = /* 'aafl' */ 0x6161666C, BMDDeckLinkHasBypass = /* 'byps' */ 0x62797073, - BMDDeckLinkSupportsDesktopDisplay = /* 'extd' */ 0x65787464, BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164, BMDDeckLinkSupportsFullDuplex = /* 'fdup' */ 0x66647570, BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E, + BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61, + BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73, + BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73, + BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75, + BMDDeckLinkHasLTCTimecodeInput = /* 'hltc' */ 0x686C7463, + BMDDeckLinkSupportsDuplexModeConfiguration = /* 'dupx' */ 0x64757078, + BMDDeckLinkSupportsHDRMetadata = /* 'hdrm' */ 0x6864726D, /* Integers */ @@ -273,13 +351,20 @@ typedef [v1_enum] enum _BMDDeckLinkAttributeID { BMDDeckLinkNumberOfSubDevices = /* 'nsbd' */ 0x6E736264, BMDDeckLinkSubDeviceIndex = /* 'subi' */ 0x73756269, BMDDeckLinkPersistentID = /* 'peid' */ 0x70656964, + BMDDeckLinkDeviceGroupID = /* 'dgid' */ 0x64676964, BMDDeckLinkTopologicalID = /* 'toid' */ 0x746F6964, BMDDeckLinkVideoOutputConnections = /* 'vocn' */ 0x766F636E, BMDDeckLinkVideoInputConnections = /* 'vicn' */ 0x7669636E, BMDDeckLinkAudioOutputConnections = /* 'aocn' */ 0x616F636E, BMDDeckLinkAudioInputConnections = /* 'aicn' */ 0x6169636E, - BMDDeckLinkDeviceBusyState = /* 'dbst' */ 0x64627374, BMDDeckLinkVideoIOSupport = /* 'vios' */ 0x76696F73, // Returns a BMDVideoIOSupport bit field + BMDDeckLinkDeckControlConnections = /* 'dccn' */ 0x6463636E, + BMDDeckLinkDeviceInterface = /* 'dbus' */ 0x64627573, // Returns a BMDDeviceInterface + BMDDeckLinkAudioInputRCAChannelCount = /* 'airc' */ 0x61697263, + BMDDeckLinkAudioInputXLRChannelCount = /* 'aixc' */ 0x61697863, + BMDDeckLinkAudioOutputRCAChannelCount = /* 'aorc' */ 0x616F7263, + BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863, + BMDDeckLinkPairedDevicePersistentID = /* 'ppid' */ 0x70706964, /* Floats */ @@ -287,10 +372,16 @@ typedef [v1_enum] enum _BMDDeckLinkAttributeID { BMDDeckLinkVideoInputGainMaximum = /* 'vigx' */ 0x76696778, BMDDeckLinkVideoOutputGainMinimum = /* 'vogm' */ 0x766F676D, BMDDeckLinkVideoOutputGainMaximum = /* 'vogx' */ 0x766F6778, + BMDDeckLinkMicrophoneInputGainMinimum = /* 'migm' */ 0x6D69676D, + BMDDeckLinkMicrophoneInputGainMaximum = /* 'migx' */ 0x6D696778, /* Strings */ - BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E + BMDDeckLinkSerialPortDeviceName = /* 'slpn' */ 0x736C706E, + BMDDeckLinkVendorName = /* 'vndr' */ 0x766E6472, + BMDDeckLinkDisplayName = /* 'dspn' */ 0x6473706E, + BMDDeckLinkModelName = /* 'mdln' */ 0x6D646C6E, + BMDDeckLinkDeviceHandle = /* 'devh' */ 0x64657668 } BMDDeckLinkAttributeID; /* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */ @@ -299,6 +390,49 @@ typedef [v1_enum] enum _BMDDeckLinkAPIInformationID { BMDDeckLinkAPIVersion = /* 'vers' */ 0x76657273 } BMDDeckLinkAPIInformationID; +/* Enum BMDDeckLinkStatusID - DeckLink Status ID */ + +typedef [v1_enum] enum _BMDDeckLinkStatusID { + + /* Integers */ + + bmdDeckLinkStatusDetectedVideoInputMode = /* 'dvim' */ 0x6476696D, + bmdDeckLinkStatusDetectedVideoInputFlags = /* 'dvif' */ 0x64766966, + bmdDeckLinkStatusCurrentVideoInputMode = /* 'cvim' */ 0x6376696D, + bmdDeckLinkStatusCurrentVideoInputPixelFormat = /* 'cvip' */ 0x63766970, + bmdDeckLinkStatusCurrentVideoInputFlags = /* 'cvif' */ 0x63766966, + bmdDeckLinkStatusCurrentVideoOutputMode = /* 'cvom' */ 0x63766F6D, + bmdDeckLinkStatusCurrentVideoOutputFlags = /* 'cvof' */ 0x63766F66, + bmdDeckLinkStatusPCIExpressLinkWidth = /* 'pwid' */ 0x70776964, + bmdDeckLinkStatusPCIExpressLinkSpeed = /* 'plnk' */ 0x706C6E6B, + bmdDeckLinkStatusLastVideoOutputPixelFormat = /* 'opix' */ 0x6F706978, + bmdDeckLinkStatusReferenceSignalMode = /* 'refm' */ 0x7265666D, + bmdDeckLinkStatusReferenceSignalFlags = /* 'reff' */ 0x72656666, + bmdDeckLinkStatusDuplexMode = /* 'dupx' */ 0x64757078, + bmdDeckLinkStatusBusy = /* 'busy' */ 0x62757379, + + /* Flags */ + + bmdDeckLinkStatusVideoInputSignalLocked = /* 'visl' */ 0x7669736C, + bmdDeckLinkStatusReferenceSignalLocked = /* 'refl' */ 0x7265666C +} BMDDeckLinkStatusID; + +/* Enum BMDDeckLinkVideoStatusFlags - */ + +typedef [v1_enum] enum _BMDDeckLinkVideoStatusFlags { + bmdDeckLinkVideoStatusPsF = 1 << 0, + bmdDeckLinkVideoStatusDualStream3D = 1 << 1 +} BMDDeckLinkVideoStatusFlags; + +/* Enum BMDDuplexStatus - Duplex status of the device */ + +typedef [v1_enum] enum _BMDDuplexStatus { + bmdDuplexStatusFullDuplex = /* 'fdup' */ 0x66647570, + bmdDuplexStatusHalfDuplex = /* 'hdup' */ 0x68647570, + bmdDuplexStatusSimplex = /* 'splx' */ 0x73706C78, + bmdDuplexStatusInactive = /* 'inac' */ 0x696E6163 +} BMDDuplexStatus; + /* Enum BMDDeviceBusyState - Current device busy state */ [v1_enum] enum _BMDDeviceBusyState { @@ -327,24 +461,32 @@ typedef [v1_enum] enum _BMD3DPreviewFormat { /* Enum BMDNotifications - Events that can be subscribed through IDeckLinkNotification */ typedef [v1_enum] enum _BMDNotifications { - bmdPreferencesChanged = /* 'pref' */ 0x70726566 + bmdPreferencesChanged = /* 'pref' */ 0x70726566, + bmdStatusChanged = /* 'stat' */ 0x73746174 } BMDNotifications; // Forward Declarations interface IDeckLinkVideoOutputCallback; interface IDeckLinkInputCallback; +interface IDeckLinkEncoderInputCallback; interface IDeckLinkMemoryAllocator; interface IDeckLinkAudioOutputCallback; interface IDeckLinkIterator; interface IDeckLinkAPIInformation; interface IDeckLinkOutput; interface IDeckLinkInput; +interface IDeckLinkEncoderInput; interface IDeckLinkVideoFrame; interface IDeckLinkMutableVideoFrame; interface IDeckLinkVideoFrame3DExtensions; +interface IDeckLinkVideoFrameMetadataExtensions; interface IDeckLinkVideoInputFrame; interface IDeckLinkVideoFrameAncillary; +interface IDeckLinkEncoderPacket; +interface IDeckLinkEncoderVideoPacket; +interface IDeckLinkEncoderAudioPacket; +interface IDeckLinkH265NALPacket; interface IDeckLinkAudioInputPacket; interface IDeckLinkScreenPreviewCallback; interface IDeckLinkGLScreenPreviewHelper; @@ -352,6 +494,7 @@ interface IDeckLinkDX9ScreenPreviewHelper; interface IDeckLinkNotificationCallback; interface IDeckLinkNotification; interface IDeckLinkAttributes; +interface IDeckLinkStatus; interface IDeckLinkKeyer; interface IDeckLinkVideoConversion; interface IDeckLinkDeviceNotificationCallback; @@ -381,6 +524,19 @@ interface IDeckLinkDiscovery; HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame* videoFrame, [in] IDeckLinkAudioInputPacket* audioPacket); }; +/* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */ + +[ + object, + uuid(ACF13E61-F4A0-4974-A6A7-59AFF6268B31), + helpstring("Frame arrival callback.") +] interface IDeckLinkEncoderInputCallback : IUnknown +{ + HRESULT VideoInputSignalChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags); + HRESULT VideoPacketArrived([in] IDeckLinkEncoderVideoPacket* videoPacket); + HRESULT AudioPacketArrived([in] IDeckLinkEncoderAudioPacket* audioPacket); +}; + /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */ [ @@ -390,7 +546,7 @@ interface IDeckLinkDiscovery; helpstring("Memory allocator for video frames.") ] interface IDeckLinkMemoryAllocator : IUnknown { - HRESULT AllocateBuffer([in] unsigned long bufferSize, [out] void **allocatedBuffer); + HRESULT AllocateBuffer([in] unsigned int bufferSize, [out] void **allocatedBuffer); HRESULT ReleaseBuffer([in] void *buffer); HRESULT Commit(void); @@ -454,26 +610,26 @@ interface IDeckLinkDiscovery; HRESULT DisableVideoOutput(void); HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); - HRESULT CreateVideoFrame([in] long width, [in] long height, [in] long rowBytes, [in] BMDPixelFormat pixelFormat, [in] BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame); + HRESULT CreateVideoFrame([in] int width, [in] int height, [in] int rowBytes, [in] BMDPixelFormat pixelFormat, [in] BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame); HRESULT CreateAncillaryData([in] BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer); HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame); HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, [in] BMDTimeValue displayTime, [in] BMDTimeValue displayDuration, [in] BMDTimeScale timeScale); HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback); - HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount); + HRESULT GetBufferedVideoFrameCount([out] unsigned int *bufferedFrameCount); /* Audio Output */ - HRESULT EnableAudioOutput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount, [in] BMDAudioOutputStreamType streamType); + HRESULT EnableAudioOutput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned int channelCount, [in] BMDAudioOutputStreamType streamType); HRESULT DisableAudioOutput(void); - HRESULT WriteAudioSamplesSync([in] void *buffer, [in] unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten); + HRESULT WriteAudioSamplesSync([in] void *buffer, [in] unsigned int sampleFrameCount, [out] unsigned int *sampleFramesWritten); HRESULT BeginAudioPreroll(void); HRESULT EndAudioPreroll(void); - HRESULT ScheduleAudioSamples([in] void *buffer, [in] unsigned long sampleFrameCount, [in] BMDTimeValue streamTime, [in] BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten); + HRESULT ScheduleAudioSamples([in] void *buffer, [in] unsigned int sampleFrameCount, [in] BMDTimeValue streamTime, [in] BMDTimeScale timeScale, [out] unsigned int *sampleFramesWritten); - HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount); + HRESULT GetBufferedAudioSampleFrameCount([out] unsigned int *bufferedSampleFrameCount); HRESULT FlushBufferedAudioSamples(void); HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback); @@ -509,14 +665,14 @@ interface IDeckLinkDiscovery; HRESULT EnableVideoInput([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags); HRESULT DisableVideoInput(void); - HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount); + HRESULT GetAvailableVideoFrameCount([out] unsigned int *availableFrameCount); HRESULT SetVideoInputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); /* Audio Input */ - HRESULT EnableAudioInput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount); + HRESULT EnableAudioInput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned int channelCount); HRESULT DisableAudioInput(void); - HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount); + HRESULT GetAvailableAudioSampleFrameCount([out] unsigned int *availableSampleFrameCount); /* Input Control */ @@ -531,6 +687,43 @@ interface IDeckLinkDiscovery; HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); }; +/* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(270587DA-6B7D-42E7-A1F0-6D853F581185), + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkEncoderInput : IUnknown +{ + HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator); + + /* Video Input */ + + HRESULT EnableVideoInput([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags); + HRESULT DisableVideoInput(void); + HRESULT GetAvailablePacketsCount([out] unsigned int *availablePacketsCount); + HRESULT SetMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); + + /* Audio Input */ + + HRESULT EnableAudioInput([in] BMDAudioFormat audioFormat, [in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned int channelCount); + HRESULT DisableAudioInput(void); + HRESULT GetAvailableAudioSampleFrameCount([out] unsigned int *availableSampleFrameCount); + + /* Input Control */ + + HRESULT StartStreams(void); + HRESULT StopStreams(void); + HRESULT PauseStreams(void); + HRESULT FlushStreams(void); + HRESULT SetCallback([in] IDeckLinkEncoderInputCallback *theCallback); + + /* Hardware Timing */ + + HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); +}; + /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ [ @@ -581,6 +774,21 @@ interface IDeckLinkDiscovery; HRESULT GetFrameForRightEye([out] IDeckLinkVideoFrame* *rightEyeFrame); }; +/* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */ + +[ + object, + uuid(D5973DC9-6432-46D0-8F0B-2496F8A1238F), + local, + helpstring("Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information") +] interface IDeckLinkVideoFrameMetadataExtensions : IUnknown +{ + HRESULT GetInt([in] BMDDeckLinkFrameMetadataID metadataID, [out] LONGLONG *value); + HRESULT GetFloat([in] BMDDeckLinkFrameMetadataID metadataID, [out] double *value); + HRESULT GetFlag([in] BMDDeckLinkFrameMetadataID metadataID, [out] BOOL* value); + HRESULT GetString([in] BMDDeckLinkFrameMetadataID metadataID, [out] BSTR *value); +}; + /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ [ @@ -604,11 +812,67 @@ interface IDeckLinkDiscovery; ] interface IDeckLinkVideoFrameAncillary : IUnknown { - HRESULT GetBufferForVerticalBlankingLine([in] unsigned long lineNumber, [out] void **buffer); + HRESULT GetBufferForVerticalBlankingLine([in] unsigned int lineNumber, [out] void **buffer); BMDPixelFormat GetPixelFormat(void); BMDDisplayMode GetDisplayMode(void); }; +/* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */ + +[ + object, + uuid(B693F36C-316E-4AF1-B6C2-F389A4BCA620), + local, + helpstring("Interface to encapsulate an encoded packet.") +] interface IDeckLinkEncoderPacket : IUnknown +{ + HRESULT GetBytes([out] void **buffer); + long GetSize(void); + HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [in] BMDTimeScale timeScale); + BMDPacketType GetPacketType(void); +}; + +/* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */ + +[ + object, + uuid(4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0), + local, + helpstring("Provided by the IDeckLinkEncoderInput video packet arrival callback.") +] interface IDeckLinkEncoderVideoPacket : IDeckLinkEncoderPacket +{ + BMDPixelFormat GetPixelFormat(void); + HRESULT GetHardwareReferenceTimestamp([in] BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration); + + HRESULT GetTimecode([in] BMDTimecodeFormat format, [out] IDeckLinkTimecode **timecode); +}; + +/* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */ + +[ + object, + uuid(49E8EDC8-693B-4E14-8EF6-12C658F5A07A), + local, + helpstring("Provided by the IDeckLinkEncoderInput audio packet arrival callback.") +] interface IDeckLinkEncoderAudioPacket : IDeckLinkEncoderPacket +{ + BMDAudioFormat GetAudioFormat(void); +}; + +/* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */ + +[ + object, + uuid(639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7), + local, + helpstring("Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object") +] interface IDeckLinkH265NALPacket : IDeckLinkEncoderVideoPacket +{ + HRESULT GetUnitType([out] unsigned char *unitType); + HRESULT GetBytesNoPrefix([out] void **buffer); + long GetSizeNoPrefix(void); +}; + /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */ [ @@ -708,6 +972,22 @@ interface IDeckLinkDiscovery; HRESULT GetString([in] BMDDeckLinkAttributeID cfgID, [out] BSTR *value); }; +/* Interface IDeckLinkStatus - DeckLink Status interface */ + +[ + object, + uuid(5F558200-4028-49BC-BEAC-DB3FA4A96E46), + local, + helpstring("DeckLink Status interface") +] interface IDeckLinkStatus : IUnknown +{ + HRESULT GetFlag([in] BMDDeckLinkStatusID statusID, [out] BOOL *value); + HRESULT GetInt([in] BMDDeckLinkStatusID statusID, [out] LONGLONG *value); + HRESULT GetFloat([in] BMDDeckLinkStatusID statusID, [out] double *value); + HRESULT GetString([in] BMDDeckLinkStatusID statusID, [out] BSTR *value); + HRESULT GetBytes([in] BMDDeckLinkStatusID statusID, [out] void *buffer, [in, out] unsigned int *bufferSize); +}; + /* Interface IDeckLinkKeyer - DeckLink Keyer interface */ [ @@ -719,8 +999,8 @@ interface IDeckLinkDiscovery; { HRESULT Enable([in] BOOL isExternal); HRESULT SetLevel([in] unsigned char level); - HRESULT RampUp([in] unsigned long numberOfFrames); - HRESULT RampDown([in] unsigned long numberOfFrames); + HRESULT RampUp([in] unsigned int numberOfFrames); + HRESULT RampDown([in] unsigned int numberOfFrames); HRESULT Disable(void); }; @@ -762,6 +1042,8 @@ interface IDeckLinkDiscovery; /* Coclasses */ +importlib("stdole2.tlb"); + [ uuid(1F2E109A-8F4F-49E4-9203-135595CB6FA5), helpstring("CDeckLinkIterator Class") @@ -810,4 +1092,18 @@ interface IDeckLinkDiscovery; [default] interface IDeckLinkDiscovery; }; + +// import deprecated interfaces +#include "DeckLinkAPI_v10_6.idl" +#include "DeckLinkAPI_v10_5.idl" +#include "DeckLinkAPI_v10_4.idl" +#include "DeckLinkAPI_v10_2.idl" +#include "DeckLinkAPI_v9_9.idl" +#include "DeckLinkAPI_v9_2.idl" +#include "DeckLinkAPI_v8_1.idl" +#include "DeckLinkAPI_v8_0.idl" +#include "DeckLinkAPI_v7_9.idl" +#include "DeckLinkAPI_v7_6.idl" +#include "DeckLinkAPI_v7_3.idl" +#include "DeckLinkAPI_v7_1.idl" }; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl index 8d4adf7ba6e1ba..4e271e49cf9aee 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -59,6 +59,7 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigHDMI3DPackingFormat = /* '3dpf' */ 0x33647066, bmdDeckLinkConfigBypass = /* 'byps' */ 0x62797073, bmdDeckLinkConfigClockTimingAdjustment = /* 'ctad' */ 0x63746164, + bmdDeckLinkConfigDuplexMode = /* 'dupx' */ 0x64757078, /* Audio Input/Output Flags */ @@ -69,9 +70,10 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigFieldFlickerRemoval = /* 'fdfr' */ 0x66646672, bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = /* 'to59' */ 0x746F3539, bmdDeckLinkConfig444SDIVideoOutput = /* '444o' */ 0x3434346F, - bmdDeckLinkConfigSingleLinkVideoOutput = /* 'sglo' */ 0x73676C6F, bmdDeckLinkConfigBlackVideoOutputDuringCapture = /* 'bvoc' */ 0x62766F63, bmdDeckLinkConfigLowLatencyVideoOutput = /* 'llvo' */ 0x6C6C766F, + bmdDeckLinkConfigDownConversionOnAllAnalogOutput = /* 'caao' */ 0x6361616F, + bmdDeckLinkConfigSMPTELevelAOutput = /* 'smta' */ 0x736D7461, /* Video Output Integers */ @@ -82,6 +84,7 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoOutputIdleOperation = /* 'voio' */ 0x766F696F, bmdDeckLinkConfigDefaultVideoOutputMode = /* 'dvom' */ 0x64766F6D, bmdDeckLinkConfigDefaultVideoOutputModeFlags = /* 'dvof' */ 0x64766F66, + bmdDeckLinkConfigSDIOutputLinkConfiguration = /* 'solc' */ 0x736F6C63, /* Video Output Floats */ @@ -97,6 +100,7 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputScanning = /* 'visc' */ 0x76697363, // Applicable to H264 Pro Recorder only bmdDeckLinkConfigUseDedicatedLTCInput = /* 'dltc' */ 0x646C7463, // Use timecode from LTC input instead of SDI stream + bmdDeckLinkConfigSDIInput3DPayloadOverride = /* '3dds' */ 0x33646473, /* Video Input Integers */ @@ -119,6 +123,10 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigVideoInputSVideoLumaGain = /* 'islg' */ 0x69736C67, bmdDeckLinkConfigVideoInputSVideoChromaGain = /* 'iscg' */ 0x69736367, + /* Audio Input Flags */ + + bmdDeckLinkConfigMicrophonePhantomPower = /* 'mphp' */ 0x6D706870, + /* Audio Input Integers */ bmdDeckLinkConfigAudioInputConnection = /* 'aicn' */ 0x6169636E, @@ -130,6 +138,7 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = /* 'ais3' */ 0x61697333, bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = /* 'ais4' */ 0x61697334, bmdDeckLinkConfigDigitalAudioInputScale = /* 'dais' */ 0x64616973, + bmdDeckLinkConfigMicrophoneInputGain = /* 'micg' */ 0x6D696367, /* Audio Output Integers */ @@ -141,18 +150,60 @@ typedef [v1_enum] enum _BMDDeckLinkConfigurationID { bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = /* 'aos2' */ 0x616F7332, bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = /* 'aos3' */ 0x616F7333, bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = /* 'aos4' */ 0x616F7334, - bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73 + bmdDeckLinkConfigDigitalAudioOutputScale = /* 'daos' */ 0x64616F73, + bmdDeckLinkConfigHeadphoneVolume = /* 'hvol' */ 0x68766F6C, + + /* Device Information Strings */ + + bmdDeckLinkConfigDeviceInformationLabel = /* 'dila' */ 0x64696C61, + bmdDeckLinkConfigDeviceInformationSerialNumber = /* 'disn' */ 0x6469736E, + bmdDeckLinkConfigDeviceInformationCompany = /* 'dico' */ 0x6469636F, + bmdDeckLinkConfigDeviceInformationPhone = /* 'diph' */ 0x64697068, + bmdDeckLinkConfigDeviceInformationEmail = /* 'diem' */ 0x6469656D, + bmdDeckLinkConfigDeviceInformationDate = /* 'dida' */ 0x64696461, + + /* Deck Control Integers */ + + bmdDeckLinkConfigDeckControlConnection = /* 'dcco' */ 0x6463636F } BMDDeckLinkConfigurationID; +/* Enum BMDDeckLinkEncoderConfigurationID - DeckLink Encoder Configuration ID */ + +typedef [v1_enum] enum _BMDDeckLinkEncoderConfigurationID { + + /* Video Encoder Integers */ + + bmdDeckLinkEncoderConfigPreferredBitDepth = /* 'epbr' */ 0x65706272, + bmdDeckLinkEncoderConfigFrameCodingMode = /* 'efcm' */ 0x6566636D, + + /* HEVC/H.265 Encoder Integers */ + + bmdDeckLinkEncoderConfigH265TargetBitrate = /* 'htbr' */ 0x68746272, + + /* DNxHR/DNxHD Compression ID */ + + bmdDeckLinkEncoderConfigDNxHRCompressionID = /* 'dcid' */ 0x64636964, + + /* DNxHR/DNxHD Level */ + + bmdDeckLinkEncoderConfigDNxHRLevel = /* 'dlev' */ 0x646C6576, + + /* Encoded Sample Decriptions */ + + bmdDeckLinkEncoderConfigMPEG4SampleDescription = /* 'stsE' */ 0x73747345, // Full MPEG4 sample description (aka SampleEntry of an 'stsd' atom-box). Useful for MediaFoundation, QuickTime, MKV and more + bmdDeckLinkEncoderConfigMPEG4CodecSpecificDesc = /* 'esds' */ 0x65736473 // Sample description extensions only (atom stream, each with size and fourCC header). Useful for AVFoundation, VideoToolbox, MKV and more +} BMDDeckLinkEncoderConfigurationID; + // Forward Declarations interface IDeckLinkConfiguration; +interface IDeckLinkEncoderConfiguration; /* Interface IDeckLinkConfiguration - DeckLink Configuration interface */ [ object, - uuid(1E69FCF6-4203-4936-8076-2A9F4CFD50CB), + uuid(CB71734A-FE37-4E8D-8E13-802133A1C3F2), local, helpstring("DeckLink Configuration interface") ] interface IDeckLinkConfiguration : IUnknown @@ -168,4 +219,28 @@ interface IDeckLinkConfiguration; HRESULT WriteConfigurationToPreferences(void); }; +/* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +[ + object, + uuid(138050E5-C60A-4552-BF3F-0F358049327E), + local, + helpstring("DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput") +] interface IDeckLinkEncoderConfiguration : IUnknown +{ + HRESULT SetFlag([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] BOOL value); + HRESULT GetFlag([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] BOOL *value); + HRESULT SetInt([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] LONGLONG value); + HRESULT GetInt([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] LONGLONG *value); + HRESULT SetFloat([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] double value); + HRESULT GetFloat([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] double *value); + HRESULT SetString([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] BSTR value); + HRESULT GetString([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] BSTR *value); + HRESULT GetBytes([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] void *buffer /* optional */, [in, out] unsigned int *bufferSize); +}; + /* Coclasses */ + +importlib("stdole2.tlb"); + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl index ea4c099866ef49..cba3f2ec0bf940 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -39,8 +39,8 @@ // Enumeration Mapping -cpp_quote("typedef unsigned long BMDDeckControlStatusFlags;") -cpp_quote("typedef unsigned long BMDDeckControlExportModeOpsFlags;") +cpp_quote("typedef unsigned int BMDDeckControlStatusFlags;") +cpp_quote("typedef unsigned int BMDDeckControlExportModeOpsFlags;") cpp_quote("#if 0") typedef enum _BMDDeckControlStatusFlags BMDDeckControlStatusFlags; typedef enum _BMDDeckControlExportModeOpsFlags BMDDeckControlExportModeOpsFlags; @@ -153,7 +153,7 @@ interface IDeckLinkDeckControl; HRESULT TimecodeUpdate([in] BMDTimecodeBCD currentTimecode); HRESULT VTRControlStateChanged([in] BMDDeckControlVTRControlState newState, [in] BMDDeckControlError error); HRESULT DeckControlEventReceived([in] BMDDeckControlEvent event, [in] BMDDeckControlError error); - HRESULT DeckControlStatusChanged([in] BMDDeckControlStatusFlags flags, [in] unsigned long mask); + HRESULT DeckControlStatusChanged([in] BMDDeckControlStatusFlags flags, [in] unsigned int mask); }; /* Interface IDeckLinkDeckControl - Deck Control main interface */ @@ -168,7 +168,7 @@ interface IDeckLinkDeckControl; HRESULT Close([in] BOOL standbyOn); HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState *vtrControlState, [out] BMDDeckControlStatusFlags *flags); HRESULT SetStandby([in] BOOL standbyOn); - HRESULT SendCommand([in] unsigned char *inBuffer, [in] unsigned long inBufferSize, [out] unsigned char *outBuffer, [out] unsigned long *outDataSize, [in] unsigned long outBufferSize, [out] BMDDeckControlError *error); + HRESULT SendCommand([in] unsigned char *inBuffer, [in] unsigned int inBufferSize, [out] unsigned char *outBuffer, [out] unsigned int *outDataSize, [in] unsigned int outBufferSize, [out] BMDDeckControlError *error); HRESULT Play([out] BMDDeckControlError *error); HRESULT Stop([out] BMDDeckControlError *error); HRESULT TogglePlayStop([out] BMDDeckControlError *error); @@ -183,13 +183,13 @@ interface IDeckLinkDeckControl; HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error); HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error); HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error); - HRESULT SetPreroll([in] unsigned long prerollSeconds); - HRESULT GetPreroll([out] unsigned long *prerollSeconds); - HRESULT SetExportOffset([in] long exportOffsetFields); - HRESULT GetExportOffset([out] long *exportOffsetFields); - HRESULT GetManualExportOffset([out] long *deckManualExportOffsetFields); - HRESULT SetCaptureOffset([in] long captureOffsetFields); - HRESULT GetCaptureOffset([out] long *captureOffsetFields); + HRESULT SetPreroll([in] unsigned int prerollSeconds); + HRESULT GetPreroll([out] unsigned int *prerollSeconds); + HRESULT SetExportOffset([in] int exportOffsetFields); + HRESULT GetExportOffset([out] int *exportOffsetFields); + HRESULT GetManualExportOffset([out] int *deckManualExportOffsetFields); + HRESULT SetCaptureOffset([in] int captureOffsetFields); + HRESULT GetCaptureOffset([out] int *captureOffsetFields); HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error); HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error); HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error); @@ -200,3 +200,7 @@ interface IDeckLinkDeckControl; }; /* Coclasses */ + +importlib("stdole2.tlb"); + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl index ea626c2830c2a4..8b9db8ed5dd97b 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -59,3 +59,7 @@ interface IDeckLink; }; /* Coclasses */ + +importlib("stdole2.tlb"); + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl index 2282cb376f6000..e4f4c35e0b42e8 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -39,7 +39,7 @@ // Enumeration Mapping -cpp_quote("typedef unsigned long BMDDisplayModeFlags;") +cpp_quote("typedef unsigned int BMDDisplayModeFlags;") cpp_quote("#if 0") typedef enum _BMDDisplayModeFlags BMDDisplayModeFlags; cpp_quote("#endif") @@ -131,7 +131,12 @@ typedef [v1_enum] enum _BMDPixelFormat { bmdFormat12BitRGB = /* 'R12B' */ 0x52313242, // Big-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat12BitRGBLE = /* 'R12L' */ 0x5231324C, // Little-endian RGB 12-bit per component with full range (0-4095). Packed as 12-bit per component bmdFormat10BitRGBXLE = /* 'R10l' */ 0x5231306C, // Little-endian 10-bit RGB with SMPTE video levels (64-940) - bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062 // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormat10BitRGBX = /* 'R10b' */ 0x52313062, // Big-endian 10-bit RGB with SMPTE video levels (64-940) + bmdFormatH265 = /* 'hev1' */ 0x68657631, // High Efficiency Video Coding (HEVC/h.265) + + /* AVID DNxHR */ + + bmdFormatDNxHR = /* 'AVdh' */ 0x41566468 } BMDPixelFormat; /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ @@ -176,3 +181,7 @@ interface IDeckLinkDisplayMode; }; /* Coclasses */ + +importlib("stdole2.tlb"); + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl index e78afc1b582795..b609e5d1f6ebf2 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -237,8 +237,8 @@ interface IBMDStreamingH264NALParser; helpstring("Represents a mutable encoded video mode.") ] interface IBMDStreamingMutableVideoEncodingMode : IBMDStreamingVideoEncodingMode { - HRESULT SetSourceRect([in] unsigned long posX, [in] unsigned long posY, [in] unsigned long width, [in] unsigned long height); - HRESULT SetDestSize([in] unsigned long width, [in] unsigned long height); + HRESULT SetSourceRect([in] unsigned int posX, [in] unsigned int posY, [in] unsigned int width, [in] unsigned int height); + HRESULT SetDestSize([in] unsigned int width, [in] unsigned int height); HRESULT SetFlag([in] BMDStreamingEncodingModePropertyID cfgID, [in] BOOL value); HRESULT SetInt([in] BMDStreamingEncodingModePropertyID cfgID, [in] LONGLONG value); HRESULT SetFloat([in] BMDStreamingEncodingModePropertyID cfgID, [in] double value); @@ -298,7 +298,7 @@ interface IBMDStreamingH264NALParser; HRESULT GetBytes([out] void** buffer); HRESULT GetBytesWithSizePrefix([out] void** buffer); // Contains a 32-bit unsigned big endian size prefix HRESULT GetDisplayTime([in] ULONGLONG requestedTimeScale, [out] ULONGLONG* displayTime); - HRESULT GetPacketIndex([out] unsigned long* packetIndex); // Deprecated + HRESULT GetPacketIndex([out] unsigned int* packetIndex); // Deprecated }; /* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */ @@ -313,7 +313,7 @@ interface IBMDStreamingH264NALParser; long GetPayloadSize(void); HRESULT GetBytes([out] void** buffer); HRESULT GetPlayTime([in] ULONGLONG requestedTimeScale, [out] ULONGLONG* playTime); - HRESULT GetPacketIndex([out] unsigned long* packetIndex); // Deprecated + HRESULT GetPacketIndex([out] unsigned int* packetIndex); // Deprecated }; /* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */ @@ -338,11 +338,13 @@ interface IBMDStreamingH264NALParser; { HRESULT IsNALSequenceParameterSet([in] IBMDStreamingH264NALPacket* nal); HRESULT IsNALPictureParameterSet([in] IBMDStreamingH264NALPacket* nal); - HRESULT GetProfileAndLevelFromSPS([in] IBMDStreamingH264NALPacket* nal, [out] unsigned long* profileIdc, [out] unsigned long* profileCompatability, [out] unsigned long* levelIdc); + HRESULT GetProfileAndLevelFromSPS([in] IBMDStreamingH264NALPacket* nal, [out] unsigned int* profileIdc, [out] unsigned int* profileCompatability, [out] unsigned int* levelIdc); }; /* Coclasses */ +importlib("stdole2.tlb"); + [ uuid(0CAA31F6-8A26-40B0-86A4-BF58DCCA710C), helpstring("CBMDStreamingDiscovery Class") @@ -358,3 +360,5 @@ interface IBMDStreamingH264NALParser; { [default] interface IBMDStreamingH264NALParser; }; + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl index 1be85569b6463f..35915b4582b412 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl @@ -1,5 +1,5 @@ /* -LICENSE-START- -** Copyright (c) 2014 Blackmagic Design +** Copyright (c) 2016 Blackmagic Design ** ** Permission is hereby granted, free of charge, to any person or organization ** obtaining a copy of the software and accompanying documentation covered by @@ -38,12 +38,12 @@ typedef LONGLONG BMDTimeValue; typedef LONGLONG BMDTimeScale; -typedef unsigned long BMDTimecodeBCD; -typedef unsigned long BMDTimecodeUserBits; +typedef unsigned int BMDTimecodeBCD; +typedef unsigned int BMDTimecodeUserBits; // Enumeration Mapping -cpp_quote("typedef unsigned long BMDTimecodeFlags;") +cpp_quote("typedef unsigned int BMDTimecodeFlags;") cpp_quote("#if 0") typedef enum _BMDTimecodeFlags BMDTimecodeFlags; cpp_quote("#endif") @@ -74,9 +74,18 @@ typedef [v1_enum] enum _BMDAudioConnection { bmdAudioConnectionAESEBU = 1 << 1, bmdAudioConnectionAnalog = 1 << 2, bmdAudioConnectionAnalogXLR = 1 << 3, - bmdAudioConnectionAnalogRCA = 1 << 4 + bmdAudioConnectionAnalogRCA = 1 << 4, + bmdAudioConnectionMicrophone = 1 << 5, + bmdAudioConnectionHeadphones = 1 << 6 } BMDAudioConnection; +/* Enum BMDDeckControlConnection - Deck control connections */ + +typedef [v1_enum] enum _BMDDeckControlConnection { + bmdDeckControlConnectionRS422Remote1 = 1 << 0, + bmdDeckControlConnectionRS422Remote2 = 1 << 1 +} BMDDeckControlConnection; + // Forward Declarations interface IDeckLinkTimecode; @@ -97,3 +106,7 @@ interface IDeckLinkTimecode; }; /* Coclasses */ + +importlib("stdole2.tlb"); + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h b/plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h index 719ae2bbf66448..dfd1799e540b0f 100644 --- a/plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h @@ -30,7 +30,8 @@ #ifndef __DeckLink_API_Version_h__ #define __DeckLink_API_Version_h__ -#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a030100 -#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.3.1" +#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a080000 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.8" #endif // __DeckLink_API_Version_h__ + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl new file mode 100644 index 00000000000000..12b625099b0759 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl @@ -0,0 +1,73 @@ +/* -LICENSE-START- +** Copyright (c) 2014 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v10_2.idl */ + +// Enumeration Mapping + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef [v1_enum] enum _BMDDeckLinkConfigurationID_v10_2 { + + /* Video output flags */ + + bmdDeckLinkConfig3GBpsVideoOutput_v10_2 = /* '3gbs' */ 0x33676273 + +} BMDDeckLinkConfigurationID_v10_2; + +/* Enum BMDAudioConnection_v10_2 - Audio connection types */ + +typedef [v1_enum] enum _BMDAudioConnection_v10_2 { + bmdAudioConnectionEmbedded_v10_2 = /* 'embd' */ 0x656D6264, + bmdAudioConnectionAESEBU_v10_2 = /* 'aes ' */ 0x61657320, + bmdAudioConnectionAnalog_v10_2 = /* 'anlg' */ 0x616E6C67, + bmdAudioConnectionAnalogXLR_v10_2 = /* 'axlr' */ 0x61786C72, + bmdAudioConnectionAnalogRCA_v10_2 = /* 'arca' */ 0x61726361 +} BMDAudioConnection_v10_2; + +// Forward Declarations + +interface IDeckLinkConfiguration_v10_2; + +/* Interface IDeckLinkConfiguration_v10_2 - DeckLink Configuration interface */ + +[ + object, + uuid(C679A35B-610C-4D09-B748-1D0478100FC0), + local, + helpstring("DeckLink Configuration interface") +] interface IDeckLinkConfiguration_v10_2 : IUnknown +{ + HRESULT SetFlag([in] BMDDeckLinkConfigurationID cfgID, [in] BOOL value); + HRESULT GetFlag([in] BMDDeckLinkConfigurationID cfgID, [out] BOOL *value); + HRESULT SetInt([in] BMDDeckLinkConfigurationID cfgID, [in] LONGLONG value); + HRESULT GetInt([in] BMDDeckLinkConfigurationID cfgID, [out] LONGLONG *value); + HRESULT SetFloat([in] BMDDeckLinkConfigurationID cfgID, [in] double value); + HRESULT GetFloat([in] BMDDeckLinkConfigurationID cfgID, [out] double *value); + HRESULT SetString([in] BMDDeckLinkConfigurationID cfgID, [in] BSTR value); + HRESULT GetString([in] BMDDeckLinkConfigurationID cfgID, [out] BSTR *value); + HRESULT WriteConfigurationToPreferences(void); +}; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_4.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_4.idl new file mode 100644 index 00000000000000..8787e968bfcf1e --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_4.idl @@ -0,0 +1,61 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v10_4.idl */ + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef [v1_enum] enum _BMDDeckLinkConfigurationID_v10_4 { + + /* Video output flags */ + + bmdDeckLinkConfigSingleLinkVideoOutput_v10_4 = /* 'sglo' */ 0x73676C6F, + +} BMDDeckLinkConfigurationID_v10_4; + +// Forward Declarations + +interface IDeckLinkConfiguration_v10_4; + +/* Interface IDeckLinkConfiguration_v10_4 - DeckLink Configuration interface */ + +[ + object, + uuid(1E69FCF6-4203-4936-8076-2A9F4CFD50CB), + local, + helpstring("DeckLink Configuration interface") +] interface IDeckLinkConfiguration_v10_4 : IUnknown +{ + HRESULT SetFlag([in] BMDDeckLinkConfigurationID cfgID, [in] BOOL value); + HRESULT GetFlag([in] BMDDeckLinkConfigurationID cfgID, [out] BOOL *value); + HRESULT SetInt([in] BMDDeckLinkConfigurationID cfgID, [in] LONGLONG value); + HRESULT GetInt([in] BMDDeckLinkConfigurationID cfgID, [out] LONGLONG *value); + HRESULT SetFloat([in] BMDDeckLinkConfigurationID cfgID, [in] double value); + HRESULT GetFloat([in] BMDDeckLinkConfigurationID cfgID, [out] double *value); + HRESULT SetString([in] BMDDeckLinkConfigurationID cfgID, [in] BSTR value); + HRESULT GetString([in] BMDDeckLinkConfigurationID cfgID, [out] BSTR *value); + HRESULT WriteConfigurationToPreferences(void); +}; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl new file mode 100644 index 00000000000000..7348e491d72f12 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl @@ -0,0 +1,61 @@ +/* -LICENSE-START- +** Copyright (c) 2015 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v10_5.idl */ + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef [v1_enum] enum _BMDDeckLinkAttributeID_v10_5 { + + /* Integers */ + + BMDDeckLinkDeviceBusyState_v10_5 = /* 'dbst' */ 0x64627374, + +} BMDDeckLinkAttributeID_v10_5; + +// Forward Declarations + +interface IDeckLinkEncoderConfiguration_v10_5; + +/* Interface IDeckLinkEncoderConfiguration_v10_5 - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */ + +[ + object, + uuid(67455668-0848-45DF-8D8E-350A77C9A028), + local, + helpstring("DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput") +] interface IDeckLinkEncoderConfiguration_v10_5 : IUnknown +{ + HRESULT SetFlag([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] BOOL value); + HRESULT GetFlag([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] BOOL *value); + HRESULT SetInt([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] LONGLONG value); + HRESULT GetInt([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] LONGLONG *value); + HRESULT SetFloat([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] double value); + HRESULT GetFloat([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] double *value); + HRESULT SetString([in] BMDDeckLinkEncoderConfigurationID cfgID, [in] BSTR value); + HRESULT GetString([in] BMDDeckLinkEncoderConfigurationID cfgID, [out] BSTR *value); + HRESULT GetDecoderConfigurationInfo([out] void *buffer, [in] long bufferSize, [out] long *returnedSize); +}; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_6.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_6.idl new file mode 100644 index 00000000000000..1e43bd29c6ef56 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_6.idl @@ -0,0 +1,41 @@ +/* -LICENSE-START- +** Copyright (c) 2016 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v10_6.idl */ + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef [v1_enum] enum _BMDDeckLinkAttributeID_v10_6 { + + /* Flags */ + + BMDDeckLinkSupportsDesktopDisplay_v10_6 = /* 'extd' */ 0x65787464, + +} BMDDeckLinkAttributeID_v10_6; + +typedef [v1_enum] enum _BMDIdleVideoOutputOperation_v10_6 { + bmdIdleVideoOutputDesktop_v10_6 = /* 'desk' */ 0x6465736B +} BMDIdleVideoOutputOperation_v10_6; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl new file mode 100644 index 00000000000000..e21b5a80ac03c2 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl @@ -0,0 +1,160 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v7_1.idl */ + + interface IDeckLinkDisplayModeIterator_v7_1; + interface IDeckLinkDisplayMode_v7_1; + interface IDeckLinkVideoFrame_v7_1; + interface IDeckLinkVideoInputFrame_v7_1; + interface IDeckLinkAudioInputPacket_v7_1; + + [object, uuid(B28131B6-59AC-4857-B5AC-CD75D5883E2F), + helpstring("IDeckLinkDisplayModeIterator_v7_1 enumerates over supported input/output display modes.")] + interface IDeckLinkDisplayModeIterator_v7_1 : IUnknown + { + HRESULT Next ([out] IDeckLinkDisplayMode_v7_1** deckLinkDisplayMode); + }; + + + [object, uuid(AF0CD6D5-8376-435E-8433-54F9DD530AC3), + helpstring("IDeckLinkDisplayMode_v7_1 represents a display mode")] + interface IDeckLinkDisplayMode_v7_1 : IUnknown + { + HRESULT GetName ([out] BSTR* name); + BMDDisplayMode GetDisplayMode (); + long GetWidth (); + long GetHeight (); + HRESULT GetFrameRate ([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale); + }; + + [object, uuid(EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9), + helpstring("IDeckLinkVideoOutputCallback. Frame completion callback.")] + interface IDeckLinkVideoOutputCallback_v7_1 : IUnknown + { + HRESULT ScheduledFrameCompleted ([in] IDeckLinkVideoFrame_v7_1* completedFrame, [in] BMDOutputFrameCompletionResult result); + }; + + [object, uuid(7F94F328-5ED4-4E9F-9729-76A86BDC99CC), + helpstring("IDeckLinkInputCallback_v7_1. Frame arrival callback.")] + interface IDeckLinkInputCallback_v7_1 : IUnknown + { + HRESULT VideoInputFrameArrived ([in] IDeckLinkVideoInputFrame_v7_1* videoFrame, [in] IDeckLinkAudioInputPacket_v7_1* audioPacket); + }; + + + [object, uuid(AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5), local, + helpstring("IDeckLinkOutput_v7_1. Created by QueryInterface from IDeckLink.")] + interface IDeckLinkOutput_v7_1 : IUnknown + { + HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator); + + // Video output + HRESULT EnableVideoOutput (BMDDisplayMode displayMode); + HRESULT DisableVideoOutput (); + + HRESULT SetVideoOutputFrameMemoryAllocator ([in] IDeckLinkMemoryAllocator* theAllocator); + HRESULT CreateVideoFrame (int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame); + HRESULT CreateVideoFrameFromBuffer (void* buffer, int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame); + + HRESULT DisplayVideoFrameSync (IDeckLinkVideoFrame_v7_1* theFrame); + HRESULT ScheduleVideoFrame (IDeckLinkVideoFrame_v7_1* theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); + HRESULT SetScheduledFrameCompletionCallback ([in] IDeckLinkVideoOutputCallback_v7_1* theCallback); + + // Audio output + HRESULT EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); + HRESULT DisableAudioOutput (); + + HRESULT WriteAudioSamplesSync (void* buffer, unsigned int sampleFrameCount, [out] unsigned int *sampleFramesWritten); + + HRESULT BeginAudioPreroll (); + HRESULT EndAudioPreroll (); + HRESULT ScheduleAudioSamples (void* buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned int *sampleFramesWritten); + + HRESULT GetBufferedAudioSampleFrameCount ( [out] unsigned int *bufferedSampleCount); + HRESULT FlushBufferedAudioSamples (); + + HRESULT SetAudioCallback ( [in] IDeckLinkAudioOutputCallback* theCallback); + + // Output control + HRESULT StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); + HRESULT StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale); + HRESULT GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan); + }; + + [object, uuid(2B54EDEF-5B32-429F-BA11-BB990596EACD), + helpstring("IDeckLinkInput_v7_1. Created by QueryInterface from IDeckLink.")] + interface IDeckLinkInput_v7_1 : IUnknown + { + HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator); + + // Video input + HRESULT EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); + HRESULT DisableVideoInput (); + + // Audio input + HRESULT EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); + HRESULT DisableAudioInput (); + HRESULT ReadAudioSamples (void* buffer, unsigned int sampleFrameCount, [out] unsigned int *sampleFramesRead, [out] BMDTimeValue *audioPacketTime, BMDTimeScale timeScale); + HRESULT GetBufferedAudioSampleFrameCount ( [out] unsigned int *bufferedSampleCount); + + // Input control + HRESULT StartStreams (); + HRESULT StopStreams (); + HRESULT PauseStreams (); + HRESULT SetCallback ([in] IDeckLinkInputCallback_v7_1* theCallback); + }; + + [object, uuid(333F3A10-8C2D-43CF-B79D-46560FEEA1CE), local, + helpstring("IDeckLinkVideoFrame_v7_1. Created by IDeckLinkVideoOutput::CreateVideoFrame.")] + interface IDeckLinkVideoFrame_v7_1 : IUnknown + { + long GetWidth (); + long GetHeight (); + long GetRowBytes (); + BMDPixelFormat GetPixelFormat (); + BMDFrameFlags GetFlags (); + HRESULT GetBytes (void* *buffer); + }; + + [object, uuid(C8B41D95-8848-40EE-9B37-6E3417FB114B), local, + helpstring("IDeckLinkVideoInputFrame_v7_1. Provided by the IDeckLinkVideoInput frame arrival callback.")] + interface IDeckLinkVideoInputFrame_v7_1 : IDeckLinkVideoFrame_v7_1 + { + HRESULT GetFrameTime (BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale); + }; + + [object, uuid(C86DE4F6-A29F-42E3-AB3A-1363E29F0788), local, + helpstring("IDeckLinkAudioInputPacket_v7_1. Provided by the IDeckLinkInput callback.")] + interface IDeckLinkAudioInputPacket_v7_1 : IUnknown + { + long GetSampleCount (); + HRESULT GetBytes (void* *buffer); + HRESULT GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale); + }; + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl new file mode 100644 index 00000000000000..9dfa497e548477 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl @@ -0,0 +1,157 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* Forward Declarations */ + +interface IDeckLinkInputCallback_v7_3; +interface IDeckLinkOutput_v7_3; +interface IDeckLinkInput_v7_3; +interface IDeckLinkVideoInputFrame_v7_3; + +/* End Forward Declarations */ + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +[ + object, + uuid(FD6F311D-4D00-444B-9ED4-1F25B5730AD0), + helpstring("Frame arrival callback.") +] interface IDeckLinkInputCallback_v7_3 : IUnknown +{ + HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode_v7_6 *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags); + HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_3 *videoFrame, [in] IDeckLinkAudioInputPacket *audioPacket); +}; + +/* End Interface IDeckLinkInputCallback */ + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(271C65E3-C323-4344-A30F-D908BCB20AA3), + local, + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkOutput_v7_3 : IUnknown +{ + HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback); + + /* Video Output */ + + HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags); + HRESULT DisableVideoOutput(void); + + HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); + HRESULT CreateVideoFrame(int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame_v7_6 **outFrame); + HRESULT CreateAncillaryData(BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer); + + HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame_v7_6 *theFrame); + HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); + HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback); + HRESULT GetBufferedVideoFrameCount([out] unsigned int *bufferedFrameCount); + + /* Audio Output */ + + HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType); + HRESULT DisableAudioOutput(void); + + HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned int sampleFrameCount, [out] unsigned int *sampleFramesWritten); + + HRESULT BeginAudioPreroll(void); + HRESULT EndAudioPreroll(void); + HRESULT ScheduleAudioSamples([in] void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned int *sampleFramesWritten); + + HRESULT GetBufferedAudioSampleFrameCount([out] unsigned int *bufferedSampleFrameCount); + HRESULT FlushBufferedAudioSamples(void); + + HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback); + + /* Output Control */ + + HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); + HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale); + HRESULT IsScheduledPlaybackRunning([out] BOOL *active); + HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *elapsedTimeSinceSchedulerBegan); +}; + +/* End Interface IDeckLinkOutput */ + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(4973F012-9925-458C-871C-18774CDBBECB), + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkInput_v7_3 : IUnknown +{ + HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback); + + /* Video Input */ + + HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); + HRESULT DisableVideoInput(void); + HRESULT GetAvailableVideoFrameCount([out] unsigned int *availableFrameCount); + + /* Audio Input */ + + HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); + HRESULT DisableAudioInput(void); + HRESULT GetAvailableAudioSampleFrameCount([out] unsigned int *availableSampleFrameCount); + + /* Input Control */ + + HRESULT StartStreams(void); + HRESULT StopStreams(void); + HRESULT PauseStreams(void); + HRESULT FlushStreams(void); + HRESULT SetCallback([in] IDeckLinkInputCallback_v7_3 *theCallback); +}; + +/* End Interface IDeckLinkInput */ + + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +[ + object, + uuid(CF317790-2894-11DE-8C30-0800200C9A66), + local, + helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.") +] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame_v7_6 +{ + HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale); +}; + +/* End Interface IDeckLinkVideoInputFrame */ + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl new file mode 100644 index 00000000000000..8ed7b73a256c90 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl @@ -0,0 +1,396 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* Enum BMDVideoConnection - Video connection types */ + +typedef [v1_enum] enum _BMDVideoConnection_v7_6 { + bmdVideoConnectionSDI_v7_6 = /* 'sdi ' */ 0x73646920, + bmdVideoConnectionHDMI_v7_6 = /* 'hdmi' */ 0x68646D69, + bmdVideoConnectionOpticalSDI_v7_6 = /* 'opti' */ 0x6F707469, + bmdVideoConnectionComponent_v7_6 = /* 'cpnt' */ 0x63706E74, + bmdVideoConnectionComposite_v7_6 = /* 'cmst' */ 0x636D7374, + bmdVideoConnectionSVideo_v7_6 = /* 'svid' */ 0x73766964 +} BMDVideoConnection_v7_6; + + + +/* Forward Declarations */ + +interface IDeckLinkDisplayModeIterator_v7_6; +interface IDeckLinkDisplayMode_v7_6; +interface IDeckLinkOutput_v7_6; +interface IDeckLinkInput_v7_6; +interface IDeckLinkTimecode_v7_6; +interface IDeckLinkVideoFrame_v7_6; +interface IDeckLinkMutableVideoFrame_v7_6; +interface IDeckLinkVideoInputFrame_v7_6; +interface IDeckLinkScreenPreviewCallback_v7_6; +interface IDeckLinkGLScreenPreviewHelper_v7_6; +interface IDeckLinkVideoConversion_v7_6; +interface IDeckLinkConfiguration_v7_6; + + +/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */ + +[ + object, + uuid(E763A626-4A3C-49D1-BF13-E7AD3692AE52), + helpstring("Frame completion callback.") +] interface IDeckLinkVideoOutputCallback_v7_6 : IUnknown +{ + HRESULT ScheduledFrameCompleted([in] IDeckLinkVideoFrame_v7_6 *completedFrame, [in] BMDOutputFrameCompletionResult result); + HRESULT ScheduledPlaybackHasStopped(void); +}; + + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +[ + object, + uuid(31D28EE7-88B6-4CB1-897A-CDBF79A26414), + helpstring("Frame arrival callback.") +] interface IDeckLinkInputCallback_v7_6 : IUnknown +{ + HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode_v7_6 *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags); + HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_6* videoFrame, [in] IDeckLinkAudioInputPacket* audioPacket); +}; + + +/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ + +[ + object, + uuid(455D741F-1779-4800-86F5-0B5D13D79751), + helpstring("enumerates over supported input/output display modes.") +] interface IDeckLinkDisplayModeIterator_v7_6 : IUnknown +{ + HRESULT Next([out] IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode); +}; + + +/* Interface IDeckLinkDisplayMode - represents a display mode */ + +[ + object, + uuid(87451E84-2B7E-439E-A629-4393EA4A8550), + helpstring("represents a display mode") +] interface IDeckLinkDisplayMode_v7_6 : IUnknown +{ + HRESULT GetName([out] BSTR *name); + BMDDisplayMode GetDisplayMode(void); + long GetWidth(void); + long GetHeight(void); + HRESULT GetFrameRate([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale); + BMDFieldDominance GetFieldDominance(void); +}; + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(29228142-EB8C-4141-A621-F74026450955), + local, + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkOutput_v7_6 : IUnknown +{ + HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback_v7_6 *previewCallback); + + /* Video Output */ + + HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags); + HRESULT DisableVideoOutput(void); + + HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); + HRESULT CreateVideoFrame(int width, int height, int rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame_v7_6 **outFrame); + HRESULT CreateAncillaryData(BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer); + + HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame_v7_6 *theFrame); + HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale); + HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback_v7_6 *theCallback); + HRESULT GetBufferedVideoFrameCount([out] unsigned int *bufferedFrameCount); + + /* Audio Output */ + + HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount, BMDAudioOutputStreamType streamType); + HRESULT DisableAudioOutput(void); + + HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned int sampleFrameCount, [out] unsigned int *sampleFramesWritten); + + HRESULT BeginAudioPreroll(void); + HRESULT EndAudioPreroll(void); + HRESULT ScheduleAudioSamples([in] void *buffer, unsigned int sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned int *sampleFramesWritten); + + HRESULT GetBufferedAudioSampleFrameCount([out] unsigned int *bufferedSampleFrameCount); + HRESULT FlushBufferedAudioSamples(void); + + HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback); + + /* Output Control */ + + HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed); + HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale); + HRESULT IsScheduledPlaybackRunning([out] BOOL *active); + HRESULT GetScheduledStreamTime(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed); + + /* Hardware Timing */ + + HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); +}; + + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(300C135A-9F43-48E2-9906-6D7911D93CF1), + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkInput_v7_6 : IUnknown +{ + HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback_v7_6 *previewCallback); + + /* Video Input */ + + HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags); + HRESULT DisableVideoInput(void); + HRESULT GetAvailableVideoFrameCount([out] unsigned int *availableFrameCount); + + /* Audio Input */ + + HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned int channelCount); + HRESULT DisableAudioInput(void); + HRESULT GetAvailableAudioSampleFrameCount([out] unsigned int *availableSampleFrameCount); + + /* Input Control */ + + HRESULT StartStreams(void); + HRESULT StopStreams(void); + HRESULT PauseStreams(void); + HRESULT FlushStreams(void); + HRESULT SetCallback([in] IDeckLinkInputCallback_v7_6 *theCallback); + + /* Hardware Timing */ + + HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); +}; + + +/* Interface IDeckLinkTimecode_v7_6 - Used for video frame timecode representation. */ + +[ + object, + uuid(EFB9BCA6-A521-44F7-BD69-2332F24D9EE6), + helpstring("Used for video frame timecode representation.") +] interface IDeckLinkTimecode_v7_6 : IUnknown +{ + BMDTimecodeBCD GetBCD(void); + HRESULT GetComponents([out] unsigned char *hours, [out] unsigned char *minutes, [out] unsigned char *seconds, [out] unsigned char *frames); + HRESULT GetString([out] BSTR *timecode); + BMDTimecodeFlags GetFlags(void); +}; + + +/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ + +[ + object, + uuid(A8D8238E-6B18-4196-99E1-5AF717B83D32), + local, + helpstring("Interface to encapsulate a video frame; can be caller-implemented.") +] interface IDeckLinkVideoFrame_v7_6 : IUnknown +{ + long GetWidth(void); + long GetHeight(void); + long GetRowBytes(void); + BMDPixelFormat GetPixelFormat(void); + BMDFrameFlags GetFlags(void); + HRESULT GetBytes([out] void **buffer); + + HRESULT GetTimecode(BMDTimecodeFormat format, [out] IDeckLinkTimecode_v7_6 **timecode); + HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary); +}; + + +/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */ + +[ + object, + uuid(46FCEE00-B4E6-43D0-91C0-023A7FCEB34F), + local, + helpstring("Created by IDeckLinkOutput::CreateVideoFrame.") +] interface IDeckLinkMutableVideoFrame_v7_6 : IDeckLinkVideoFrame_v7_6 +{ + HRESULT SetFlags(BMDFrameFlags newFlags); + + HRESULT SetTimecode(BMDTimecodeFormat format, [in] IDeckLinkTimecode_v7_6 *timecode); + HRESULT SetTimecodeFromComponents(BMDTimecodeFormat format, unsigned char hours, unsigned char minutes, unsigned char seconds, unsigned char frames, BMDTimecodeFlags flags); + HRESULT SetAncillaryData([in] IDeckLinkVideoFrameAncillary *ancillary); +}; + + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +[ + object, + uuid(9A74FA41-AE9F-47AC-8CF4-01F42DD59965), + local, + helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.") +] interface IDeckLinkVideoInputFrame_v7_6 : IDeckLinkVideoFrame_v7_6 +{ + HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale); + HRESULT GetHardwareReferenceTimestamp(BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration); +}; + + +/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */ + +[ + object, + uuid(373F499D-4B4D-4518-AD22-6354E5A5825E), + local, + helpstring("Screen preview callback") +] interface IDeckLinkScreenPreviewCallback_v7_6 : IUnknown +{ + HRESULT DrawFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame); +}; + + +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ + +[ + object, + uuid(BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA), + local, + helpstring("Created with CoCreateInstance().") +] interface IDeckLinkGLScreenPreviewHelper_v7_6 : IUnknown +{ + + /* Methods must be called with OpenGL context set */ + + HRESULT InitializeGL(void); + HRESULT PaintGL(void); + HRESULT SetFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame); +}; + + +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ + +[ + object, + uuid(3EB504C9-F97D-40FE-A158-D407D48CB53B), + local, + helpstring("Created with CoCreateInstance().") +] interface IDeckLinkVideoConversion_v7_6 : IUnknown +{ + HRESULT ConvertFrame([in] IDeckLinkVideoFrame_v7_6* srcFrame, [in] IDeckLinkVideoFrame_v7_6* dstFrame); +}; + +/* Interface IDeckLinkConfiguration_v7_6 - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(B8EAD569-B764-47F0-A73F-AE40DF6CBF10), + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkConfiguration_v7_6 : IUnknown +{ + HRESULT GetConfigurationValidator([out] IDeckLinkConfiguration_v7_6 **configObject); + HRESULT WriteConfigurationToPreferences(void); + + /* Video Output Configuration */ + + HRESULT SetVideoOutputFormat([in] BMDVideoConnection_v7_6 videoOutputConnection); + HRESULT IsVideoOutputActive([in] BMDVideoConnection_v7_6 videoOutputConnection, [out] BOOL *active); + + HRESULT SetAnalogVideoOutputFlags([in] BMDAnalogVideoFlags analogVideoFlags); + HRESULT GetAnalogVideoOutputFlags([out] BMDAnalogVideoFlags *analogVideoFlags); + + HRESULT EnableFieldFlickerRemovalWhenPaused([in] BOOL enable); + HRESULT IsEnabledFieldFlickerRemovalWhenPaused([out] BOOL *enabled); + + HRESULT Set444And3GBpsVideoOutput([in] BOOL enable444VideoOutput, [in] BOOL enable3GbsOutput); + HRESULT Get444And3GBpsVideoOutput([out] BOOL *is444VideoOutputEnabled, [out] BOOL *threeGbsOutputEnabled); + + HRESULT SetVideoOutputConversionMode([in] BMDVideoOutputConversionMode conversionMode); + HRESULT GetVideoOutputConversionMode([out] BMDVideoOutputConversionMode *conversionMode); + + HRESULT Set_HD1080p24_to_HD1080i5994_Conversion([in] BOOL enable); + HRESULT Get_HD1080p24_to_HD1080i5994_Conversion([out] BOOL *enabled); + + /* Video Input Configuration */ + + HRESULT SetVideoInputFormat([in] BMDVideoConnection_v7_6 videoInputFormat); + HRESULT GetVideoInputFormat([out] BMDVideoConnection_v7_6 *videoInputFormat); + + HRESULT SetAnalogVideoInputFlags([in] BMDAnalogVideoFlags analogVideoFlags); + HRESULT GetAnalogVideoInputFlags([out] BMDAnalogVideoFlags *analogVideoFlags); + + HRESULT SetVideoInputConversionMode([in] BMDVideoInputConversionMode conversionMode); + HRESULT GetVideoInputConversionMode([out] BMDVideoInputConversionMode *conversionMode); + + HRESULT SetBlackVideoOutputDuringCapture([in] BOOL blackOutInCapture); + HRESULT GetBlackVideoOutputDuringCapture([out] BOOL *blackOutInCapture); + + HRESULT Set32PulldownSequenceInitialTimecodeFrame([in] unsigned int aFrameTimecode); + HRESULT Get32PulldownSequenceInitialTimecodeFrame([out] unsigned int *aFrameTimecode); + + HRESULT SetVancSourceLineMapping([in] unsigned int activeLine1VANCsource, [in] unsigned int activeLine2VANCsource, [in] unsigned int activeLine3VANCsource); + HRESULT GetVancSourceLineMapping([out] unsigned int *activeLine1VANCsource, [out] unsigned int *activeLine2VANCsource, [out] unsigned int *activeLine3VANCsource); + + /* Audio Input Configuration */ + + HRESULT SetAudioInputFormat([in] BMDAudioConnection_v10_2 audioInputFormat); + HRESULT GetAudioInputFormat([out] BMDAudioConnection_v10_2 *audioInputFormat); +}; + + + +/* Coclasses */ + +importlib("stdole2.tlb"); + +[ + uuid(D398CEE7-4434-4CA3-9BA6-5AE34556B905), + helpstring("CDeckLinkGLScreenPreviewHelper Class (DeckLink API v7.6)") +] coclass CDeckLinkGLScreenPreviewHelper_v7_6 +{ + [default] interface IDeckLinkGLScreenPreviewHelper_v7_6; +}; + +[ + uuid(FFA84F77-73BE-4FB7-B03E-B5E44B9F759B), + helpstring("CDeckLinkVideoConversion Class (DeckLink API v7.6)") +] coclass CDeckLinkVideoConversion_v7_6 +{ + [default] interface IDeckLinkVideoConversion_v7_6; +}; + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl new file mode 100644 index 00000000000000..722984a29d85c8 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl @@ -0,0 +1,69 @@ +/* -LICENSE-START- +** Copyright (c) 2010 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v7_9.idl */ + +/* Interface IDeckLinkDeckControl_v7_9 - Deck Control main interface */ + +[ + object, + uuid(A4D81043-0619-42B7-8ED6-602D29041DF7), + helpstring("Deck Control main interface") +] interface IDeckLinkDeckControl_v7_9 : IUnknown +{ + HRESULT Open([in] BMDTimeScale timeScale, [in] BMDTimeValue timeValue, [in] BOOL timecodeIsDropFrame, [out] BMDDeckControlError *error); + HRESULT Close([in] BOOL standbyOn); + HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState *vtrControlState, [out] BMDDeckControlStatusFlags *flags); + HRESULT SetStandby([in] BOOL standbyOn); + HRESULT Play([out] BMDDeckControlError *error); + HRESULT Stop([out] BMDDeckControlError *error); + HRESULT TogglePlayStop([out] BMDDeckControlError *error); + HRESULT Eject([out] BMDDeckControlError *error); + HRESULT GoToTimecode([in] BMDTimecodeBCD timecode, [out] BMDDeckControlError *error); + HRESULT FastForward([in] BOOL viewTape, [out] BMDDeckControlError *error); + HRESULT Rewind([in] BOOL viewTape, [out] BMDDeckControlError *error); + HRESULT StepForward([out] BMDDeckControlError *error); + HRESULT StepBack([out] BMDDeckControlError *error); + HRESULT Jog([in] double rate, [out] BMDDeckControlError *error); + HRESULT Shuttle([in] double rate, [out] BMDDeckControlError *error); + HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error); + HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error); + HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error); + HRESULT SetPreroll([in] unsigned int prerollSeconds); + HRESULT GetPreroll([out] unsigned int *prerollSeconds); + HRESULT SetExportOffset([in] int exportOffsetFields); + HRESULT GetExportOffset([out] int *exportOffsetFields); + HRESULT GetManualExportOffset([out] int *deckManualExportOffsetFields); + HRESULT SetCaptureOffset([in] int captureOffsetFields); + HRESULT GetCaptureOffset([out] int *captureOffsetFields); + HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error); + HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error); + HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error); + HRESULT Abort(void); + HRESULT CrashRecordStart([out] BMDDeckControlError *error); + HRESULT CrashRecordStop([out] BMDDeckControlError *error); + HRESULT SetCallback([in] IDeckLinkDeckControlStatusCallback *callback); +}; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl new file mode 100644 index 00000000000000..a2da181c641549 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl @@ -0,0 +1,62 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v8_0.idl */ + +/* Interface IDeckLink_v8_0 - represents a DeckLink device */ + +[ + object, + uuid(62BFF75D-6569-4E55-8D4D-66AA03829ABC), + helpstring("represents a DeckLink device") +] interface IDeckLink_v8_0 : IUnknown +{ + HRESULT GetModelName([out] BSTR *modelName); +}; + +/* Interface IDeckLinkIterator_v8_0 - enumerates installed DeckLink hardware */ + +[ + object, + uuid(74E936FC-CC28-4A67-81A0-1E94E52D4E69), + helpstring("enumerates installed DeckLink hardware") +] interface IDeckLinkIterator_v8_0 : IUnknown +{ + HRESULT Next([out] IDeckLink_v8_0 **deckLinkInstance); +}; + + +/* Coclasses */ + +importlib("stdole2.tlb"); + +[ + uuid(D9EDA3B3-2887-41FA-B724-017CF1EB1D37), + helpstring("CDeckLinkIterator Class (DeckLink API v8.0)") +] coclass CDeckLinkIterator_v8_0 +{ + [default] interface IDeckLinkIterator_v8_0; +}; diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl new file mode 100644 index 00000000000000..59b9a21803b369 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl @@ -0,0 +1,101 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPI_v8_1.idl */ + +/* Enum BMDDeckControlVTRControlState_v8_1 - VTR Control state */ + +typedef [v1_enum] enum _BMDDeckControlVTRControlState_v8_1 { + bmdDeckControlNotInVTRControlMode_v8_1 = /* 'nvcm' */ 0x6E76636D, + bmdDeckControlVTRControlPlaying_v8_1 = /* 'vtrp' */ 0x76747270, + bmdDeckControlVTRControlRecording_v8_1 = /* 'vtrr' */ 0x76747272, + bmdDeckControlVTRControlStill_v8_1 = /* 'vtra' */ 0x76747261, + bmdDeckControlVTRControlSeeking_v8_1 = /* 'vtrs' */ 0x76747273, + bmdDeckControlVTRControlStopped_v8_1 = /* 'vtro' */ 0x7674726F +} BMDDeckControlVTRControlState_v8_1; + + +interface IDeckLinkDeckControlStatusCallback; +interface IDeckLinkDeckControl; + +/* Interface IDeckLinkDeckControlStatusCallback_v8_1 - Deck control state change callback. */ + +[ + object, + uuid(E5F693C1-4283-4716-B18F-C1431521955B), + helpstring("Deck control state change callback.") +] interface IDeckLinkDeckControlStatusCallback_v8_1 : IUnknown +{ + HRESULT TimecodeUpdate([in] BMDTimecodeBCD currentTimecode); + HRESULT VTRControlStateChanged([in] BMDDeckControlVTRControlState_v8_1 newState, [in] BMDDeckControlError error); + HRESULT DeckControlEventReceived([in] BMDDeckControlEvent event, [in] BMDDeckControlError error); + HRESULT DeckControlStatusChanged([in] BMDDeckControlStatusFlags flags, [in] unsigned int mask); +}; + +/* Interface IDeckLinkDeckControl - Deck Control main interface */ + +[ + object, + uuid(522A9E39-0F3C-4742-94EE-D80DE335DA1D), + helpstring("Deck Control main interface") +] interface IDeckLinkDeckControl_v8_1 : IUnknown +{ + HRESULT Open([in] BMDTimeScale timeScale, [in] BMDTimeValue timeValue, [in] BOOL timecodeIsDropFrame, [out] BMDDeckControlError *error); + HRESULT Close([in] BOOL standbyOn); + HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState_v8_1 *vtrControlState, [out] BMDDeckControlStatusFlags *flags); + HRESULT SetStandby([in] BOOL standbyOn); + HRESULT SendCommand([in] unsigned char *inBuffer, [in] unsigned int inBufferSize, [out] unsigned char *outBuffer, [out] unsigned int *outDataSize, [in] unsigned int outBufferSize, [out] BMDDeckControlError *error); + HRESULT Play([out] BMDDeckControlError *error); + HRESULT Stop([out] BMDDeckControlError *error); + HRESULT TogglePlayStop([out] BMDDeckControlError *error); + HRESULT Eject([out] BMDDeckControlError *error); + HRESULT GoToTimecode([in] BMDTimecodeBCD timecode, [out] BMDDeckControlError *error); + HRESULT FastForward([in] BOOL viewTape, [out] BMDDeckControlError *error); + HRESULT Rewind([in] BOOL viewTape, [out] BMDDeckControlError *error); + HRESULT StepForward([out] BMDDeckControlError *error); + HRESULT StepBack([out] BMDDeckControlError *error); + HRESULT Jog([in] double rate, [out] BMDDeckControlError *error); + HRESULT Shuttle([in] double rate, [out] BMDDeckControlError *error); + HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error); + HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error); + HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error); + HRESULT SetPreroll([in] unsigned int prerollSeconds); + HRESULT GetPreroll([out] unsigned int *prerollSeconds); + HRESULT SetExportOffset([in] int exportOffsetFields); + HRESULT GetExportOffset([out] int *exportOffsetFields); + HRESULT GetManualExportOffset([out] int *deckManualExportOffsetFields); + HRESULT SetCaptureOffset([in] int captureOffsetFields); + HRESULT GetCaptureOffset([out] int *captureOffsetFields); + HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error); + HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error); + HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error); + HRESULT Abort(void); + HRESULT CrashRecordStart([out] BMDDeckControlError *error); + HRESULT CrashRecordStop([out] BMDDeckControlError *error); + HRESULT SetCallback([in] IDeckLinkDeckControlStatusCallback_v8_1 *callback); +}; + + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl new file mode 100644 index 00000000000000..e918e04052b8b1 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl @@ -0,0 +1,68 @@ +/* -LICENSE-START- +** Copyright (c) 2012 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v9_2.idl */ + + +/* Interface IDeckLinkInput_v9_2 - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(6D40EF78-28B9-4E21-990D-95BB7750A04F), + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkInput_v9_2 : IUnknown +{ + HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback); + + /* Video Input */ + + HRESULT EnableVideoInput([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags); + HRESULT DisableVideoInput(void); + HRESULT GetAvailableVideoFrameCount([out] unsigned int *availableFrameCount); + + /* Audio Input */ + + HRESULT EnableAudioInput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned int channelCount); + HRESULT DisableAudioInput(void); + HRESULT GetAvailableAudioSampleFrameCount([out] unsigned int *availableSampleFrameCount); + + /* Input Control */ + + HRESULT StartStreams(void); + HRESULT StopStreams(void); + HRESULT PauseStreams(void); + HRESULT FlushStreams(void); + HRESULT SetCallback([in] IDeckLinkInputCallback *theCallback); + + /* Hardware Timing */ + + HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); +}; + diff --git a/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl new file mode 100644 index 00000000000000..a5e1439789b200 --- /dev/null +++ b/plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl @@ -0,0 +1,87 @@ +/* -LICENSE-START- +** Copyright (c) 2012 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +/* DeckLinkAPI_v9_9.idl */ + + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +[ + object, + uuid(A3EF0963-0862-44ED-92A9-EE89ABF431C7), + local, + helpstring("Created by QueryInterface from IDeckLink.") +] interface IDeckLinkOutput_v9_9 : IUnknown +{ + HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoOutputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode); + HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator); + + HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback); + + /* Video Output */ + + HRESULT EnableVideoOutput([in] BMDDisplayMode displayMode, [in] BMDVideoOutputFlags flags); + HRESULT DisableVideoOutput(void); + + HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator); + HRESULT CreateVideoFrame([in] int width, [in] int height, [in] int rowBytes, [in] BMDPixelFormat pixelFormat, [in] BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame); + HRESULT CreateAncillaryData([in] BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer); + + HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame); + HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, [in] BMDTimeValue displayTime, [in] BMDTimeValue displayDuration, [in] BMDTimeScale timeScale); + HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback); + HRESULT GetBufferedVideoFrameCount([out] unsigned int *bufferedFrameCount); + + /* Audio Output */ + + HRESULT EnableAudioOutput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned int channelCount, [in] BMDAudioOutputStreamType streamType); + HRESULT DisableAudioOutput(void); + + HRESULT WriteAudioSamplesSync([in] void *buffer, [in] unsigned int sampleFrameCount, [out] unsigned int *sampleFramesWritten); + + HRESULT BeginAudioPreroll(void); + HRESULT EndAudioPreroll(void); + HRESULT ScheduleAudioSamples([in] void *buffer, [in] unsigned int sampleFrameCount, [in] BMDTimeValue streamTime, [in] BMDTimeScale timeScale, [out] unsigned int *sampleFramesWritten); + + HRESULT GetBufferedAudioSampleFrameCount([out] unsigned int *bufferedSampleFrameCount); + HRESULT FlushBufferedAudioSamples(void); + + HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback); + + /* Output Control */ + + HRESULT StartScheduledPlayback([in] BMDTimeValue playbackStartTime, [in] BMDTimeScale timeScale, [in] double playbackSpeed); + HRESULT StopScheduledPlayback([in] BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, [in] BMDTimeScale timeScale); + HRESULT IsScheduledPlaybackRunning([out] BOOL *active); + HRESULT GetScheduledStreamTime([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed); + HRESULT GetReferenceStatus([out] BMDReferenceStatus *referenceStatus); + + /* Hardware Timing */ + + HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame); +}; + From d160cedbc327dfa8dfc0b751a8c83079f4f1b37c Mon Sep 17 00:00:00 2001 From: Colin Edwards Date: Sun, 16 Oct 2016 23:22:47 -0500 Subject: [PATCH 26/80] CI: Build on OSX 10.10 on travis --- .travis.yml | 4 ++++ CI/install-dependencies-osx.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 00bb5470bff8d5..46be051960988e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ os: osx +osx_image: xcode7.1 env: matrix: - CMAKE_PREFIX_PATH=/usr/local/opt/qt5/lib/cmake @@ -8,11 +9,14 @@ env: - secure: "MfhOg+84yb4ZHB2tM8PIPFQX2Y+WLN0I0iiAgyLC4KaHPUoNOyloe9yk6OjV7Lj7SZWqTlQUsqHa8S9mOUswGIody1Ydglo4RvyGOKCd8I6b2ri/jE8qHVuD9sO+sNlIxq4YqqG/qReTsbSs2YEgLneZUCYLCk/fihl8L6eVuSc=" # secret - secure: "JRQVU2zgC3hY6CEY+Crmh/upp93En0BzKaLcsuBT538johNlK7m5hn3m2UOw63seLvBvVaKKWUDj9N986a3DwcXxWPMyF/9ctXgNWy39WzaVWxrbVR5nQB1fdiRp5YEgkoVN+gEm3OVF7sV5AGzh5/8CvEdRCoTLIGgMGHxW9mc=" + language: cpp + before_install: "./CI/install-dependencies-osx.sh" before_script: "./CI/before-script-osx.sh" script: cd ./build && make -j4 && cd - before_deploy: "./CI/before-deploy-osx.sh" + deploy: provider: s3 access_key_id: $AWS_ACCESS_KEY diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index 922b4b74f5bf67..2c979402ac21f3 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -1,7 +1,7 @@ brew update #Base OBS Deps -brew install ffmpeg x264 qt5 python +brew install ffmpeg x264 qt5 python cmake # CEF Stuff cd ../ From 971dd4945c3160cfd90dbe23abf239edbbf883d5 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 17 Oct 2016 02:05:25 -0700 Subject: [PATCH 27/80] UI: Fix bug in frontend API event Was using main->outputHandler->StreamingActive() for the obs_frontend_recording_active function. --- UI/api-interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 390c1da0510718..6a5bcc84ea9dae 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -231,7 +231,7 @@ struct OBSStudioAPI : obs_frontend_callbacks { bool obs_frontend_recording_active(void) override { - return main->outputHandler->StreamingActive(); + return main->outputHandler->RecordingActive(); } void *obs_frontend_add_tools_menu_qaction(const char *name) override From 7e5c7da542b3c06ca3aa60249aa3a236f6d1e072 Mon Sep 17 00:00:00 2001 From: cg2121 Date: Wed, 21 Sep 2016 03:51:18 -0500 Subject: [PATCH 28/80] frontend-tools: Add output timers This adds streaming and recording timers to the frontend tools. Closes jp9000/obs-studio#625 --- UI/data/locale/en-US.ini | 3 + UI/frontend-plugins/CMakeLists.txt | 4 +- .../frontend-tools/CMakeLists.txt | 21 +- .../frontend-tools/data/locale/en-US.ini | 6 + .../frontend-tools/forms/output-timer.ui | 194 ++++++++++ .../frontend-tools/frontend-tools.c | 10 + .../frontend-tools/output-timer.cpp | 339 ++++++++++++++++++ .../frontend-tools/output-timer.hpp | 31 ++ 8 files changed, 602 insertions(+), 6 deletions(-) create mode 100644 UI/frontend-plugins/frontend-tools/forms/output-timer.ui create mode 100644 UI/frontend-plugins/frontend-tools/output-timer.cpp create mode 100644 UI/frontend-plugins/frontend-tools/output-timer.hpp diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 3d6f196bd6233e..0b66d438afb860 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -54,6 +54,9 @@ Right="Right" Top="Top" Bottom="Bottom" Reset="Reset" +Hours="Hours" +Minutes="Minutes" +Seconds="Seconds" # quick transitions QuickTransitions.SwapScenes="Swap Preview/Output Scenes After Transitioning" diff --git a/UI/frontend-plugins/CMakeLists.txt b/UI/frontend-plugins/CMakeLists.txt index 0a90a60a0a0d32..bd2d33681a32cd 100644 --- a/UI/frontend-plugins/CMakeLists.txt +++ b/UI/frontend-plugins/CMakeLists.txt @@ -1,3 +1 @@ -if(WIN32 OR APPLE) - add_subdirectory(frontend-tools) -endif() +add_subdirectory(frontend-tools) diff --git a/UI/frontend-plugins/frontend-tools/CMakeLists.txt b/UI/frontend-plugins/frontend-tools/CMakeLists.txt index b15dc5256e9580..f186de6425a83c 100644 --- a/UI/frontend-plugins/frontend-tools/CMakeLists.txt +++ b/UI/frontend-plugins/frontend-tools/CMakeLists.txt @@ -5,15 +5,30 @@ if(APPLE) include_directories(${COCOA}) endif() +if(WIN32 OR APPLE) + set(frontend-tools_HEADERS + auto-scene-switcher.hpp + ) + set(frontend-tools_SOURCES + auto-scene-switcher.cpp + ) + set(frontend-tools_UI + forms/auto-scene-switcher.ui + ) +endif() + set(frontend-tools_HEADERS - auto-scene-switcher.hpp + ${frontend-tools_HEADERS} + output-timer.hpp ) set(frontend-tools_SOURCES + ${frontend-tools_SOURCES} frontend-tools.c - auto-scene-switcher.cpp + output-timer.cpp ) set(frontend-tools_UI - forms/auto-scene-switcher.ui + ${frontend-tools_UI} + forms/output-timer.ui ) if(WIN32) diff --git a/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini b/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini index 154241d4438ec5..08580f39ae0547 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini @@ -10,3 +10,9 @@ Active="Active" Inactive="Inactive" Start="Start" Stop="Stop" + +OutputTimer="Output Timer" +OutputTimer.Stream="Stop streaming after:" +OutputTimer.Record="Stop recording after:" +OutputTimer.Stream.StoppingIn="Streaming stopping in:" +OutputTimer.Record.StoppingIn="Recording stopping in:" diff --git a/UI/frontend-plugins/frontend-tools/forms/output-timer.ui b/UI/frontend-plugins/frontend-tools/forms/output-timer.ui new file mode 100644 index 00000000000000..8c983421c67133 --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/forms/output-timer.ui @@ -0,0 +1,194 @@ + + + OutputTimer + + + + 0 + 0 + 600 + 150 + + + + OutputTimer + + + + + + OutputTimer.Stream + + + + + + + 0 + + + 24 + + + 0 + + + + + + + Hours + + + + + + + 59 + + + 0 + + + + + + + Minutes + + + + + + + 0 + + + 59 + + + 30 + + + + + + + Seconds + + + + + + + Start + + + + + + + OutputTimer.Stream.StoppingIn + + + + + + + 00:00:00 + + + + + + + OutputTimer.Record + + + + + + + 0 + + + 24 + + + 0 + + + + + + + Hours + + + + + + + 0 + + + 59 + + + 0 + + + + + + + Minutes + + + + + + + 0 + + + 59 + + + 30 + + + + + + + Seconds + + + + + + + Start + + + + + + + OutputTimer.Record.StoppingIn + + + + + + + 00:00:00 + + + + + + + + diff --git a/UI/frontend-plugins/frontend-tools/frontend-tools.c b/UI/frontend-plugins/frontend-tools/frontend-tools.c index 3826f041f3d4ff..fb92b540b6f02b 100644 --- a/UI/frontend-plugins/frontend-tools/frontend-tools.c +++ b/UI/frontend-plugins/frontend-tools/frontend-tools.c @@ -3,16 +3,26 @@ OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("frontend-tools", "en-US") +#if defined(_WIN32) || defined(__APPLE__) void InitSceneSwitcher(); void FreeSceneSwitcher(); +#endif +void InitOutputTimer(); +void FreeOutputTimer(); bool obs_module_load(void) { +#if defined(_WIN32) || defined(__APPLE__) InitSceneSwitcher(); +#endif + InitOutputTimer(); return true; } void obs_module_unload(void) { +#if defined(_WIN32) || defined(__APPLE__) FreeSceneSwitcher(); +#endif + FreeOutputTimer(); } diff --git a/UI/frontend-plugins/frontend-tools/output-timer.cpp b/UI/frontend-plugins/frontend-tools/output-timer.cpp new file mode 100644 index 00000000000000..2ecfae8bfad235 --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/output-timer.cpp @@ -0,0 +1,339 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "output-timer.hpp" + +using namespace std; + +struct TimerData { + int streamTimerHours = 0; + int streamTimerMinutes = 0; + int streamTimerSeconds = 0; + int streamTimerTotal = 0; + + int recordTimerHours = 0; + int recordTimerMinutes = 0; + int recordTimerSeconds = 0; + int recordTimerTotal = 0; + + int streamTimerDisplay = 0; + int recordTimerDisplay = 0; + + int secondsStream = 0; + int totalMinutesStream = 0; + int minutesStream = 0; + int hoursStream = 0; + + int secondsRecord = 0; + int totalMinutesRecord = 0; + int minutesRecord = 0; + int hoursRecord = 0; + + bool streamButtonClicked = false; + bool recordButtonClicked = false; + + QTimer *streamingTimer; + QTimer *recordingTimer; + QTimer *streamingTimerDisplay; + QTimer *recordingTimerDisplay; + + QString textStream; + QString textRecord; +}; + +QMainWindow *window; +OutputTimer *ot; + +static TimerData *timer = nullptr; + +OutputTimer::OutputTimer(QWidget *parent) + : QDialog(parent), + ui(new Ui_OutputTimer) +{ + ui->setupUi(this); + + QObject::connect(ui->outputTimerStream, SIGNAL(clicked()), this, + SLOT(StreamingTimerButton())); + QObject::connect(ui->outputTimerRecord, SIGNAL(clicked()), this, + SLOT(RecordingTimerButton())); +} + +void OutputTimer::closeEvent(QCloseEvent*) +{ + obs_frontend_save(); +} + +void OutputTimer::StreamingTimerButton() +{ + if (obs_frontend_streaming_active()) + obs_frontend_streaming_stop(); + else + obs_frontend_streaming_start(); +} + +void OutputTimer::RecordingTimerButton() +{ + if (obs_frontend_recording_active()) + obs_frontend_recording_stop(); + else + obs_frontend_recording_start(); +} + +void OutputTimer::StreamTimerStart() +{ + timer->streamingTimer = new QTimer(this); + timer->streamingTimerDisplay = new QTimer(this); + + if (!isVisible()) { + ui->outputTimerStream->setEnabled(false); + return; + } + + timer->streamTimerHours = ui->streamingTimerHours->value(); + timer->streamTimerMinutes = ui->streamingTimerMinutes->value(); + timer->streamTimerSeconds = ui->streamingTimerSeconds->value(); + + timer->streamTimerTotal = (((timer->streamTimerHours * 3600) + + (timer->streamTimerMinutes * 60)) + + timer->streamTimerSeconds) * 1000; + + if (timer->streamTimerTotal == 0) + timer->streamTimerTotal = 1000; + + timer->streamTimerDisplay = timer->streamTimerTotal / 1000; + + timer->streamingTimer->setInterval(timer->streamTimerTotal); + timer->streamingTimer->setSingleShot(true); + + QObject::connect(timer->streamingTimer, SIGNAL(timeout()), + SLOT(EventStopStreaming())); + + QObject::connect(timer->streamingTimerDisplay, SIGNAL(timeout()), this, + SLOT(UpdateStreamTimerDisplay())); + + timer->streamingTimer->start(); + timer->streamingTimerDisplay->start(1000); + ui->outputTimerStream->setText(tr("Stop")); +} + +void OutputTimer::RecordTimerStart() +{ + timer->recordingTimer = new QTimer(this); + timer->recordingTimerDisplay = new QTimer(this); + + if (!isVisible()) { + ui->outputTimerRecord->setEnabled(false); + return; + } + + timer->recordTimerHours = ui->recordingTimerHours->value(); + timer->recordTimerMinutes = ui->recordingTimerMinutes->value(); + timer->recordTimerSeconds = ui->recordingTimerSeconds->value(); + + timer->recordTimerTotal = (((timer->recordTimerHours * 3600) + + (timer->recordTimerMinutes * 60)) + + timer->recordTimerSeconds) * 1000; + + if (timer->recordTimerTotal == 0) + timer->recordTimerTotal = 1000; + + timer->recordTimerDisplay = timer->recordTimerTotal / 1000; + + timer->recordingTimer->setInterval(timer->recordTimerTotal); + timer->recordingTimer->setSingleShot(true); + + QObject::connect(timer->recordingTimer, SIGNAL(timeout()), + SLOT(EventStopRecording())); + + QObject::connect(timer->recordingTimerDisplay, SIGNAL(timeout()), this, + SLOT(UpdateRecordTimerDisplay())); + + timer->recordingTimer->start(); + timer->recordingTimerDisplay->start(1000); + ui->outputTimerRecord->setText(tr("Stop")); +} + +void OutputTimer::StreamTimerStop() +{ + ui->outputTimerStream->setEnabled(true); + + if (!isVisible() && timer->streamingTimer->isActive() == false) + return; + + if (timer->streamingTimer->isActive()) + timer->streamingTimer->stop(); + + ui->outputTimerStream->setText(tr("Start")); + + if (timer->streamingTimerDisplay->isActive()) + timer->streamingTimerDisplay->stop(); + + ui->streamTime->setText("00:00:00"); +} + +void OutputTimer::RecordTimerStop() +{ + ui->outputTimerRecord->setEnabled(true); + + if (!isVisible() && timer->recordingTimer->isActive() == false) + return; + + if (timer->recordingTimer->isActive()) + timer->recordingTimer->stop(); + + ui->outputTimerRecord->setText(tr("Start")); + + if (timer->recordingTimerDisplay->isActive()) + timer->recordingTimerDisplay->stop(); + + ui->recordTime->setText("00:00:00"); +} + +void OutputTimer::UpdateStreamTimerDisplay() +{ + timer->streamTimerDisplay--; + + timer->secondsStream = timer->streamTimerDisplay % 60; + timer->totalMinutesStream = timer->streamTimerDisplay / 60; + timer->minutesStream = timer->totalMinutesStream % 60; + timer->hoursStream = timer->totalMinutesStream / 60; + + timer->textStream.sprintf("%02d:%02d:%02d", + timer->hoursStream, timer->minutesStream, timer->secondsStream); + ui->streamTime->setText(timer->textStream); +} + +void OutputTimer::UpdateRecordTimerDisplay() +{ + timer->recordTimerDisplay--; + + timer->secondsRecord = timer->recordTimerDisplay % 60; + timer->totalMinutesRecord = timer->recordTimerDisplay / 60; + timer->minutesRecord = timer->totalMinutesRecord % 60; + timer->hoursRecord = timer->totalMinutesRecord / 60; + + timer->textRecord.sprintf("%02d:%02d:%02d", + timer->hoursRecord, timer->minutesRecord, timer->secondsRecord); + ui->recordTime->setText(timer->textRecord); +} + +void OutputTimer::ShowHideDialog() +{ + if (!isVisible()) { + setVisible(true); + QTimer::singleShot(250, this, SLOT(show())); + } else { + setVisible(false); + QTimer::singleShot(250, this, SLOT(hide())); + } +} + +void OutputTimer::EventStopStreaming() +{ + obs_frontend_streaming_stop(); +} + +void OutputTimer::EventStopRecording() +{ + obs_frontend_recording_stop(); +} + +static void SaveOutputTimer(obs_data_t *save_data, bool saving, void *) +{ + if (saving) { + obs_data_t *obj = obs_data_create(); + + obs_data_set_int(obj, "streamTimerHours", + ot->ui->streamingTimerHours->value()); + obs_data_set_int(obj, "streamTimerMinutes", + ot->ui->streamingTimerMinutes->value()); + obs_data_set_int(obj, "streamTimerSeconds", + ot->ui->streamingTimerSeconds->value()); + + obs_data_set_int(obj, "recordTimerHours", + ot->ui->recordingTimerHours->value()); + obs_data_set_int(obj, "recordTimerMinutes", + ot->ui->recordingTimerMinutes->value()); + obs_data_set_int(obj, "recordTimerSeconds", + ot->ui->recordingTimerSeconds->value()); + + obs_data_set_obj(save_data, "output-timer", obj); + + obs_data_release(obj); + } else { + obs_data_t *obj = obs_data_get_obj(save_data, + "output-timer"); + + if (!obj) + obj = obs_data_create(); + + ot->ui->streamingTimerHours->setValue( + obs_data_get_int(obj, "streamTimerHours")); + ot->ui->streamingTimerMinutes->setValue( + obs_data_get_int(obj, "streamTimerMinutes")); + ot->ui->streamingTimerSeconds->setValue( + obs_data_get_int(obj, "streamTimerSeconds")); + + ot->ui->recordingTimerHours->setValue( + obs_data_get_int(obj, "recordTimerHours")); + ot->ui->recordingTimerMinutes->setValue( + obs_data_get_int(obj, "recordTimerMinutes")); + ot->ui->recordingTimerSeconds->setValue( + obs_data_get_int(obj, "recordTimerSeconds")); + + obs_data_release(obj); + } +} + +extern "C" void FreeOutputTimer() +{ + delete timer; + timer = nullptr; +} + +static void OBSEvent(enum obs_frontend_event event, void *) +{ + if (event == OBS_FRONTEND_EVENT_EXIT) { + obs_frontend_save(); + FreeOutputTimer(); + } else if (event == OBS_FRONTEND_EVENT_STREAMING_STARTED) { + ot->StreamTimerStart(); + } else if (event == OBS_FRONTEND_EVENT_STREAMING_STOPPING) { + ot->StreamTimerStop(); + } else if (event == OBS_FRONTEND_EVENT_RECORDING_STARTED) { + ot->RecordTimerStart(); + } else if (event == OBS_FRONTEND_EVENT_RECORDING_STOPPING) { + ot->RecordTimerStop(); + } +} + +extern "C" void InitOutputTimer() +{ + QAction *action = (QAction*)obs_frontend_add_tools_menu_qaction( + obs_module_text("OutputTimer")); + + timer = new TimerData; + + obs_frontend_push_ui_translation(obs_module_get_string); + + window = (QMainWindow*)obs_frontend_get_main_window(); + + ot = new OutputTimer(window); + + auto cb = [] () + { + ot->ShowHideDialog(); + }; + + obs_frontend_pop_ui_translation(); + + obs_frontend_add_save_callback(SaveOutputTimer, nullptr); + obs_frontend_add_event_callback(OBSEvent, nullptr); + + action->connect(action, &QAction::triggered, cb); +} diff --git a/UI/frontend-plugins/frontend-tools/output-timer.hpp b/UI/frontend-plugins/frontend-tools/output-timer.hpp new file mode 100644 index 00000000000000..d95b87a57ac8db --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/output-timer.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#include "ui_output-timer.h" + +class QCloseEvent; + +class OutputTimer : public QDialog { + Q_OBJECT + +public: + std::unique_ptr ui; + OutputTimer(QWidget *parent); + + void closeEvent(QCloseEvent *event) override; + +public slots: + void StreamingTimerButton(); + void RecordingTimerButton(); + void StreamTimerStart(); + void RecordTimerStart(); + void StreamTimerStop(); + void RecordTimerStop(); + void UpdateStreamTimerDisplay(); + void UpdateRecordTimerDisplay(); + void ShowHideDialog(); + void EventStopStreaming(); + void EventStopRecording(); +}; From a1ea6e4f51474a39f549a2b80259fe08b6fffe22 Mon Sep 17 00:00:00 2001 From: Christoph Hohmann Date: Mon, 17 Oct 2016 16:57:32 +0200 Subject: [PATCH 29/80] frontend-tools: Code cleanup of output timers --- .../frontend-tools/output-timer.cpp | 171 +++++++----------- .../frontend-tools/output-timer.hpp | 6 + 2 files changed, 69 insertions(+), 108 deletions(-) diff --git a/UI/frontend-plugins/frontend-tools/output-timer.cpp b/UI/frontend-plugins/frontend-tools/output-timer.cpp index 2ecfae8bfad235..f4086ee782c64b 100644 --- a/UI/frontend-plugins/frontend-tools/output-timer.cpp +++ b/UI/frontend-plugins/frontend-tools/output-timer.cpp @@ -10,47 +10,8 @@ using namespace std; -struct TimerData { - int streamTimerHours = 0; - int streamTimerMinutes = 0; - int streamTimerSeconds = 0; - int streamTimerTotal = 0; - - int recordTimerHours = 0; - int recordTimerMinutes = 0; - int recordTimerSeconds = 0; - int recordTimerTotal = 0; - - int streamTimerDisplay = 0; - int recordTimerDisplay = 0; - - int secondsStream = 0; - int totalMinutesStream = 0; - int minutesStream = 0; - int hoursStream = 0; - - int secondsRecord = 0; - int totalMinutesRecord = 0; - int minutesRecord = 0; - int hoursRecord = 0; - - bool streamButtonClicked = false; - bool recordButtonClicked = false; - - QTimer *streamingTimer; - QTimer *recordingTimer; - QTimer *streamingTimerDisplay; - QTimer *recordingTimerDisplay; - - QString textStream; - QString textRecord; -}; - -QMainWindow *window; OutputTimer *ot; -static TimerData *timer = nullptr; - OutputTimer::OutputTimer(QWidget *parent) : QDialog(parent), ui(new Ui_OutputTimer) @@ -61,6 +22,12 @@ OutputTimer::OutputTimer(QWidget *parent) SLOT(StreamingTimerButton())); QObject::connect(ui->outputTimerRecord, SIGNAL(clicked()), this, SLOT(RecordingTimerButton())); + + streamingTimer = new QTimer(this); + streamingTimerDisplay = new QTimer(this); + + recordingTimer = new QTimer(this); + recordingTimerDisplay = new QTimer(this); } void OutputTimer::closeEvent(QCloseEvent*) @@ -86,92 +53,86 @@ void OutputTimer::RecordingTimerButton() void OutputTimer::StreamTimerStart() { - timer->streamingTimer = new QTimer(this); - timer->streamingTimerDisplay = new QTimer(this); - if (!isVisible()) { ui->outputTimerStream->setEnabled(false); return; } - timer->streamTimerHours = ui->streamingTimerHours->value(); - timer->streamTimerMinutes = ui->streamingTimerMinutes->value(); - timer->streamTimerSeconds = ui->streamingTimerSeconds->value(); - - timer->streamTimerTotal = (((timer->streamTimerHours * 3600) + - (timer->streamTimerMinutes * 60)) + - timer->streamTimerSeconds) * 1000; + int hours = ui->streamingTimerHours->value(); + int minutes = ui->streamingTimerMinutes->value(); + int seconds = ui->streamingTimerSeconds->value(); - if (timer->streamTimerTotal == 0) - timer->streamTimerTotal = 1000; + int total = (((hours * 3600) + + (minutes * 60)) + + seconds) * 1000; - timer->streamTimerDisplay = timer->streamTimerTotal / 1000; + if (total == 0) + total = 1000; - timer->streamingTimer->setInterval(timer->streamTimerTotal); - timer->streamingTimer->setSingleShot(true); + streamingTimer->setInterval(total); + streamingTimer->setSingleShot(true); - QObject::connect(timer->streamingTimer, SIGNAL(timeout()), + QObject::connect(streamingTimer, SIGNAL(timeout()), SLOT(EventStopStreaming())); - QObject::connect(timer->streamingTimerDisplay, SIGNAL(timeout()), this, + QObject::connect(streamingTimerDisplay, SIGNAL(timeout()), this, SLOT(UpdateStreamTimerDisplay())); - timer->streamingTimer->start(); - timer->streamingTimerDisplay->start(1000); + streamingTimer->start(); + streamingTimerDisplay->start(1000); ui->outputTimerStream->setText(tr("Stop")); + + UpdateStreamTimerDisplay(); } void OutputTimer::RecordTimerStart() { - timer->recordingTimer = new QTimer(this); - timer->recordingTimerDisplay = new QTimer(this); - if (!isVisible()) { ui->outputTimerRecord->setEnabled(false); return; } - timer->recordTimerHours = ui->recordingTimerHours->value(); - timer->recordTimerMinutes = ui->recordingTimerMinutes->value(); - timer->recordTimerSeconds = ui->recordingTimerSeconds->value(); - - timer->recordTimerTotal = (((timer->recordTimerHours * 3600) + - (timer->recordTimerMinutes * 60)) + - timer->recordTimerSeconds) * 1000; + int hours = ui->recordingTimerHours->value(); + int minutes = ui->recordingTimerMinutes->value(); + int seconds = ui->recordingTimerSeconds->value(); - if (timer->recordTimerTotal == 0) - timer->recordTimerTotal = 1000; + int total = (((hours * 3600) + + (minutes * 60)) + + seconds) * 1000; - timer->recordTimerDisplay = timer->recordTimerTotal / 1000; + if (total == 0) + total = 1000; - timer->recordingTimer->setInterval(timer->recordTimerTotal); - timer->recordingTimer->setSingleShot(true); + recordingTimer->setInterval(total); + recordingTimer->setSingleShot(true); - QObject::connect(timer->recordingTimer, SIGNAL(timeout()), + QObject::connect(recordingTimer, SIGNAL(timeout()), SLOT(EventStopRecording())); - QObject::connect(timer->recordingTimerDisplay, SIGNAL(timeout()), this, + QObject::connect(recordingTimerDisplay, SIGNAL(timeout()), this, SLOT(UpdateRecordTimerDisplay())); - timer->recordingTimer->start(); - timer->recordingTimerDisplay->start(1000); + recordingTimer->start(); + recordingTimerDisplay->start(1000); ui->outputTimerRecord->setText(tr("Stop")); + + UpdateRecordTimerDisplay(); } void OutputTimer::StreamTimerStop() { ui->outputTimerStream->setEnabled(true); - if (!isVisible() && timer->streamingTimer->isActive() == false) + if (!isVisible() && streamingTimer->isActive() == false) return; - if (timer->streamingTimer->isActive()) - timer->streamingTimer->stop(); + if (streamingTimer->isActive()) + streamingTimer->stop(); ui->outputTimerStream->setText(tr("Start")); - if (timer->streamingTimerDisplay->isActive()) - timer->streamingTimerDisplay->stop(); + if (streamingTimerDisplay->isActive()) + streamingTimerDisplay->stop(); ui->streamTime->setText("00:00:00"); } @@ -180,46 +141,44 @@ void OutputTimer::RecordTimerStop() { ui->outputTimerRecord->setEnabled(true); - if (!isVisible() && timer->recordingTimer->isActive() == false) + if (!isVisible() && recordingTimer->isActive() == false) return; - if (timer->recordingTimer->isActive()) - timer->recordingTimer->stop(); + if (recordingTimer->isActive()) + recordingTimer->stop(); ui->outputTimerRecord->setText(tr("Start")); - if (timer->recordingTimerDisplay->isActive()) - timer->recordingTimerDisplay->stop(); + if (recordingTimerDisplay->isActive()) + recordingTimerDisplay->stop(); ui->recordTime->setText("00:00:00"); } void OutputTimer::UpdateStreamTimerDisplay() { - timer->streamTimerDisplay--; + int remainingTime = streamingTimer->remainingTime() / 1000; - timer->secondsStream = timer->streamTimerDisplay % 60; - timer->totalMinutesStream = timer->streamTimerDisplay / 60; - timer->minutesStream = timer->totalMinutesStream % 60; - timer->hoursStream = timer->totalMinutesStream / 60; + int seconds = remainingTime % 60; + int minutes = (remainingTime % 3600) / 60; + int hours = remainingTime / 3600; - timer->textStream.sprintf("%02d:%02d:%02d", - timer->hoursStream, timer->minutesStream, timer->secondsStream); - ui->streamTime->setText(timer->textStream); + QString text; + text.sprintf("%02d:%02d:%02d", hours, minutes, seconds); + ui->streamTime->setText(text); } void OutputTimer::UpdateRecordTimerDisplay() { - timer->recordTimerDisplay--; + int remainingTime = recordingTimer->remainingTime() / 1000; - timer->secondsRecord = timer->recordTimerDisplay % 60; - timer->totalMinutesRecord = timer->recordTimerDisplay / 60; - timer->minutesRecord = timer->totalMinutesRecord % 60; - timer->hoursRecord = timer->totalMinutesRecord / 60; + int seconds = remainingTime % 60; + int minutes = (remainingTime % 3600) / 60; + int hours = remainingTime / 3600; - timer->textRecord.sprintf("%02d:%02d:%02d", - timer->hoursRecord, timer->minutesRecord, timer->secondsRecord); - ui->recordTime->setText(timer->textRecord); + QString text; + text.sprintf("%02d:%02d:%02d", hours, minutes, seconds); + ui->recordTime->setText(text); } void OutputTimer::ShowHideDialog() @@ -292,8 +251,6 @@ static void SaveOutputTimer(obs_data_t *save_data, bool saving, void *) extern "C" void FreeOutputTimer() { - delete timer; - timer = nullptr; } static void OBSEvent(enum obs_frontend_event event, void *) @@ -317,11 +274,9 @@ extern "C" void InitOutputTimer() QAction *action = (QAction*)obs_frontend_add_tools_menu_qaction( obs_module_text("OutputTimer")); - timer = new TimerData; - obs_frontend_push_ui_translation(obs_module_get_string); - window = (QMainWindow*)obs_frontend_get_main_window(); + QMainWindow *window = (QMainWindow*)obs_frontend_get_main_window(); ot = new OutputTimer(window); diff --git a/UI/frontend-plugins/frontend-tools/output-timer.hpp b/UI/frontend-plugins/frontend-tools/output-timer.hpp index d95b87a57ac8db..7db353e79d29ab 100644 --- a/UI/frontend-plugins/frontend-tools/output-timer.hpp +++ b/UI/frontend-plugins/frontend-tools/output-timer.hpp @@ -28,4 +28,10 @@ public slots: void ShowHideDialog(); void EventStopStreaming(); void EventStopRecording(); + +private: + QTimer *streamingTimer; + QTimer *recordingTimer; + QTimer *streamingTimerDisplay; + QTimer *recordingTimerDisplay; }; From 66398470174f435c704286a635c6a4c88295a9ba Mon Sep 17 00:00:00 2001 From: cg2121 Date: Mon, 17 Oct 2016 21:49:24 -0500 Subject: [PATCH 30/80] frontend-tools: Add ability to start timer if output is already active This adds the ability to start the output timer if streaming or recording is already active. --- .../frontend-tools/output-timer.cpp | 28 ++++++++++++------- .../frontend-tools/output-timer.hpp | 3 ++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/UI/frontend-plugins/frontend-tools/output-timer.cpp b/UI/frontend-plugins/frontend-tools/output-timer.cpp index f4086ee782c64b..128e5fb9582491 100644 --- a/UI/frontend-plugins/frontend-tools/output-timer.cpp +++ b/UI/frontend-plugins/frontend-tools/output-timer.cpp @@ -37,24 +37,32 @@ void OutputTimer::closeEvent(QCloseEvent*) void OutputTimer::StreamingTimerButton() { - if (obs_frontend_streaming_active()) - obs_frontend_streaming_stop(); - else + if (!obs_frontend_streaming_active()) { obs_frontend_streaming_start(); + } else if (streamingAlreadyActive) { + StreamTimerStart(); + streamingAlreadyActive = false; + } else if (obs_frontend_streaming_active()) { + obs_frontend_streaming_stop(); + } } void OutputTimer::RecordingTimerButton() { - if (obs_frontend_recording_active()) - obs_frontend_recording_stop(); - else + if (!obs_frontend_recording_active()) { obs_frontend_recording_start(); + } else if (recordingAlreadyActive) { + RecordTimerStart(); + recordingAlreadyActive = false; + } else if (obs_frontend_recording_active()) { + obs_frontend_recording_stop(); + } } void OutputTimer::StreamTimerStart() { if (!isVisible()) { - ui->outputTimerStream->setEnabled(false); + streamingAlreadyActive = true; return; } @@ -88,7 +96,7 @@ void OutputTimer::StreamTimerStart() void OutputTimer::RecordTimerStart() { if (!isVisible()) { - ui->outputTimerRecord->setEnabled(false); + recordingAlreadyActive = true; return; } @@ -121,7 +129,7 @@ void OutputTimer::RecordTimerStart() void OutputTimer::StreamTimerStop() { - ui->outputTimerStream->setEnabled(true); + streamingAlreadyActive = false; if (!isVisible() && streamingTimer->isActive() == false) return; @@ -139,7 +147,7 @@ void OutputTimer::StreamTimerStop() void OutputTimer::RecordTimerStop() { - ui->outputTimerRecord->setEnabled(true); + recordingAlreadyActive = false; if (!isVisible() && recordingTimer->isActive() == false) return; diff --git a/UI/frontend-plugins/frontend-tools/output-timer.hpp b/UI/frontend-plugins/frontend-tools/output-timer.hpp index 7db353e79d29ab..ff3b733dc3f575 100644 --- a/UI/frontend-plugins/frontend-tools/output-timer.hpp +++ b/UI/frontend-plugins/frontend-tools/output-timer.hpp @@ -30,6 +30,9 @@ public slots: void EventStopRecording(); private: + bool streamingAlreadyActive = false; + bool recordingAlreadyActive = false; + QTimer *streamingTimer; QTimer *recordingTimer; QTimer *streamingTimerDisplay; From dadefceccfc69afb1abb9cd69017902f7413e044 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 19 Oct 2016 05:29:34 -0700 Subject: [PATCH 31/80] UI: Fix sys. tray crashes when sys. tray not available When the system tray is not available, the system tray variables would still be used despite not being initialized. Fixes mantis bug 640 on linux systems in particular that may not always have system tray available. --- UI/window-basic-main.cpp | 58 +++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 9fb8536d948bf2..4f5ce134a22a35 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -3602,14 +3602,20 @@ void OBSBasic::StartStreaming() ui->streamButton->setEnabled(false); ui->streamButton->setText(QTStr("Basic.Main.Connecting")); - sysTrayStream->setEnabled(false); - sysTrayStream->setText(ui->streamButton->text()); + + if (sysTrayStream) { + sysTrayStream->setEnabled(false); + sysTrayStream->setText(ui->streamButton->text()); + } if (!outputHandler->StartStreaming(service)) { ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); ui->streamButton->setEnabled(true); - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } } bool recordWhenStreaming = config_get_bool(GetGlobalConfig(), @@ -3699,8 +3705,11 @@ void OBSBasic::StreamDelayStarting(int sec) { ui->streamButton->setText(QTStr("Basic.Main.StopStreaming")); ui->streamButton->setEnabled(true); - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } if (!startStreamMenu.isNull()) startStreamMenu->deleteLater(); @@ -3721,8 +3730,11 @@ void OBSBasic::StreamDelayStopping(int sec) { ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); ui->streamButton->setEnabled(true); - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } if (!startStreamMenu.isNull()) startStreamMenu->deleteLater(); @@ -3742,8 +3754,11 @@ void OBSBasic::StreamingStart() ui->streamButton->setText(QTStr("Basic.Main.StopStreaming")); ui->streamButton->setEnabled(true); ui->statusbar->StreamStarted(outputHandler->streamOutput); - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } if (api) api->on_event(OBS_FRONTEND_EVENT_STREAMING_STARTED); @@ -3756,7 +3771,9 @@ void OBSBasic::StreamingStart() void OBSBasic::StreamStopping() { ui->streamButton->setText(QTStr("Basic.Main.StoppingStreaming")); - sysTrayStream->setText(ui->streamButton->text()); + + if (sysTrayStream) + sysTrayStream->setText(ui->streamButton->text()); streamingStopping = true; if (api) @@ -3795,8 +3812,11 @@ void OBSBasic::StreamingStop(int code) ui->streamButton->setText(QTStr("Basic.Main.StartStreaming")); ui->streamButton->setEnabled(true); - sysTrayStream->setText(ui->streamButton->text()); - sysTrayStream->setEnabled(true); + + if (sysTrayStream) { + sysTrayStream->setText(ui->streamButton->text()); + sysTrayStream->setEnabled(true); + } streamingStopping = false; if (api) @@ -3836,7 +3856,9 @@ void OBSBasic::StartRecording() void OBSBasic::RecordStopping() { ui->recordButton->setText(QTStr("Basic.Main.StoppingRecording")); - sysTrayRecord->setText(ui->recordButton->text()); + + if (sysTrayRecord) + sysTrayRecord->setText(ui->recordButton->text()); recordingStopping = true; if (api) @@ -3857,7 +3879,9 @@ void OBSBasic::RecordingStart() { ui->statusbar->RecordingStarted(outputHandler->fileOutput); ui->recordButton->setText(QTStr("Basic.Main.StopRecording")); - sysTrayRecord->setText(ui->recordButton->text()); + + if (sysTrayRecord) + sysTrayRecord->setText(ui->recordButton->text()); recordingStopping = false; if (api) @@ -3872,7 +3896,9 @@ void OBSBasic::RecordingStop(int code) { ui->statusbar->RecordingStopped(); ui->recordButton->setText(QTStr("Basic.Main.StartRecording")); - sysTrayRecord->setText(ui->recordButton->text()); + + if (sysTrayRecord) + sysTrayRecord->setText(ui->recordButton->text()); blog(LOG_INFO, RECORDING_STOP); if (code == OBS_OUTPUT_UNSUPPORTED && isVisible()) { From 9081df9708b392be3a5bff531836a4e9ea6f159d Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 19 Oct 2016 06:44:02 -0700 Subject: [PATCH 32/80] UI: Fix poor handling of system tray pointers The original pull request that added the system tray feature was riddled with bad pointer usage. Bare pointers that are never properly freed, never contained within a QPointer or unique_ptr. These have now been changed to use QPointer variables, and to always check when the variables are valid before using. The order of destruction for QMenu that uses the actions has now been prioritized first before the actions. --- UI/window-basic-main.cpp | 12 ++++++++---- UI/window-basic-main.hpp | 14 +++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 4f5ce134a22a35..0c8b3bf37af944 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -3652,7 +3652,8 @@ inline void OBSBasic::OnActivate() App()->IncrementSleepInhibition(); UpdateProcessPriority(); - trayIcon->setIcon(QIcon(":/res/images/tray_active.png")); + if (trayIcon) + trayIcon->setIcon(QIcon(":/res/images/tray_active.png")); } } @@ -3663,7 +3664,8 @@ inline void OBSBasic::OnDeactivate() App()->DecrementSleepInhibition(); ClearProcessPriority(); - trayIcon->setIcon(QIcon(":/res/images/obs.png")); + if (trayIcon) + trayIcon->setIcon(QIcon(":/res/images/obs.png")); } } @@ -4557,7 +4559,8 @@ void OBSBasic::SetShowing(bool showing) "BasicWindow", "geometry", saveGeometry().toBase64().constData()); - showHide->setText(QTStr("Basic.SystemTray.Show")); + if (showHide) + showHide->setText(QTStr("Basic.SystemTray.Show")); QTimer::singleShot(250, this, SLOT(hide())); if (previewEnabled) @@ -4566,7 +4569,8 @@ void OBSBasic::SetShowing(bool showing) setVisible(false); } else if (showing && !isVisible()) { - showHide->setText(QTStr("Basic.SystemTray.Hide")); + if (showHide) + showHide->setText(QTStr("Basic.SystemTray.Hide")); QTimer::singleShot(250, this, SLOT(show())); if (previewEnabled) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index d52a8c7c96d7ff..1dd0cc5fb13e54 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -151,13 +151,13 @@ class OBSBasic : public OBSMainWindow { QPointer startStreamMenu; - QSystemTrayIcon *trayIcon; - QMenu *trayMenu; - QAction *sysTrayStream; - QAction *sysTrayRecord; - QAction *showHide; - QAction *showPreview; - QAction *exit; + QPointer trayIcon; + QPointer sysTrayStream; + QPointer sysTrayRecord; + QPointer showHide; + QPointer showPreview; + QPointer exit; + QPointer trayMenu; bool disableHiding = false; void DrawBackdrop(float cx, float cy); From ee7e319a6192a0cf7d33c6138e78233da1285439 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 19 Oct 2016 06:49:12 -0700 Subject: [PATCH 33/80] UI: Fix improper brace placement for function --- UI/window-basic-main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 0c8b3bf37af944..3cfd75541f03ca 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -4580,7 +4580,8 @@ void OBSBasic::SetShowing(bool showing) } } -void OBSBasic::SystemTrayInit() { +void OBSBasic::SystemTrayInit() +{ trayIcon = new QSystemTrayIcon(QIcon(":/res/images/obs.png"), this); trayIcon->setToolTip("OBS Studio"); From 83fa6e728a251b7c07764b197d0e84301039de81 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 19 Oct 2016 06:52:57 -0700 Subject: [PATCH 34/80] UI: Remove unused variable --- UI/window-basic-main.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 1dd0cc5fb13e54..3fa92d035f35de 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -155,7 +155,6 @@ class OBSBasic : public OBSMainWindow { QPointer sysTrayStream; QPointer sysTrayRecord; QPointer showHide; - QPointer showPreview; QPointer exit; QPointer trayMenu; bool disableHiding = false; From 623c9dc41a98ef0fd18f3d7fc7794c7bfcba1470 Mon Sep 17 00:00:00 2001 From: Christoph Hohmann Date: Thu, 20 Oct 2016 15:29:43 +0200 Subject: [PATCH 35/80] UI: Fix full screen projector on screens that have reserved areas QScreen::availableGeometry() does not return the full screen size on X11 if areas of the screen are reserved by the window manager. In this case the full screen projector does not cover the whole screen. Using QScreen::geometry() instead fixes this issue. --- UI/window-basic-main.cpp | 4 ++-- UI/window-basic-settings.cpp | 2 +- UI/window-projector.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 3cfd75541f03ca..6a73ebdee8948d 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -141,7 +141,7 @@ OBSBasic::OBSBasic(QWidget *parent) QRect windowGeometry = normalGeometry(); if (!WindowPositionValid(windowGeometry)) { - QRect rect = App()->desktop()->availableGeometry(); + QRect rect = App()->desktop()->geometry(); setGeometry(QStyle::alignedRect( Qt::LeftToRight, Qt::AlignCenter, @@ -2774,7 +2774,7 @@ static void AddProjectorMenuMonitors(QMenu *parent, QObject *target, QAction *action; QList screens = QGuiApplication::screens(); for (int i = 0; i < screens.size(); i++) { - QRect screenGeometry = screens[i]->availableGeometry(); + QRect screenGeometry = screens[i]->geometry(); QString str = QString("%1 %2: %3x%4 @ %5,%6"). arg(QTStr("Display"), QString::number(i), diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index f2b9a621788072..9d9444b3bcf714 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -1101,7 +1101,7 @@ void OBSBasicSettings::LoadResolutionLists() ui->baseResolution->clear(); for (QScreen* screen: QGuiApplication::screens()) { - QSize as = screen->availableSize(); + QSize as = screen->size(); string res = ResString(as.width(), as.height()); ui->baseResolution->addItem(res.c_str()); } diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 1adf791b053de1..8cdb88f06286eb 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -50,7 +50,7 @@ OBSProjector::~OBSProjector() void OBSProjector::Init(int monitor) { QScreen *screen = QGuiApplication::screens()[monitor]; - setGeometry(screen->availableGeometry()); + setGeometry(screen->geometry()); bool alwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", "ProjectorAlwaysOnTop"); From a7ef10f7ea318cfafe2ae3b05a5c86faf4a89578 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Wed, 19 Oct 2016 07:25:22 -0700 Subject: [PATCH 36/80] obs-ffmpeg: Add b-frames to NVENC logging --- plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c index 520c6e80dfa731..270383ff35fe12 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c @@ -223,11 +223,13 @@ static bool nvenc_update(void *data, obs_data_t *settings) "\twidth: %d\n" "\theight: %d\n" "\t2-pass: %s\n" + "\tb-frames: %d\n" "\tGPU: %d\n", rc, bitrate, cqp, enc->context->gop_size, preset, profile, level, enc->context->width, enc->context->height, twopass ? "true" : "false", + enc->context->max_b_frames, gpu); return nvenc_init_codec(enc); From d5ad621dd1746125973ded96ce852ac6db0ece01 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 20 Oct 2016 12:41:56 -0700 Subject: [PATCH 37/80] UI: Fix --profile option not working on non-windows Using "*.*" as a search string is a windows-specific search term. "*" should be used instead. --- UI/obs-app.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 90253dab20c647..c236a2b3f19441 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -451,7 +451,7 @@ static string GetProfileDirFromName(const char *name) if (GetConfigPath(path, sizeof(path), "obs-studio/basic/profiles") <= 0) return outputPath; - strcat(path, "/*.*"); + strcat(path, "/*"); if (os_glob(path, 0, &glob) != 0) return outputPath; From 405ae6bc7c4ebe77a53880e1a3557fc1fc467860 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 21 Oct 2016 23:00:21 -0700 Subject: [PATCH 38/80] rtmp-services: Add Picarto --- plugins/rtmp-services/data/package.json | 4 ++-- plugins/rtmp-services/data/services.json | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/rtmp-services/data/package.json b/plugins/rtmp-services/data/package.json index de4103d1d23aca..0f16fc7c81b7c3 100644 --- a/plugins/rtmp-services/data/package.json +++ b/plugins/rtmp-services/data/package.json @@ -1,10 +1,10 @@ { "url": "https://obsproject.com/obs2_update/rtmp-services", - "version": 39, + "version": 40, "files": [ { "name": "services.json", - "version": 39 + "version": 40 } ] } diff --git a/plugins/rtmp-services/data/services.json b/plugins/rtmp-services/data/services.json index 84976d088066f3..5ac5605e515d59 100644 --- a/plugins/rtmp-services/data/services.json +++ b/plugins/rtmp-services/data/services.json @@ -807,6 +807,21 @@ "max video bitrate": 3000, "max audio bitrate": 128 } + }, + { + "name": "Picarto", + "servers": [ + { + "name": "USA/Canada", + "url": "rtmp://live.us.picarto.tv/golive" + } + ], + "recommended": { + "keyint": 2, + "profile": "main", + "max video bitrate": 2000, + "max audio bitrate": 160 + } } ] } From 39a91d749c49eadc173e84e6cb07ed630428a212 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sun, 23 Oct 2016 09:08:16 -0700 Subject: [PATCH 39/80] libobs/util: Add Get() function to CoTaskMemPtr --- libobs/util/windows/CoTaskMemPtr.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libobs/util/windows/CoTaskMemPtr.hpp b/libobs/util/windows/CoTaskMemPtr.hpp index d9830d179e757e..ff607deb1f9655 100644 --- a/libobs/util/windows/CoTaskMemPtr.hpp +++ b/libobs/util/windows/CoTaskMemPtr.hpp @@ -29,6 +29,8 @@ template class CoTaskMemPtr { inline operator T*() const {return ptr;} inline T *operator->() const {return ptr;} + inline const T *Get() const {return ptr;} + inline CoTaskMemPtr& operator=(T* val) { Clear(); From e775abaa714ece36a37aba58329d9c7dcbaa6de1 Mon Sep 17 00:00:00 2001 From: Christoph Hohmann Date: Mon, 24 Oct 2016 13:43:22 +0200 Subject: [PATCH 40/80] libobs: Fix missing call to profile_end() when encoding fails The do_encode() method does not call profile_end() when encoding fails which causes an error message about mismatching names being logged. --- libobs/obs-encoder.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index e1ce46fe0d143d..f8cbaef143273b 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -796,7 +796,7 @@ static inline void do_encode(struct obs_encoder *encoder, full_stop(encoder); blog(LOG_ERROR, "Error encoding with encoder '%s'", encoder->context.name); - return; + goto error; } if (received) { @@ -822,6 +822,7 @@ static inline void do_encode(struct obs_encoder *encoder, pthread_mutex_unlock(&encoder->callbacks_mutex); } +error: profile_end(do_encode_name); } From ff6f5398d37b1518a6d2357255acebe29115bcc4 Mon Sep 17 00:00:00 2001 From: Stefan Slivinski Date: Thu, 27 Oct 2016 15:15:42 -0700 Subject: [PATCH 41/80] adding support for auto ingest selection --- build_script/build.bat | 4 ++-- plugins/ftl-services/ftl-beam.c | 3 +++ plugins/libftl/CMakeLists.txt | 38 +++++--------------------------- plugins/libftl/ftl-sdk | 2 +- plugins/obs-outputs/ftl-stream.c | 18 +++++++-------- 5 files changed, 20 insertions(+), 45 deletions(-) diff --git a/build_script/build.bat b/build_script/build.bat index 4716be1c159bb5..e08bc9c344336a 100755 --- a/build_script/build.bat +++ b/build_script/build.bat @@ -1,6 +1,6 @@ REM @Echo Off SET build_config=Release -SET obs_version=0.16.2-ftl.13 +SET obs_version=0.16.2-ftl.14 SET coredeps=C:\beam\tachyon_deps SET QTDIR64=C:\Qt\5.6\msvc2015_64 SET QTDIR32=C:\Qt\5.6\msvc2015 @@ -35,7 +35,7 @@ if "%1" == "clean" ( pushd . cd .. pushd . -call git submodule update --init +IF NOT EXIST "plugins\libftl\ftl-sdk" call git submodule update --init popd . IF EXIST build GOTO BUILD_DIR_EXISTS mkdir build diff --git a/plugins/ftl-services/ftl-beam.c b/plugins/ftl-services/ftl-beam.c index 5986eee01ab265..f49495d8ef1d56 100644 --- a/plugins/ftl-services/ftl-beam.c +++ b/plugins/ftl-services/ftl-beam.c @@ -266,6 +266,9 @@ static void fill_servers(obs_property_t *servers_prop, json_t *ingests, const ch obs_property_list_clear(servers_prop); + /*add auto to list*/ + obs_property_list_add_string(servers_prop, "Auto", "auto"); + json_array_foreach(ingests, index, ingest) { const char *name = get_string_val(ingest, "name"); const char *host = get_string_val(ingest, "host"); diff --git a/plugins/libftl/CMakeLists.txt b/plugins/libftl/CMakeLists.txt index efa1850f796070..e1a5f8d73363f7 100644 --- a/plugins/libftl/CMakeLists.txt +++ b/plugins/libftl/CMakeLists.txt @@ -1,12 +1,16 @@ project(libftl) -#include_directories(${OBS_JANSSON_INCLUDE_DIRS}) +find_package(Libcurl REQUIRED) + +include_directories(${OBS_JANSSON_INCLUDE_DIRS}) +include_directories(${LIBCURL_INCLUDE_DIRS}) set(FTLSDK_SOURCES ftl-sdk/libftl/hmac/hmac.c ftl-sdk/libftl/hmac/sha2.c ftl-sdk/libftl/ftl-sdk.c ftl-sdk/libftl/handshake.c + ftl-sdk/libftl/ingest.c ftl-sdk/libftl/ftl_helpers.c ftl-sdk/libftl/media.c ftl-sdk/libftl/gettimeofday/gettimeofday.c @@ -48,7 +52,7 @@ set_target_properties(libftl PROPERTIES VERSION "0.5.0") set_target_properties(libftl PROPERTIES SOVERSION 0) if(WIN32) - target_link_libraries(libftl ws2_32) + target_link_libraries(libftl ws2_32 ${LIBCURL_LIBRARIES} ${OBS_JANSSON_IMPORT}) endif() target_include_directories(libftl @@ -64,33 +68,3 @@ include_directories (${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/) #set(LIBFTL_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include) install_obs_plugin_with_data(libftl data) -#set(LIBFTL_LIBRARIES libftl) - -#include_directories(${LIBFTL_INCLUDE_DIRS}) - -#install(TARGETS libftl DESTINATION lib) -#install(FILES ftl-sdk/libftl/ftl.h DESTINATION "include/libftl") -#target_include_directories(libftl -# PUBLIC src "${CMAKE_CURRENT_BINARY_DIR}/include") - -#target_include_directories(libobs -# PUBLIC -# "$" -# "$" -# "$") - -#target_link_libraries(libobs -# PRIVATE -# ${libobs_PLATFORM_DEPS} -# ${libobs_image_loading_LIBRARIES} -# ${OBS_JANSSON_IMPORT} -# ${FFMPEG_LIBRARIES} -# ${ZLIB_LIBRARIES} -# PUBLIC -# ${THREADS_LIBRARIES}) - -#install_obs_core(libobs EXPORT LibObs) -#install_obs_data(libobs data libobs) -#install_obs_headers(${libobs_HEADERS}) - -#obs_install_additional(libobs) diff --git a/plugins/libftl/ftl-sdk b/plugins/libftl/ftl-sdk index 137bf8eb5ba8f4..114dca22349dd0 160000 --- a/plugins/libftl/ftl-sdk +++ b/plugins/libftl/ftl-sdk @@ -1 +1 @@ -Subproject commit 137bf8eb5ba8f4a3d0a791bc37e4b2c9db1e3c58 +Subproject commit 114dca22349dd01ed931a19c6b896e06f6ca7d0b diff --git a/plugins/obs-outputs/ftl-stream.c b/plugins/obs-outputs/ftl-stream.c index ea1bcfd63e2588..422ec8df2d4d5a 100755 --- a/plugins/obs-outputs/ftl-stream.c +++ b/plugins/obs-outputs/ftl-stream.c @@ -84,7 +84,7 @@ struct ftl_stream { os_event_t *stop_event; uint64_t stop_ts; - struct dstr path, path_ip; + struct dstr path; uint32_t channel_id; struct dstr username, password; struct dstr encoder_name; @@ -201,7 +201,6 @@ static void ftl_stream_destroy(void *data) if (stream) { free_packets(stream); dstr_free(&stream->path); - dstr_free(&stream->path_ip); dstr_free(&stream->username); dstr_free(&stream->password); dstr_free(&stream->encoder_name); @@ -421,7 +420,7 @@ static void *send_thread(void *data) } if (disconnected(stream)) { - info("Disconnected from %s (%s)", stream->path.array, stream->path_ip.array); + info("Disconnected from %s", stream->path.array); } else { info("User stopped the stream"); } @@ -635,12 +634,12 @@ static int try_connect(struct ftl_stream *stream) { ftl_status_t status_code; - if (dstr_is_empty(&stream->path_ip)) { + if (dstr_is_empty(&stream->path)) { warn("URL is empty"); return OBS_OUTPUT_BAD_PATH; } - info("Connecting to FTL Ingest URL %s (%s)...", stream->path.array, stream->path_ip.array); + info("Connecting to FTL Ingest URL %s...", stream->path.array); stream->width = (int)obs_output_get_width(stream->output); stream->height = (int)obs_output_get_height(stream->output); @@ -650,7 +649,7 @@ static int try_connect(struct ftl_stream *stream) return OBS_OUTPUT_ERROR; } - info("Connection to %s (%s) successful", stream->path.array, stream->path_ip.array); + info("Connection to %s successful", stream->path.array); pthread_create(&stream->status_thread, NULL, status_thread, stream); @@ -950,7 +949,7 @@ static void *connect_thread(void *data) if (ret != OBS_OUTPUT_SUCCESS) { obs_output_signal_stop(stream->output, ret); - info("Connection to %s (%s) failed: %d", stream->path.array, stream->path_ip.array, ret); + info("Connection to %s (%s) failed: %d", stream->path.array, ret); } if (!stopping(stream)) @@ -997,8 +996,7 @@ static bool init_connect(struct ftl_stream *stream) obs_data_t *video_settings = obs_encoder_get_settings(video_encoder); dstr_copy(&stream->path, obs_service_get_url(service)); - lookup_ingest_ip(stream->path.array, tmp_ip); - dstr_copy(&stream->path_ip, tmp_ip); + key = obs_service_get_key(service); struct obs_video_info ovi; @@ -1028,7 +1026,7 @@ static bool init_connect(struct ftl_stream *stream) stream->params.stream_key = (char*)key; stream->params.video_codec = FTL_VIDEO_H264; stream->params.audio_codec = FTL_AUDIO_OPUS; - stream->params.ingest_hostname = stream->path_ip.array; + stream->params.ingest_hostname = stream->path.array; stream->params.vendor_name = "OBS Studio"; stream->params.vendor_version = version.array; stream->params.fps_num = fps_num; From f970bb8a80042961962e1904f5a00d7b4162b5ed Mon Sep 17 00:00:00 2001 From: Stefan Slivinski Date: Thu, 27 Oct 2016 16:44:29 -0700 Subject: [PATCH 42/80] using speed test to figure out peak bitrate --- plugins/obs-outputs/ftl-stream.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/plugins/obs-outputs/ftl-stream.c b/plugins/obs-outputs/ftl-stream.c index 422ec8df2d4d5a..b293c929251b8b 100755 --- a/plugins/obs-outputs/ftl-stream.c +++ b/plugins/obs-outputs/ftl-stream.c @@ -379,6 +379,26 @@ static int send_packet(struct ftl_stream *stream, return ret; } +static void set_peak_bitrate(struct ftl_stream *stream) { + int speedtest_kbps = 10000; + int speedtest_duration = 1000; + + printf("Running speed test: sending %d kbps for %d ms", speedtest_kbps, speedtest_duration); + float packetloss_rate = 0; + packetloss_rate = ftl_ingest_speed_test(&stream->ftl_handle, speedtest_kbps, speedtest_duration); + + if(packetloss_rate <= 1){ + stream->params.peak_kbps = speedtest_kbps; + } + else{ + stream->params.peak_kbps = (float)speedtest_kbps * (100.f - packetloss_rate) / 110; + } + + printf("Running speed test complete: packet loss rate was %3.2f, setting peak bitrate to %d\n", packetloss_rate, stream->params.peak_kbps); + + ftl_ingest_update_params(&stream->ftl_handle, &stream->params); +} + static inline bool send_headers(struct ftl_stream *stream, int64_t dts_usec); static void *send_thread(void *data) @@ -388,6 +408,8 @@ static void *send_thread(void *data) os_set_thread_name("ftl-stream: send_thread"); + set_peak_bitrate(stream); + while (os_sem_wait(stream->send_sem) == 0) { struct encoder_packet packet; @@ -994,9 +1016,7 @@ static bool init_connect(struct ftl_stream *stream) settings = obs_output_get_settings(stream->output); obs_encoder_t *video_encoder = obs_output_get_video_encoder(stream->output); obs_data_t *video_settings = obs_encoder_get_settings(video_encoder); - dstr_copy(&stream->path, obs_service_get_url(service)); - key = obs_service_get_key(service); struct obs_video_info ovi; @@ -1044,12 +1064,12 @@ static bool init_connect(struct ftl_stream *stream) dstr_copy(&stream->password, obs_service_get_password(service)); dstr_depad(&stream->path); dstr_free(&version); - /* + stream->drop_threshold_usec = (int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD) * 1000; stream->max_shutdown_time_sec = (int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC); -*/ + bind_ip = obs_data_get_string(settings, OPT_BIND_IP); dstr_copy(&stream->bind_ip, bind_ip); From 523e1ace49f56fcf442999ce9dc9709756d2d13d Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 27 Oct 2016 18:34:14 -0700 Subject: [PATCH 43/80] libobs: Add date/time to crash handler --- libobs/obs-win-crash-handler.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libobs/obs-win-crash-handler.c b/libobs/obs-win-crash-handler.c index 51e219925064ce..77a5d798cb38b8 100644 --- a/libobs/obs-win-crash-handler.c +++ b/libobs/obs-win-crash-handler.c @@ -16,6 +16,7 @@ ******************************************************************************/ #include +#include #include #include #include @@ -248,12 +249,20 @@ static inline void init_module_info(struct exception_handler_data *data) static inline void write_header(struct exception_handler_data *data) { + char date_time[80]; + time_t now = time(0); + struct tm ts; + ts = *localtime(&now); + strftime(date_time, sizeof(date_time), "%Y-%m-%d, %X", &ts); + dstr_catf(&data->str, "Unhandled exception: %x\r\n" + "Date/Time: %s\r\n" "Fault address: %"PRIX64" (%s)\r\n" "libobs version: "OBS_VERSION"\r\n" "Windows version: %d.%d build %d (revision %d)\r\n" "CPU: %s\r\n\r\n", data->exception->ExceptionRecord->ExceptionCode, + date_time, data->main_trace.instruction_ptr, data->module_name.array, data->win_version.major, data->win_version.minor, From 262f2b7073879d7b97109a54f91c162851c0427c Mon Sep 17 00:00:00 2001 From: Stefan Slivinski Date: Fri, 28 Oct 2016 17:08:55 -0700 Subject: [PATCH 44/80] computing peak bitrate using speed test api --- build_script/build.bat | 2 +- plugins/libftl/ftl-sdk | 2 +- plugins/obs-outputs/ftl-stream.c | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/build_script/build.bat b/build_script/build.bat index e08bc9c344336a..060fb9dd640d7d 100755 --- a/build_script/build.bat +++ b/build_script/build.bat @@ -1,6 +1,6 @@ REM @Echo Off SET build_config=Release -SET obs_version=0.16.2-ftl.14 +SET obs_version=0.16.2-ftl.14.pre SET coredeps=C:\beam\tachyon_deps SET QTDIR64=C:\Qt\5.6\msvc2015_64 SET QTDIR32=C:\Qt\5.6\msvc2015 diff --git a/plugins/libftl/ftl-sdk b/plugins/libftl/ftl-sdk index 114dca22349dd0..4c6594f4231d85 160000 --- a/plugins/libftl/ftl-sdk +++ b/plugins/libftl/ftl-sdk @@ -1 +1 @@ -Subproject commit 114dca22349dd01ed931a19c6b896e06f6ca7d0b +Subproject commit 4c6594f4231d85a6f689dbde255e1e7ab07172f4 diff --git a/plugins/obs-outputs/ftl-stream.c b/plugins/obs-outputs/ftl-stream.c index b293c929251b8b..ef5bff856681b9 100755 --- a/plugins/obs-outputs/ftl-stream.c +++ b/plugins/obs-outputs/ftl-stream.c @@ -383,7 +383,7 @@ static void set_peak_bitrate(struct ftl_stream *stream) { int speedtest_kbps = 10000; int speedtest_duration = 1000; - printf("Running speed test: sending %d kbps for %d ms", speedtest_kbps, speedtest_duration); + warn("Running speed test: sending %d kbps for %d ms", speedtest_kbps, speedtest_duration); float packetloss_rate = 0; packetloss_rate = ftl_ingest_speed_test(&stream->ftl_handle, speedtest_kbps, speedtest_duration); @@ -394,7 +394,7 @@ static void set_peak_bitrate(struct ftl_stream *stream) { stream->params.peak_kbps = (float)speedtest_kbps * (100.f - packetloss_rate) / 110; } - printf("Running speed test complete: packet loss rate was %3.2f, setting peak bitrate to %d\n", packetloss_rate, stream->params.peak_kbps); + warn("Running speed test complete: packet loss rate was %3.2f, setting peak bitrate to %d\n", packetloss_rate, stream->params.peak_kbps); ftl_ingest_update_params(&stream->ftl_handle, &stream->params); } @@ -408,8 +408,6 @@ static void *send_thread(void *data) os_set_thread_name("ftl-stream: send_thread"); - set_peak_bitrate(stream); - while (os_sem_wait(stream->send_sem) == 0) { struct encoder_packet packet; @@ -673,6 +671,8 @@ static int try_connect(struct ftl_stream *stream) info("Connection to %s successful", stream->path.array); + set_peak_bitrate(stream); + pthread_create(&stream->status_thread, NULL, status_thread, stream); return init_send(stream); @@ -1049,9 +1049,9 @@ static bool init_connect(struct ftl_stream *stream) stream->params.ingest_hostname = stream->path.array; stream->params.vendor_name = "OBS Studio"; stream->params.vendor_version = version.array; - stream->params.fps_num = fps_num; - stream->params.fps_den = fps_den; - stream->params.peak_kbps = peak_bitrate; + stream->params.fps_num = 0; //not required when using ftl_ingest_send_media_dts + stream->params.fps_den = 0; // not required when using ftl_ingest_send_media_dts + stream->params.peak_kbps = 0; blog(LOG_ERROR, "H.264 opts %s\n", obs_data_get_string(video_settings, "x264opts")); From 0edaebe192839083528c856bd0d9e1bcab7a8006 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Fri, 28 Oct 2016 21:16:04 +0200 Subject: [PATCH 45/80] obs-transitions: Avoid branching in slide_transition.effect Branching is not recommended in shaders and only recently gained widespread support without causing massive branch misprediction issues. Also sampling inside a branch will cause cache misses and additional texture load instructions. --- plugins/obs-transitions/data/slide_transition.effect | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/obs-transitions/data/slide_transition.effect b/plugins/obs-transitions/data/slide_transition.effect index 91a9b895267031..413212c17d14dd 100644 --- a/plugins/obs-transitions/data/slide_transition.effect +++ b/plugins/obs-transitions/data/slide_transition.effect @@ -28,11 +28,12 @@ float4 PSSlide(VertData v_in) : TARGET { float2 tex_a_uv = v_in.uv + tex_a_dir; float2 tex_b_uv = v_in.uv - tex_b_dir; - - return (tex_a_uv.x - saturate(tex_a_uv.x) != 0.0) || - (tex_a_uv.y - saturate(tex_a_uv.y) != 0.0) - ? tex_b.Sample(textureSampler, tex_b_uv) - : tex_a.Sample(textureSampler, tex_a_uv); + + float4 tex_a_sample = tex_a.Sample(textureSampler, tex_a_uv); + float4 tex_b_sample = tex_b.Sample(textureSampler, tex_b_uv); + + float val = saturate(abs((tex_a_uv.x - saturate(tex_a_uv.x)) + (tex_a_uv.y - saturate(tex_a_uv.y))) * 65535); + return lerp(tex_a_sample, tex_b_sample, val); } technique Slide From 40a543654926a5ee53936ff08c89772a11c91191 Mon Sep 17 00:00:00 2001 From: Warren Turkal Date: Sun, 30 Oct 2016 19:53:56 -0700 Subject: [PATCH 46/80] obs-ffmpeg: Fix a couple printf compiler warnings. --- plugins/obs-ffmpeg/obs-ffmpeg-aac.c | 2 +- plugins/obs-outputs/rtmp-stream.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-aac.c b/plugins/obs-ffmpeg/obs-ffmpeg-aac.c index 682668692a0841..f8989923ed33b8 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-aac.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-aac.c @@ -170,7 +170,7 @@ static void *aac_create(obs_data_t *settings, obs_encoder_t *encoder) enc->context->cutoff = cutoff; } - info("bitrate: %d, channels: %d", + info("bitrate: %" PRId64 ", channels: %d", enc->context->bit_rate / 1000, enc->context->channels); init_sizes(enc, audio); diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index 179bee53767def..b8d20ed658a9f5 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -892,7 +892,7 @@ static void check_to_drop_frames(struct rtmp_stream *stream, bool pframes) buffer_duration_usec = stream->last_dts_usec - first.dts_usec; if (buffer_duration_usec > drop_threshold) { - debug("buffer_duration_usec: %lld", buffer_duration_usec); + debug("buffer_duration_usec: %" PRId64, buffer_duration_usec); drop_frames(stream, name, priority, p_min_dts_usec); } } From fd496abc8d6fad4e47f9c6cdd6144b59a4f18eac Mon Sep 17 00:00:00 2001 From: sslivins Date: Mon, 31 Oct 2016 16:01:40 -0700 Subject: [PATCH 47/80] updated libftl submodule --- plugins/libftl/ftl-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/libftl/ftl-sdk b/plugins/libftl/ftl-sdk index 4c6594f4231d85..90640f7bc1aa79 160000 --- a/plugins/libftl/ftl-sdk +++ b/plugins/libftl/ftl-sdk @@ -1 +1 @@ -Subproject commit 4c6594f4231d85a6f689dbde255e1e7ab07172f4 +Subproject commit 90640f7bc1aa79c2553878aba74fef1f0aead6fd From 29eea269fc2ee45d40ab46c77ad0fcbc4ae43c54 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:39:24 -0700 Subject: [PATCH 48/80] libobs-d3d11: Store dxgi adapter used for device Keeping a reference is useful, and additionally allows pruning a bit of duplicated code in the dupicator object. --- libobs-d3d11/d3d11-duplicator.cpp | 13 +------------ libobs-d3d11/d3d11-subsystem.cpp | 12 +++++------- libobs-d3d11/d3d11-subsystem.hpp | 5 +++-- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/libobs-d3d11/d3d11-duplicator.cpp b/libobs-d3d11/d3d11-duplicator.cpp index 547522bb15bd78..d034788020f2a6 100644 --- a/libobs-d3d11/d3d11-duplicator.cpp +++ b/libobs-d3d11/d3d11-duplicator.cpp @@ -20,20 +20,9 @@ static inline bool get_monitor(gs_device_t *device, int monitor_idx, IDXGIOutput **dxgiOutput) { - ComPtr dxgiAdapter; - ComPtr dxgiDevice; HRESULT hr; - hr = device->device->QueryInterface(__uuidof(IDXGIDevice), - (void**)dxgiDevice.Assign()); - if (FAILED(hr)) - throw HRError("Failed to query IDXGIDevice", hr); - - hr = dxgiDevice->GetAdapter(dxgiAdapter.Assign()); - if (FAILED(hr)) - throw HRError("Failed to get adapter", hr); - - hr = dxgiAdapter->EnumOutputs(monitor_idx, dxgiOutput); + hr = device->adapter->EnumOutputs(monitor_idx, dxgiOutput); if (FAILED(hr)) { if (hr == DXGI_ERROR_NOT_FOUND) return false; diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 9e2e401afdc917..88419ea1c91bc9 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -171,7 +171,7 @@ void gs_device::InitCompiler() throw "Could not find any D3DCompiler libraries"; } -void gs_device::InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **padapter) +void gs_device::InitFactory(uint32_t adapterIdx) { HRESULT hr; IID factoryIID = (GetWinVer() >= 0x602) ? dxgiFactory2 : @@ -181,7 +181,7 @@ void gs_device::InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **padapter) if (FAILED(hr)) throw UnsupportedHWError("Failed to create DXGIFactory", hr); - hr = factory->EnumAdapters1(adapterIdx, padapter); + hr = factory->EnumAdapters1(adapterIdx, &adapter); if (FAILED(hr)) throw UnsupportedHWError("Failed to enumerate DXGIAdapter", hr); } @@ -194,7 +194,7 @@ const static D3D_FEATURE_LEVEL featureLevels[] = D3D_FEATURE_LEVEL_9_3, }; -void gs_device::InitDevice(uint32_t adapterIdx, IDXGIAdapter *adapter) +void gs_device::InitDevice(uint32_t adapterIdx) { wstring adapterName; DXGI_ADAPTER_DESC desc; @@ -423,8 +423,6 @@ void gs_device::UpdateViewProjMatrix() gs_device::gs_device(uint32_t adapterIdx) : curToplogy (D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) { - ComPtr adapter; - matrix4_identity(&curProjMatrix); matrix4_identity(&curViewMatrix); matrix4_identity(&curViewProjMatrix); @@ -437,8 +435,8 @@ gs_device::gs_device(uint32_t adapterIdx) } InitCompiler(); - InitFactory(adapterIdx, adapter.Assign()); - InitDevice(adapterIdx, adapter); + InitFactory(adapterIdx); + InitDevice(adapterIdx); device_set_render_target(this, NULL, NULL); } diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index d41350834f3d98..8f5a1b6f5b6032 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -613,6 +613,7 @@ struct mat4float { struct gs_device { ComPtr factory; + ComPtr adapter; ComPtr device; ComPtr context; @@ -652,8 +653,8 @@ struct gs_device { matrix4 curViewProjMatrix; void InitCompiler(); - void InitFactory(uint32_t adapterIdx, IDXGIAdapter1 **adapter); - void InitDevice(uint32_t adapterIdx, IDXGIAdapter *adapter); + void InitFactory(uint32_t adapterIdx); + void InitDevice(uint32_t adapterIdx); ID3D11DepthStencilState *AddZStencilState(); ID3D11RasterizerState *AddRasterState(); From 1ecb1550af78c3767494cc743d4bf9838b6bc627 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:45:08 -0700 Subject: [PATCH 49/80] libobs-d3d11: Store compiled shader data (for rebuilding) --- libobs-d3d11/d3d11-shader.cpp | 25 +++++++++++++++---------- libobs-d3d11/d3d11-subsystem.hpp | 4 ++++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/libobs-d3d11/d3d11-shader.cpp b/libobs-d3d11/d3d11-shader.cpp index 95cfbb07a8a950..74ca88093a1dfd 100644 --- a/libobs-d3d11/d3d11-shader.cpp +++ b/libobs-d3d11/d3d11-shader.cpp @@ -46,7 +46,6 @@ gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file, hasTangents (false), nTexUnits (0) { - vector inputs; ShaderProcessor processor(device); ComPtr shaderBlob; string outputString; @@ -55,20 +54,23 @@ gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file, processor.Process(shaderString, file); processor.BuildString(outputString); processor.BuildParams(params); - processor.BuildInputLayout(inputs); - GetBuffersExpected(inputs); + processor.BuildInputLayout(layoutData); + GetBuffersExpected(layoutData); BuildConstantBuffer(); Compile(outputString.c_str(), file, "vs_4_0", shaderBlob.Assign()); - hr = device->device->CreateVertexShader(shaderBlob->GetBufferPointer(), - shaderBlob->GetBufferSize(), NULL, shader.Assign()); + data.resize(shaderBlob->GetBufferSize()); + memcpy(&data[0], shaderBlob->GetBufferPointer(), data.size()); + + hr = device->device->CreateVertexShader(data.data(), data.size(), + NULL, shader.Assign()); if (FAILED(hr)) throw HRError("Failed to create vertex shader", hr); - hr = device->device->CreateInputLayout(inputs.data(), - (UINT)inputs.size(), shaderBlob->GetBufferPointer(), - shaderBlob->GetBufferSize(), layout.Assign()); + hr = device->device->CreateInputLayout(layoutData.data(), + (UINT)layoutData.size(), + data.data(), data.size(), layout.Assign()); if (FAILED(hr)) throw HRError("Failed to create input layout", hr); @@ -93,8 +95,11 @@ gs_pixel_shader::gs_pixel_shader(gs_device_t *device, const char *file, Compile(outputString.c_str(), file, "ps_4_0", shaderBlob.Assign()); - hr = device->device->CreatePixelShader(shaderBlob->GetBufferPointer(), - shaderBlob->GetBufferSize(), NULL, shader.Assign()); + data.resize(shaderBlob->GetBufferSize()); + memcpy(&data[0], shaderBlob->GetBufferPointer(), data.size()); + + hr = device->device->CreatePixelShader(data.data(), data.size(), + NULL, shader.Assign()); if (FAILED(hr)) throw HRError("Failed to create vertex shader", hr); } diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 8f5a1b6f5b6032..1ddb16b8ef42d3 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -387,6 +387,8 @@ struct gs_shader { ComPtr constants; size_t constantSize; + vector data; + inline void UpdateParam(vector &constData, gs_shader_param ¶m, bool &upload); void UploadParams(); @@ -423,6 +425,8 @@ struct gs_vertex_shader : gs_shader { gs_shader_param *world, *viewProj; + vector layoutData; + bool hasNormals; bool hasColors; bool hasTangents; From d4d0cd479d0a19bac74f8e731e09823bb0c5b68e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:48:33 -0700 Subject: [PATCH 50/80] libobs-d3d11: Correct error message for pixel shaders --- libobs-d3d11/d3d11-shader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs-d3d11/d3d11-shader.cpp b/libobs-d3d11/d3d11-shader.cpp index 74ca88093a1dfd..183bfa688e0e60 100644 --- a/libobs-d3d11/d3d11-shader.cpp +++ b/libobs-d3d11/d3d11-shader.cpp @@ -101,7 +101,7 @@ gs_pixel_shader::gs_pixel_shader(gs_device_t *device, const char *file, hr = device->device->CreatePixelShader(data.data(), data.size(), NULL, shader.Assign()); if (FAILED(hr)) - throw HRError("Failed to create vertex shader", hr); + throw HRError("Failed to create pixel shader", hr); } /* From 7321cc38e86b0d06256aed2473232404ff2cf530 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:51:16 -0700 Subject: [PATCH 51/80] libobs-d3d11: Store shader samplers as pointers This allows having them be a part of a linked list later. --- libobs-d3d11/d3d11-shaderprocessor.cpp | 6 +++--- libobs-d3d11/d3d11-shaderprocessor.hpp | 2 +- libobs-d3d11/d3d11-subsystem.hpp | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libobs-d3d11/d3d11-shaderprocessor.cpp b/libobs-d3d11/d3d11-shaderprocessor.cpp index 9bee6871628fbd..7b0b14db4ff03c 100644 --- a/libobs-d3d11/d3d11-shaderprocessor.cpp +++ b/libobs-d3d11/d3d11-shaderprocessor.cpp @@ -181,14 +181,14 @@ void ShaderProcessor::BuildParams(vector ¶ms) } static inline void AddSampler(gs_device_t *device, shader_sampler &sampler, - vector &samplers) + vector> &samplers) { gs_sampler_info si; shader_sampler_convert(&sampler, &si); - samplers.push_back(ShaderSampler(sampler.name, device, &si)); + samplers.emplace_back(new ShaderSampler(sampler.name, device, &si)); } -void ShaderProcessor::BuildSamplers(vector &samplers) +void ShaderProcessor::BuildSamplers(vector> &samplers) { for (size_t i = 0; i < parser.samplers.num; i++) AddSampler(device, parser.samplers.array[i], samplers); diff --git a/libobs-d3d11/d3d11-shaderprocessor.hpp b/libobs-d3d11/d3d11-shaderprocessor.hpp index c432d57c2fcd1d..afc939cce11c05 100644 --- a/libobs-d3d11/d3d11-shaderprocessor.hpp +++ b/libobs-d3d11/d3d11-shaderprocessor.hpp @@ -30,7 +30,7 @@ struct ShaderProcessor { void BuildInputLayout(vector &inputs); void BuildParams(vector ¶ms); - void BuildSamplers(vector &samplers); + void BuildSamplers(vector> &samplers); void BuildString(string &outputString); void Process(const char *shader_string, const char *file); diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 1ddb16b8ef42d3..39aff5df2ba3cd 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -459,13 +460,13 @@ struct gs_duplicator { struct gs_pixel_shader : gs_shader { ComPtr shader; - vector samplers; + vector> samplers; inline void GetSamplerStates(ID3D11SamplerState **states) { size_t i; for (i = 0; i < samplers.size(); i++) - states[i] = samplers[i].sampler.state; + states[i] = samplers[i]->sampler.state; for (; i < GS_MAX_TEXTURES; i++) states[i] = NULL; } From 66bdf43e449193c367db78495707cf41d13c759d Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:55:44 -0700 Subject: [PATCH 52/80] libobs-d3d11: Correct error message for staging surfaces --- libobs-d3d11/d3d11-stagesurf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs-d3d11/d3d11-stagesurf.cpp b/libobs-d3d11/d3d11-stagesurf.cpp index dfe702b3d5de9d..5b754553d6ddec 100644 --- a/libobs-d3d11/d3d11-stagesurf.cpp +++ b/libobs-d3d11/d3d11-stagesurf.cpp @@ -40,5 +40,5 @@ gs_stage_surface::gs_stage_surface(gs_device_t *device, uint32_t width, hr = device->device->CreateTexture2D(&td, NULL, texture.Assign()); if (FAILED(hr)) - throw HRError("Failed to create 2D texture", hr); + throw HRError("Failed to create staging surface", hr); } From 75cd6b4ab409c9244b4d7a565d3cc818cdff741e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:56:49 -0700 Subject: [PATCH 53/80] libobs-d3d11: Correct error message creating blend states --- libobs-d3d11/d3d11-subsystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 88419ea1c91bc9..048d3fd5ce635c 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -315,7 +315,7 @@ ID3D11BlendState *gs_device::AddBlendState() hr = device->CreateBlendState(&bd, savedState.state.Assign()); if (FAILED(hr)) - throw HRError("Failed to create disabled blend state", hr); + throw HRError("Failed to create blend state", hr); state = savedState.state; blendStates.push_back(savedState); From a5ed61e02e481de9ab65a3ae3c450c90bcccd73a Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 06:59:56 -0700 Subject: [PATCH 54/80] libobs-d3d11: Store index and add "Start" function This allows restarting the duplicator at a later point in time. --- libobs-d3d11/d3d11-duplicator.cpp | 11 ++++++++--- libobs-d3d11/d3d11-subsystem.hpp | 3 +++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/libobs-d3d11/d3d11-duplicator.cpp b/libobs-d3d11/d3d11-duplicator.cpp index d034788020f2a6..62c85dedf66d0f 100644 --- a/libobs-d3d11/d3d11-duplicator.cpp +++ b/libobs-d3d11/d3d11-duplicator.cpp @@ -33,14 +33,13 @@ static inline bool get_monitor(gs_device_t *device, int monitor_idx, return true; } -gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx) - : texture(nullptr), device(device_) +void gs_duplicator::Start() { ComPtr output1; ComPtr output; HRESULT hr; - if (!get_monitor(device, monitor_idx, output.Assign())) + if (!get_monitor(device, idx, output.Assign())) throw "Invalid monitor index"; hr = output->QueryInterface(__uuidof(IDXGIOutput1), @@ -53,6 +52,12 @@ gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx) throw HRError("Failed to duplicate output", hr); } +gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx) + : texture(nullptr), device(device_), idx(monitor_idx) +{ + Start(); +} + gs_duplicator::~gs_duplicator() { delete texture; diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 39aff5df2ba3cd..ac190d273e3e77 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -453,6 +453,9 @@ struct gs_duplicator { ComPtr duplicator; gs_texture_2d *texture; gs_device_t *device; + int idx; + + void Start(); gs_duplicator(gs_device_t *device, int monitor_idx); ~gs_duplicator(); From bc0faf9a3cee317173849523c132800d13790243 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:03:02 -0700 Subject: [PATCH 55/80] libobs-d3d11: Clear device state before unloading Unloads all device data and clears all device references. Probably not necessary, but it's unknown how D3D11 handles this internally so probably best to be safe. --- libobs-d3d11/d3d11-subsystem.cpp | 5 +++++ libobs-d3d11/d3d11-subsystem.hpp | 1 + 2 files changed, 6 insertions(+) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 048d3fd5ce635c..c3b936c6fd371a 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -440,6 +440,11 @@ gs_device::gs_device(uint32_t adapterIdx) device_set_render_target(this, NULL, NULL); } +gs_device::~gs_device() +{ + context->ClearState(); +} + const char *device_get_name(void) { return "Direct3D 11"; diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index ac190d273e3e77..df62d6370cb541 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -679,4 +679,5 @@ struct gs_device { void UpdateViewProjMatrix(); gs_device(uint32_t adapterIdx); + ~gs_device(); }; From 6d18ae39c517ed7c9364cd4662c06b47bf38e611 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:09:13 -0700 Subject: [PATCH 56/80] libobs-d3d11: Store swap initialization data (for rebuilding) --- libobs-d3d11/d3d11-subsystem.cpp | 22 +++++++++++++--------- libobs-d3d11/d3d11-subsystem.hpp | 3 ++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index c3b936c6fd371a..7f2589aba9981d 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -101,6 +101,9 @@ void gs_swap_chain::Resize(uint32_t cx, uint32_t cy) zs.texture.Clear(); zs.view.Clear(); + initData.cx = cx; + initData.cy = cy; + if (cx == 0 || cy == 0) { GetClientRect(hwnd, &clientRect); if (cx == 0) cx = clientRect.right; @@ -115,24 +118,25 @@ void gs_swap_chain::Resize(uint32_t cx, uint32_t cy) InitZStencilBuffer(cx, cy); } -void gs_swap_chain::Init(const gs_init_data *data) +void gs_swap_chain::Init() { target.device = device; target.isRenderTarget = true; - target.format = data->format; - target.dxgiFormat = ConvertGSTextureFormat(data->format); - InitTarget(data->cx, data->cy); + target.format = initData.format; + target.dxgiFormat = ConvertGSTextureFormat(initData.format); + InitTarget(initData.cx, initData.cy); zs.device = device; - zs.format = data->zsformat; - zs.dxgiFormat = ConvertGSZStencilFormat(data->zsformat); - InitZStencilBuffer(data->cx, data->cy); + zs.format = initData.zsformat; + zs.dxgiFormat = ConvertGSZStencilFormat(initData.zsformat); + InitZStencilBuffer(initData.cx, initData.cy); } gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data) : device (device), numBuffers (data->num_backbuffers), - hwnd ((HWND)data->window.hwnd) + hwnd ((HWND)data->window.hwnd), + initData (*data) { HRESULT hr; DXGI_SWAP_CHAIN_DESC swapDesc; @@ -143,7 +147,7 @@ gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data) if (FAILED(hr)) throw HRError("Failed to create swap chain", hr); - Init(data); + Init(); } void gs_device::InitCompiler() diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index df62d6370cb541..504c73f086c9cd 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -482,6 +482,7 @@ struct gs_swap_chain { gs_device *device; uint32_t numBuffers; HWND hwnd; + gs_init_data initData; gs_texture_2d target; gs_zstencil_buffer zs; @@ -490,7 +491,7 @@ struct gs_swap_chain { void InitTarget(uint32_t cx, uint32_t cy); void InitZStencilBuffer(uint32_t cx, uint32_t cy); void Resize(uint32_t cx, uint32_t cy); - void Init(const gs_init_data *data); + void Init(); inline gs_swap_chain() : device (NULL), From e4900751c33312a5e71df8d0a2f875db37288cb9 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:10:58 -0700 Subject: [PATCH 57/80] libobs-d3d11: Store device adapter index (for rebuilding) --- libobs-d3d11/d3d11-subsystem.cpp | 2 ++ libobs-d3d11/d3d11-subsystem.hpp | 1 + 2 files changed, 3 insertions(+) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 7f2589aba9981d..7bdd0eb06ef7d6 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -205,6 +205,8 @@ void gs_device::InitDevice(uint32_t adapterIdx) D3D_FEATURE_LEVEL levelUsed = D3D_FEATURE_LEVEL_9_3; HRESULT hr = 0; + adpIdx = adapterIdx; + uint32_t createFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #ifdef _DEBUG //createFlags |= D3D11_CREATE_DEVICE_DEBUG; diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 504c73f086c9cd..0781582321530a 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -625,6 +625,7 @@ struct gs_device { ComPtr adapter; ComPtr device; ComPtr context; + uint32_t adpIdx = 0; gs_texture_2d *curRenderTarget = nullptr; gs_zstencil_buffer *curZStencilBuffer = nullptr; From 61042e2bc4f0b97e666e83c5223dc824704f1664 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:14:33 -0700 Subject: [PATCH 58/80] libobs-d3d11: Store static textures in RAM (for rebuilding) --- libobs-d3d11/d3d11-subsystem.hpp | 5 ++++- libobs-d3d11/d3d11-texture2d.cpp | 36 ++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 0781582321530a..44765d0cbda8e9 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -291,10 +291,13 @@ struct gs_texture_2d : gs_texture { bool genMipmaps = false; uint32_t sharedHandle = 0; - void InitSRD(vector &srd, const uint8_t **data); + vector> data; + + void InitSRD(vector &srd); void InitTexture(const uint8_t **data); void InitResourceView(); void InitRenderTargets(); + void BackupTexture(const uint8_t **data); inline gs_texture_2d() : gs_texture (NULL, GS_TEXTURE_2D, 0, GS_UNKNOWN) diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index 7e151afc9638f2..d99d9ba34ff55b 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -18,13 +18,13 @@ #include #include "d3d11-subsystem.hpp" -void gs_texture_2d::InitSRD(vector &srd, - const uint8_t **data) +void gs_texture_2d::InitSRD(vector &srd) { uint32_t rowSizeBytes = width * gs_get_format_bpp(format); uint32_t texSizeBytes = height * rowSizeBytes / 8; size_t textures = type == GS_TEXTURE_2D ? 1 : 6; uint32_t actual_levels = levels; + size_t curTex = 0; if (!actual_levels) actual_levels = gs_get_total_levels(width, height); @@ -37,18 +37,40 @@ void gs_texture_2d::InitSRD(vector &srd, for (uint32_t j = 0; j < actual_levels; j++) { D3D11_SUBRESOURCE_DATA newSRD; - newSRD.pSysMem = *data; + newSRD.pSysMem = data[curTex++].data(); newSRD.SysMemPitch = newRowSize; newSRD.SysMemSlicePitch = newTexSize; srd.push_back(newSRD); newRowSize /= 2; newTexSize /= 4; - data++; } } } +void gs_texture_2d::BackupTexture(const uint8_t **data) +{ + this->data.resize(levels); + + uint32_t w = width; + uint32_t h = height; + uint32_t bbp = gs_get_format_bpp(format); + + for (uint32_t i = 0; i < levels; i++) { + if (!data[i]) + break; + + uint32_t texSize = bbp * w * h / 8; + this->data[i].resize(texSize); + + vector &subData = this->data[i]; + memcpy(&subData[0], data[i], texSize); + + w /= 2; + h /= 2; + } +} + void gs_texture_2d::InitTexture(const uint8_t **data) { vector srd; @@ -76,8 +98,10 @@ void gs_texture_2d::InitTexture(const uint8_t **data) if (isGDICompatible) td.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE; - if (data) - InitSRD(srd, data); + if (data) { + BackupTexture(data); + InitSRD(srd); + } hr = device->device->CreateTexture2D(&td, data ? srd.data() : NULL, texture.Assign()); From bab77c2afd08755f3066642c8d614d344baf8d49 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:23:19 -0700 Subject: [PATCH 59/80] libobs-d3d11: Store static vertex buffer data (for rebuilding) Instead of letting vertex buffer data be freed immediately, store it so it can be used for rebuilding later. Also, separate the buffer building to a function. --- libobs-d3d11/d3d11-subsystem.hpp | 4 +- libobs-d3d11/d3d11-vertexbuffer.cpp | 60 +++++++++++++++-------------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 44765d0cbda8e9..041fc9d99d9332 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -224,10 +224,12 @@ struct gs_vertex_buffer { vector &buffers, vector &strides); - inline void InitBuffer(const size_t elementSize, + void InitBuffer(const size_t elementSize, const size_t numVerts, void *array, ID3D11Buffer **buffer); + void BuildBuffers(); + gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags); }; diff --git a/libobs-d3d11/d3d11-vertexbuffer.cpp b/libobs-d3d11/d3d11-vertexbuffer.cpp index 4d15a88e0d1378..dfdcac68352cf3 100644 --- a/libobs-d3d11/d3d11-vertexbuffer.cpp +++ b/libobs-d3d11/d3d11-vertexbuffer.cpp @@ -72,7 +72,7 @@ void gs_vertex_buffer::MakeBufferList(gs_vertex_shader *shader, } } -inline void gs_vertex_buffer::InitBuffer(const size_t elementSize, +void gs_vertex_buffer::InitBuffer(const size_t elementSize, const size_t numVerts, void *array, ID3D11Buffer **buffer) { D3D11_BUFFER_DESC bd; @@ -93,35 +93,25 @@ inline void gs_vertex_buffer::InitBuffer(const size_t elementSize, throw HRError("Failed to create buffer", hr); } -gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, - uint32_t flags) - : device (device), - dynamic ((flags & GS_DYNAMIC) != 0), - vbd (data), - numVerts (data->num) +void gs_vertex_buffer::BuildBuffers() { - if (!data->num) - throw "Cannot initialize vertex buffer with 0 vertices"; - if (!data->points) - throw "No points specified for vertex buffer"; - - InitBuffer(sizeof(vec3), data->num, data->points, - vertexBuffer.Assign()); + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->points, + &vertexBuffer); - if (data->normals) - InitBuffer(sizeof(vec3), data->num, data->normals, - normalBuffer.Assign()); + if (vbd.data->normals) + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->normals, + &normalBuffer); - if (data->tangents) - InitBuffer(sizeof(vec3), data->num, data->tangents, - tangentBuffer.Assign()); + if (vbd.data->tangents) + InitBuffer(sizeof(vec3), vbd.data->num, vbd.data->tangents, + &tangentBuffer); - if (data->colors) - InitBuffer(sizeof(uint32_t), data->num, data->colors, - colorBuffer.Assign()); + if (vbd.data->colors) + InitBuffer(sizeof(uint32_t), vbd.data->num, vbd.data->colors, + &colorBuffer); - for (size_t i = 0; i < data->num_tex; i++) { - struct gs_tvertarray *tverts = data->tvarray+i; + for (size_t i = 0; i < vbd.data->num_tex; i++) { + struct gs_tvertarray *tverts = vbd.data->tvarray+i; if (tverts->width != 2 && tverts->width != 4) throw "Invalid texture vertex size specified"; @@ -129,13 +119,25 @@ gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, throw "No texture vertices specified"; ComPtr buffer; - InitBuffer(tverts->width * sizeof(float), data->num, - tverts->array, buffer.Assign()); + InitBuffer(tverts->width * sizeof(float), vbd.data->num, + tverts->array, &buffer); uvBuffers.push_back(buffer); uvSizes.push_back(tverts->width * sizeof(float)); } +} + +gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, + uint32_t flags) + : device (device), + dynamic ((flags & GS_DYNAMIC) != 0), + vbd (data), + numVerts (data->num) +{ + if (!data->num) + throw "Cannot initialize vertex buffer with 0 vertices"; + if (!data->points) + throw "No points specified for vertex buffer"; - if (!dynamic) - vbd.Clear(); + BuildBuffers(); } From ecd5b4ee8108297d2a3865b8695e99fbcf469d68 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:30:22 -0700 Subject: [PATCH 60/80] libobs-d3d11: Save all D3D11 object descriptors (for rebuilding) --- libobs-d3d11/d3d11-indexbuffer.cpp | 2 -- libobs-d3d11/d3d11-samplerstate.cpp | 1 - libobs-d3d11/d3d11-shader.cpp | 4 ++-- libobs-d3d11/d3d11-stagesurf.cpp | 1 - libobs-d3d11/d3d11-subsystem.cpp | 7 +++--- libobs-d3d11/d3d11-subsystem.hpp | 31 ++++++++++++++++++++++----- libobs-d3d11/d3d11-texture2d.cpp | 18 ++++++---------- libobs-d3d11/d3d11-zstencilbuffer.cpp | 2 -- 8 files changed, 38 insertions(+), 28 deletions(-) diff --git a/libobs-d3d11/d3d11-indexbuffer.cpp b/libobs-d3d11/d3d11-indexbuffer.cpp index ccb92a8a8cbae1..f5d4c754a8fddf 100644 --- a/libobs-d3d11/d3d11-indexbuffer.cpp +++ b/libobs-d3d11/d3d11-indexbuffer.cpp @@ -19,8 +19,6 @@ void gs_index_buffer::InitBuffer() { - D3D11_BUFFER_DESC bd; - D3D11_SUBRESOURCE_DATA srd; HRESULT hr; memset(&bd, 0, sizeof(bd)); diff --git a/libobs-d3d11/d3d11-samplerstate.cpp b/libobs-d3d11/d3d11-samplerstate.cpp index 9e5b2fc471467d..989ea955bdc3ab 100644 --- a/libobs-d3d11/d3d11-samplerstate.cpp +++ b/libobs-d3d11/d3d11-samplerstate.cpp @@ -65,7 +65,6 @@ gs_sampler_state::gs_sampler_state(gs_device_t *device, : device (device), info (*info) { - D3D11_SAMPLER_DESC sd; HRESULT hr; vec4 v4; diff --git a/libobs-d3d11/d3d11-shader.cpp b/libobs-d3d11/d3d11-shader.cpp index 183bfa688e0e60..1aade440d6d7a4 100644 --- a/libobs-d3d11/d3d11-shader.cpp +++ b/libobs-d3d11/d3d11-shader.cpp @@ -162,11 +162,11 @@ void gs_shader::BuildConstantBuffer() constantSize += size; } + memset(&bd, 0, sizeof(bd)); + if (constantSize) { - D3D11_BUFFER_DESC bd; HRESULT hr; - memset(&bd, 0, sizeof(bd)); bd.ByteWidth = (constantSize+15)&0xFFFFFFF0; /* align */ bd.Usage = D3D11_USAGE_DYNAMIC; bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; diff --git a/libobs-d3d11/d3d11-stagesurf.cpp b/libobs-d3d11/d3d11-stagesurf.cpp index 5b754553d6ddec..aae20a85250e9d 100644 --- a/libobs-d3d11/d3d11-stagesurf.cpp +++ b/libobs-d3d11/d3d11-stagesurf.cpp @@ -25,7 +25,6 @@ gs_stage_surface::gs_stage_surface(gs_device_t *device, uint32_t width, format (colorFormat), dxgiFormat (ConvertGSTextureFormat(colorFormat)) { - D3D11_TEXTURE2D_DESC td; HRESULT hr; memset(&td, 0, sizeof(td)); diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 7bdd0eb06ef7d6..c3821ae27ba085 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -139,7 +139,6 @@ gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data) initData (*data) { HRESULT hr; - DXGI_SWAP_CHAIN_DESC swapDesc; make_swap_desc(swapDesc, data); hr = device->factory->CreateSwapChain(device->device, &swapDesc, @@ -246,7 +245,6 @@ ID3D11DepthStencilState *gs_device::AddZStencilState() { HRESULT hr; D3D11_DEPTH_STENCIL_DESC dsd; - SavedZStencilState savedState(zstencilState); ID3D11DepthStencilState *state; dsd.DepthEnable = zstencilState.depthEnabled; @@ -260,6 +258,7 @@ ID3D11DepthStencilState *gs_device::AddZStencilState() ConvertStencilSide(dsd.FrontFace, zstencilState.stencilFront); ConvertStencilSide(dsd.BackFace, zstencilState.stencilBack); + SavedZStencilState savedState(zstencilState, dsd); hr = device->CreateDepthStencilState(&dsd, savedState.state.Assign()); if (FAILED(hr)) throw HRError("Failed to create depth stencil state", hr); @@ -274,7 +273,6 @@ ID3D11RasterizerState *gs_device::AddRasterState() { HRESULT hr; D3D11_RASTERIZER_DESC rd; - SavedRasterState savedState(rasterState); ID3D11RasterizerState *state; memset(&rd, 0, sizeof(rd)); @@ -285,6 +283,7 @@ ID3D11RasterizerState *gs_device::AddRasterState() rd.DepthClipEnable = true; rd.ScissorEnable = rasterState.scissorEnabled; + SavedRasterState savedState(rasterState, rd); hr = device->CreateRasterizerState(&rd, savedState.state.Assign()); if (FAILED(hr)) throw HRError("Failed to create rasterizer state", hr); @@ -299,7 +298,6 @@ ID3D11BlendState *gs_device::AddBlendState() { HRESULT hr; D3D11_BLEND_DESC bd; - SavedBlendState savedState(blendState); ID3D11BlendState *state; memset(&bd, 0, sizeof(bd)); @@ -319,6 +317,7 @@ ID3D11BlendState *gs_device::AddBlendState() D3D11_COLOR_WRITE_ENABLE_ALL; } + SavedBlendState savedState(blendState, bd); hr = device->CreateBlendState(&bd, savedState.state.Assign()); if (FAILED(hr)) throw HRError("Failed to create blend state", hr); diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 041fc9d99d9332..48e34157bb4b35 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -251,6 +251,9 @@ struct gs_index_buffer { size_t num; DataPtr indices; + D3D11_BUFFER_DESC bd = {}; + D3D11_SUBRESOURCE_DATA srd = {}; + void InitBuffer(); gs_index_buffer(gs_device_t *device, enum gs_index_type type, @@ -264,6 +267,7 @@ struct gs_texture { gs_color_format format; ComPtr shaderRes; + D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesc = {}; inline gs_texture() {} @@ -294,6 +298,8 @@ struct gs_texture_2d : gs_texture { uint32_t sharedHandle = 0; vector> data; + vector srd; + D3D11_TEXTURE2D_DESC td = {}; void InitSRD(vector &srd); void InitTexture(const uint8_t **data); @@ -323,6 +329,9 @@ struct gs_zstencil_buffer { gs_zstencil_format format; DXGI_FORMAT dxgiFormat; + D3D11_TEXTURE2D_DESC td = {}; + D3D11_DEPTH_STENCIL_VIEW_DESC dsvd = {}; + void InitBuffer(); inline gs_zstencil_buffer() @@ -339,6 +348,7 @@ struct gs_zstencil_buffer { struct gs_stage_surface { ComPtr texture; + D3D11_TEXTURE2D_DESC td = {}; gs_device *device; uint32_t width, height; @@ -352,6 +362,7 @@ struct gs_stage_surface { struct gs_sampler_state { ComPtr state; gs_device_t *device; + D3D11_SAMPLER_DESC sd = {}; gs_sampler_info info; gs_sampler_state(gs_device_t *device, const gs_sampler_info *info); @@ -393,6 +404,7 @@ struct gs_shader { ComPtr constants; size_t constantSize; + D3D11_BUFFER_DESC bd = {}; vector data; inline void UpdateParam(vector &constData, @@ -488,6 +500,7 @@ struct gs_swap_chain { uint32_t numBuffers; HWND hwnd; gs_init_data initData; + DXGI_SWAP_CHAIN_DESC swapDesc = {}; gs_texture_2d target; gs_zstencil_buffer zs; @@ -541,8 +554,10 @@ struct BlendState { struct SavedBlendState : BlendState { ComPtr state; + D3D11_BLEND_DESC bd; - inline SavedBlendState(const BlendState &val) : BlendState(val) + inline SavedBlendState(const BlendState &val, D3D11_BLEND_DESC &desc) + : BlendState(val), bd(desc) { } }; @@ -589,9 +604,12 @@ struct ZStencilState { struct SavedZStencilState : ZStencilState { ComPtr state; + D3D11_DEPTH_STENCIL_DESC dsd; - inline SavedZStencilState(const ZStencilState &val) - : ZStencilState (val) + inline SavedZStencilState(const ZStencilState &val, + D3D11_DEPTH_STENCIL_DESC desc) + : ZStencilState (val), + dsd (desc) { } }; @@ -614,9 +632,12 @@ struct RasterState { struct SavedRasterState : RasterState { ComPtr state; + D3D11_RASTERIZER_DESC rd; - inline SavedRasterState(const RasterState &val) - : RasterState (val) + inline SavedRasterState(const RasterState &val, + D3D11_RASTERIZER_DESC &desc) + : RasterState (val), + rd (desc) { } }; diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index d99d9ba34ff55b..4562ac2f9ebce3 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -73,8 +73,6 @@ void gs_texture_2d::BackupTexture(const uint8_t **data) void gs_texture_2d::InitTexture(const uint8_t **data) { - vector srd; - D3D11_TEXTURE2D_DESC td; HRESULT hr; memset(&td, 0, sizeof(td)); @@ -118,7 +116,6 @@ void gs_texture_2d::InitTexture(const uint8_t **data) void gs_texture_2d::InitResourceView() { - D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesc; HRESULT hr; memset(&resourceDesc, 0, sizeof(resourceDesc)); @@ -196,20 +193,19 @@ gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t handle) if (FAILED(hr)) throw HRError("Failed to open resource", hr); - D3D11_TEXTURE2D_DESC desc; - texture->GetDesc(&desc); + texture->GetDesc(&td); this->type = GS_TEXTURE_2D; - this->format = ConvertDXGITextureFormat(desc.Format); + this->format = ConvertDXGITextureFormat(td.Format); this->levels = 1; this->device = device; - this->width = desc.Width; - this->height = desc.Height; - this->dxgiFormat = desc.Format; + this->width = td.Width; + this->height = td.Height; + this->dxgiFormat = td.Format; - D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesc = {}; - resourceDesc.Format = desc.Format; + memset(&resourceDesc, 0, sizeof(resourceDesc)); + resourceDesc.Format = td.Format; resourceDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; resourceDesc.Texture2D.MipLevels = 1; diff --git a/libobs-d3d11/d3d11-zstencilbuffer.cpp b/libobs-d3d11/d3d11-zstencilbuffer.cpp index 5b2732d581e1eb..48599a4140f0a6 100644 --- a/libobs-d3d11/d3d11-zstencilbuffer.cpp +++ b/libobs-d3d11/d3d11-zstencilbuffer.cpp @@ -19,8 +19,6 @@ void gs_zstencil_buffer::InitBuffer() { - D3D11_TEXTURE2D_DESC td; - D3D11_DEPTH_STENCIL_VIEW_DESC dsvd; HRESULT hr; memset(&td, 0, sizeof(td)); From 5c71f79d5f53d06238770e243bf6f790a33b5a75 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:32:09 -0700 Subject: [PATCH 61/80] libobs-d3d11: Make shared texture error message less vague --- libobs-d3d11/d3d11-texture2d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index 4562ac2f9ebce3..b4c35613d20e33 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -191,7 +191,7 @@ gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t handle) hr = device->device->OpenSharedResource((HANDLE)(uintptr_t)handle, __uuidof(ID3D11Texture2D), (void**)texture.Assign()); if (FAILED(hr)) - throw HRError("Failed to open resource", hr); + throw HRError("Failed to open shared 2D texture", hr); texture->GetDesc(&td); From 951c6892b0c3ea35eb76e9529c099f3c6b7bb99a Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:37:05 -0700 Subject: [PATCH 62/80] libobs-d3d11: Use linked list for all objects (for rebuilding) --- libobs-d3d11/d3d11-duplicator.cpp | 4 +- libobs-d3d11/d3d11-indexbuffer.cpp | 2 +- libobs-d3d11/d3d11-samplerstate.cpp | 2 +- libobs-d3d11/d3d11-shader.cpp | 4 +- libobs-d3d11/d3d11-stagesurf.cpp | 2 +- libobs-d3d11/d3d11-subsystem.cpp | 22 +++++- libobs-d3d11/d3d11-subsystem.hpp | 99 +++++++++++++++++---------- libobs-d3d11/d3d11-texture2d.cpp | 7 +- libobs-d3d11/d3d11-vertexbuffer.cpp | 2 +- libobs-d3d11/d3d11-zstencilbuffer.cpp | 2 +- 10 files changed, 99 insertions(+), 47 deletions(-) diff --git a/libobs-d3d11/d3d11-duplicator.cpp b/libobs-d3d11/d3d11-duplicator.cpp index 62c85dedf66d0f..5970b4ae6721bc 100644 --- a/libobs-d3d11/d3d11-duplicator.cpp +++ b/libobs-d3d11/d3d11-duplicator.cpp @@ -53,7 +53,9 @@ void gs_duplicator::Start() } gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx) - : texture(nullptr), device(device_), idx(monitor_idx) + : gs_obj (device_, gs_type::gs_duplicator), + texture (nullptr), + idx (monitor_idx) { Start(); } diff --git a/libobs-d3d11/d3d11-indexbuffer.cpp b/libobs-d3d11/d3d11-indexbuffer.cpp index f5d4c754a8fddf..d95139acd489a9 100644 --- a/libobs-d3d11/d3d11-indexbuffer.cpp +++ b/libobs-d3d11/d3d11-indexbuffer.cpp @@ -37,7 +37,7 @@ void gs_index_buffer::InitBuffer() gs_index_buffer::gs_index_buffer(gs_device_t *device, enum gs_index_type type, void *indices, size_t num, uint32_t flags) - : device (device), + : gs_obj (device, gs_type::gs_index_buffer), dynamic ((flags & GS_DYNAMIC) != 0), type (type), num (num), diff --git a/libobs-d3d11/d3d11-samplerstate.cpp b/libobs-d3d11/d3d11-samplerstate.cpp index 989ea955bdc3ab..67b4005205324c 100644 --- a/libobs-d3d11/d3d11-samplerstate.cpp +++ b/libobs-d3d11/d3d11-samplerstate.cpp @@ -62,7 +62,7 @@ static inline D3D11_FILTER ConvertGSFilter( gs_sample_filter filter) gs_sampler_state::gs_sampler_state(gs_device_t *device, const gs_sampler_info *info) - : device (device), + : gs_obj (device, gs_type::gs_sampler_state), info (*info) { HRESULT hr; diff --git a/libobs-d3d11/d3d11-shader.cpp b/libobs-d3d11/d3d11-shader.cpp index 1aade440d6d7a4..4e1d1536507703 100644 --- a/libobs-d3d11/d3d11-shader.cpp +++ b/libobs-d3d11/d3d11-shader.cpp @@ -40,7 +40,7 @@ void gs_vertex_shader::GetBuffersExpected( gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file, const char *shaderString) - : gs_shader (device, GS_SHADER_VERTEX), + : gs_shader (device, gs_type::gs_vertex_shader, GS_SHADER_VERTEX), hasNormals (false), hasColors (false), hasTangents (false), @@ -80,7 +80,7 @@ gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file, gs_pixel_shader::gs_pixel_shader(gs_device_t *device, const char *file, const char *shaderString) - : gs_shader(device, GS_SHADER_PIXEL) + : gs_shader(device, gs_type::gs_pixel_shader, GS_SHADER_PIXEL) { ShaderProcessor processor(device); ComPtr shaderBlob; diff --git a/libobs-d3d11/d3d11-stagesurf.cpp b/libobs-d3d11/d3d11-stagesurf.cpp index aae20a85250e9d..c08b4620f020d0 100644 --- a/libobs-d3d11/d3d11-stagesurf.cpp +++ b/libobs-d3d11/d3d11-stagesurf.cpp @@ -19,7 +19,7 @@ gs_stage_surface::gs_stage_surface(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat) - : device (device), + : gs_obj (device, gs_type::gs_stage_surface), width (width), height (height), format (colorFormat), diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index c3821ae27ba085..a665fcffc5a40c 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -46,6 +46,26 @@ static inline void LogD3D11ErrorDetails(HRError error, gs_device_t *device) static const IID dxgiFactory2 = {0x50c83a1c, 0xe072, 0x4c48, {0x87, 0xb0, 0x36, 0x30, 0xfa, 0x36, 0xa6, 0xd0}}; + +gs_obj::gs_obj(gs_device_t *device_, gs_type type) : + device (device_), + obj_type (type) +{ + prev_next = &device->first_obj; + next = device->first_obj; + device->first_obj = this; + if (next) + next->prev_next = &next; +} + +gs_obj::~gs_obj() +{ + if (prev_next) + *prev_next = next; + if (next) + next->prev_next = prev_next; +} + static inline void make_swap_desc(DXGI_SWAP_CHAIN_DESC &desc, const gs_init_data *data) { @@ -133,7 +153,7 @@ void gs_swap_chain::Init() } gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data) - : device (device), + : gs_obj (device, gs_type::gs_swap_chain), numBuffers (data->num_backbuffers), hwnd ((HWND)data->window.hwnd), initData (*data) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 48e34157bb4b35..5ec33285bb54fc 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -204,14 +204,42 @@ struct VBDataPtr { inline ~VBDataPtr() {gs_vbdata_destroy(data);} }; -struct gs_vertex_buffer { +enum class gs_type { + gs_vertex_buffer, + gs_index_buffer, + gs_texture_2d, + gs_zstencil_buffer, + gs_stage_surface, + gs_sampler_state, + gs_vertex_shader, + gs_pixel_shader, + gs_duplicator, + gs_swap_chain, +}; + +struct gs_obj { + gs_device_t *device; + gs_type obj_type; + gs_obj *next; + gs_obj **prev_next; + + inline gs_obj() : + device(nullptr), + next(nullptr), + prev_next(nullptr) + {} + + gs_obj(gs_device_t *device, gs_type type); + virtual ~gs_obj(); +}; + +struct gs_vertex_buffer : gs_obj { ComPtr vertexBuffer; ComPtr normalBuffer; ComPtr colorBuffer; ComPtr tangentBuffer; vector> uvBuffers; - gs_device_t *device; bool dynamic; VBDataPtr vbd; size_t numVerts; @@ -242,9 +270,8 @@ struct DataPtr { inline ~DataPtr() {bfree(data);} }; -struct gs_index_buffer { +struct gs_index_buffer : gs_obj { ComPtr indexBuffer; - gs_device_t *device; bool dynamic; gs_index_type type; size_t indexSize; @@ -260,27 +287,38 @@ struct gs_index_buffer { void *indices, size_t num, uint32_t flags); }; -struct gs_texture { +struct gs_texture : gs_obj { gs_texture_type type; - gs_device *device; uint32_t levels; gs_color_format format; ComPtr shaderRes; D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesc = {}; - inline gs_texture() {} - - inline gs_texture(gs_device *device, gs_texture_type type, - uint32_t levels, gs_color_format format) + inline gs_texture(gs_texture_type type, uint32_t levels, + gs_color_format format) : type (type), - device (device), levels (levels), format (format) { } - virtual ~gs_texture() {} + inline gs_texture(gs_device *device, gs_type obj_type, + gs_texture_type type) + : gs_obj (device, obj_type), + type (type) + { + } + + inline gs_texture(gs_device *device, gs_type obj_type, + gs_texture_type type, + uint32_t levels, gs_color_format format) + : gs_obj (device, obj_type), + type (type), + levels (levels), + format (format) + { + } }; struct gs_texture_2d : gs_texture { @@ -308,7 +346,7 @@ struct gs_texture_2d : gs_texture { void BackupTexture(const uint8_t **data); inline gs_texture_2d() - : gs_texture (NULL, GS_TEXTURE_2D, 0, GS_UNKNOWN) + : gs_texture (GS_TEXTURE_2D, 0, GS_UNKNOWN) { } @@ -320,11 +358,10 @@ struct gs_texture_2d : gs_texture { gs_texture_2d(gs_device_t *device, uint32_t handle); }; -struct gs_zstencil_buffer { +struct gs_zstencil_buffer : gs_obj { ComPtr texture; ComPtr view; - gs_device *device; uint32_t width, height; gs_zstencil_format format; DXGI_FORMAT dxgiFormat; @@ -335,8 +372,7 @@ struct gs_zstencil_buffer { void InitBuffer(); inline gs_zstencil_buffer() - : device (NULL), - width (0), + : width (0), height (0), dxgiFormat (DXGI_FORMAT_UNKNOWN) { @@ -346,11 +382,10 @@ struct gs_zstencil_buffer { gs_zstencil_format format); }; -struct gs_stage_surface { +struct gs_stage_surface : gs_obj { ComPtr texture; D3D11_TEXTURE2D_DESC td = {}; - gs_device *device; uint32_t width, height; gs_color_format format; DXGI_FORMAT dxgiFormat; @@ -359,9 +394,8 @@ struct gs_stage_surface { gs_color_format colorFormat); }; -struct gs_sampler_state { +struct gs_sampler_state : gs_obj { ComPtr state; - gs_device_t *device; D3D11_SAMPLER_DESC sd = {}; gs_sampler_info info; @@ -397,8 +431,7 @@ struct ShaderError { } }; -struct gs_shader { - gs_device_t *device; +struct gs_shader : gs_obj { gs_shader_type type; vector params; ComPtr constants; @@ -415,8 +448,9 @@ struct gs_shader { void Compile(const char *shaderStr, const char *file, const char *target, ID3D10Blob **shader); - inline gs_shader(gs_device_t *device, gs_shader_type type) - : device (device), + inline gs_shader(gs_device_t *device, gs_type obj_type, + gs_shader_type type) + : gs_obj (device, obj_type), type (type), constantSize (0) { @@ -466,10 +500,9 @@ struct gs_vertex_shader : gs_shader { const char *shaderString); }; -struct gs_duplicator { +struct gs_duplicator : gs_obj { ComPtr duplicator; gs_texture_2d *texture; - gs_device_t *device; int idx; void Start(); @@ -495,8 +528,7 @@ struct gs_pixel_shader : gs_shader { const char *shaderString); }; -struct gs_swap_chain { - gs_device *device; +struct gs_swap_chain : gs_obj { uint32_t numBuffers; HWND hwnd; gs_init_data initData; @@ -511,13 +543,6 @@ struct gs_swap_chain { void Resize(uint32_t cx, uint32_t cy); void Init(); - inline gs_swap_chain() - : device (NULL), - numBuffers (0), - hwnd (NULL) - { - } - gs_swap_chain(gs_device *device, const gs_init_data *data); }; @@ -688,6 +713,8 @@ struct gs_device { matrix4 curViewMatrix; matrix4 curViewProjMatrix; + gs_obj *first_obj = nullptr; + void InitCompiler(); void InitFactory(uint32_t adapterIdx); void InitDevice(uint32_t adapterIdx); diff --git a/libobs-d3d11/d3d11-texture2d.cpp b/libobs-d3d11/d3d11-texture2d.cpp index b4c35613d20e33..985546688f78b6 100644 --- a/libobs-d3d11/d3d11-texture2d.cpp +++ b/libobs-d3d11/d3d11-texture2d.cpp @@ -166,7 +166,8 @@ gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat, uint32_t levels, const uint8_t **data, uint32_t flags, gs_texture_type type, bool gdiCompatible, bool shared) - : gs_texture (device, type, levels, colorFormat), + : gs_texture (device, gs_type::gs_texture_2d, type, levels, + colorFormat), width (width), height (height), dxgiFormat (ConvertGSTextureFormat(format)), @@ -184,7 +185,9 @@ gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t width, } gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t handle) - : isShared (true), + : gs_texture (device, gs_type::gs_texture_2d, + GS_TEXTURE_2D), + isShared (true), sharedHandle (handle) { HRESULT hr; diff --git a/libobs-d3d11/d3d11-vertexbuffer.cpp b/libobs-d3d11/d3d11-vertexbuffer.cpp index dfdcac68352cf3..580aad64f8083a 100644 --- a/libobs-d3d11/d3d11-vertexbuffer.cpp +++ b/libobs-d3d11/d3d11-vertexbuffer.cpp @@ -129,7 +129,7 @@ void gs_vertex_buffer::BuildBuffers() gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags) - : device (device), + : gs_obj (device, gs_type::gs_vertex_buffer), dynamic ((flags & GS_DYNAMIC) != 0), vbd (data), numVerts (data->num) diff --git a/libobs-d3d11/d3d11-zstencilbuffer.cpp b/libobs-d3d11/d3d11-zstencilbuffer.cpp index 48599a4140f0a6..8c077d16762275 100644 --- a/libobs-d3d11/d3d11-zstencilbuffer.cpp +++ b/libobs-d3d11/d3d11-zstencilbuffer.cpp @@ -48,7 +48,7 @@ void gs_zstencil_buffer::InitBuffer() gs_zstencil_buffer::gs_zstencil_buffer(gs_device_t *device, uint32_t width, uint32_t height, gs_zstencil_format format) - : device (device), + : gs_obj (device, gs_type::gs_zstencil_buffer), width (width), height (height), format (format), From 54737c9c68224f4f193693b78d727fdcdf0fe717 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:38:11 -0700 Subject: [PATCH 63/80] libobs-d3d11: Remove unused function --- libobs-d3d11/d3d11-subsystem.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 5ec33285bb54fc..24117ee00c83ee 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -198,8 +198,6 @@ static inline D3D11_PRIMITIVE_TOPOLOGY ConvertGSTopology(gs_draw_mode mode) struct VBDataPtr { gs_vb_data *data; - inline void Clear() {gs_vbdata_destroy(data); data = nullptr;} - inline VBDataPtr(gs_vb_data *data) : data(data) {} inline ~VBDataPtr() {gs_vbdata_destroy(data);} }; From 5eb0c4ec83cce126154f2d88abb2d9e2411b95f3 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:40:15 -0700 Subject: [PATCH 64/80] libobs-d3d11: Add Release funtions to all GS objects Releases references for each graphics object. --- libobs-d3d11/d3d11-subsystem.hpp | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 24117ee00c83ee..ae97a83976b085 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -256,6 +256,15 @@ struct gs_vertex_buffer : gs_obj { void BuildBuffers(); + inline void Release() + { + vertexBuffer.Release(); + normalBuffer.Release(); + colorBuffer.Release(); + tangentBuffer.Release(); + uvBuffers.clear(); + } + gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags); }; @@ -281,6 +290,8 @@ struct gs_index_buffer : gs_obj { void InitBuffer(); + inline void Release() {indexBuffer.Release();} + gs_index_buffer(gs_device_t *device, enum gs_index_type type, void *indices, size_t num, uint32_t flags); }; @@ -343,6 +354,15 @@ struct gs_texture_2d : gs_texture { void InitRenderTargets(); void BackupTexture(const uint8_t **data); + inline void Release() + { + texture.Release(); + for (auto &rt : renderTarget) + rt.Release(); + gdiSurface.Release(); + shaderRes.Release(); + } + inline gs_texture_2d() : gs_texture (GS_TEXTURE_2D, 0, GS_UNKNOWN) { @@ -369,6 +389,12 @@ struct gs_zstencil_buffer : gs_obj { void InitBuffer(); + inline void Release() + { + texture.Release(); + view.Release(); + } + inline gs_zstencil_buffer() : width (0), height (0), @@ -388,6 +414,11 @@ struct gs_stage_surface : gs_obj { gs_color_format format; DXGI_FORMAT dxgiFormat; + inline void Release() + { + texture.Release(); + } + gs_stage_surface(gs_device_t *device, uint32_t width, uint32_t height, gs_color_format colorFormat); }; @@ -397,6 +428,8 @@ struct gs_sampler_state : gs_obj { D3D11_SAMPLER_DESC sd = {}; gs_sampler_info info; + inline void Release() {state.Release();} + gs_sampler_state(gs_device_t *device, const gs_sampler_info *info); }; @@ -482,6 +515,13 @@ struct gs_vertex_shader : gs_shader { bool hasTangents; uint32_t nTexUnits; + inline void Release() + { + shader.Release(); + layout.Release(); + constants.Release(); + } + inline uint32_t NumBuffersExpected() const { uint32_t count = nTexUnits+1; @@ -505,6 +545,11 @@ struct gs_duplicator : gs_obj { void Start(); + inline void Release() + { + duplicator.Release(); + } + gs_duplicator(gs_device_t *device, int monitor_idx); ~gs_duplicator(); }; @@ -513,6 +558,12 @@ struct gs_pixel_shader : gs_shader { ComPtr shader; vector> samplers; + inline void Release() + { + shader.Release(); + constants.Release(); + } + inline void GetSamplerStates(ID3D11SamplerState **states) { size_t i; @@ -541,6 +592,13 @@ struct gs_swap_chain : gs_obj { void Resize(uint32_t cx, uint32_t cy); void Init(); + inline void Release() + { + target.Release(); + zs.Release(); + swap.Release(); + } + gs_swap_chain(gs_device *device, const gs_init_data *data); }; @@ -579,6 +637,11 @@ struct SavedBlendState : BlendState { ComPtr state; D3D11_BLEND_DESC bd; + inline void Release() + { + state.Release(); + } + inline SavedBlendState(const BlendState &val, D3D11_BLEND_DESC &desc) : BlendState(val), bd(desc) { @@ -629,6 +692,11 @@ struct SavedZStencilState : ZStencilState { ComPtr state; D3D11_DEPTH_STENCIL_DESC dsd; + inline void Release() + { + state.Release(); + } + inline SavedZStencilState(const ZStencilState &val, D3D11_DEPTH_STENCIL_DESC desc) : ZStencilState (val), @@ -657,6 +725,11 @@ struct SavedRasterState : RasterState { ComPtr state; D3D11_RASTERIZER_DESC rd; + inline void Release() + { + state.Release(); + } + inline SavedRasterState(const RasterState &val, D3D11_RASTERIZER_DESC &desc) : RasterState (val), From 8e8834f10964ad138c2c1fe70e40b63a09e62854 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 07:41:23 -0700 Subject: [PATCH 65/80] libobs-d3d11: Rebuild device and assets if device removed/reset Due to an NVIDIA driver bug with the Windows 10 Anniversary Update, there are an increasingly large number of reports of "Device Removed" errors and TDRs. When this happens, OBS stops outputting all data because all graphics functions are failing, and it appears to just "freeze up" for users. To temporarily alleviate this issue while waiting for it to be fixed, the D3D subsystem can be rebuilt when that happens, all assets can be reloaded to ensure that it can continue functioning (with a minor hiccup in playback). To allow rebuilding the entire D3D subsystem, all objects that contain D3D references must be part of a linked list (with a few exceptions) so we can quickly traverse them all whenever needed, and all data for those resources (static resources primarily, such as shaders, textures, index buffers, vertex buffers) must be stored in RAM so they can be recreated whenever needed. Then if D3D reports a "device removed" or "device reset" error, all D3D references must first be fully released with no stray references; the linked list must be fully traversed until all references are released. Then, the linked list must once again be traversed again, and all those D3D objects must be recreated with the same data and descriptors (which are now saved in each object). Finally, all states need to be reset. After that's complete, the device is able to continue functioning almost as it was before, although the output to recording/stream may get a few green frames due to texture data being reset. This will temporarily alleviate the "Device Removed" issue while waiting for a fix from NVIDIA. --- libobs-d3d11/CMakeLists.txt | 1 + libobs-d3d11/d3d11-rebuild.cpp | 313 +++++++++++++++++++++++++++++++ libobs-d3d11/d3d11-subsystem.cpp | 8 +- libobs-d3d11/d3d11-subsystem.hpp | 28 +++ 4 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 libobs-d3d11/d3d11-rebuild.cpp diff --git a/libobs-d3d11/CMakeLists.txt b/libobs-d3d11/CMakeLists.txt index 95d85c0c5c2da5..e30828b237dfe5 100644 --- a/libobs-d3d11/CMakeLists.txt +++ b/libobs-d3d11/CMakeLists.txt @@ -14,6 +14,7 @@ set(libobs-d3d11_SOURCES d3d11-texture2d.cpp d3d11-vertexbuffer.cpp d3d11-duplicator.cpp + d3d11-rebuild.cpp d3d11-zstencilbuffer.cpp) set(libobs-d3d11_HEADERS diff --git a/libobs-d3d11/d3d11-rebuild.cpp b/libobs-d3d11/d3d11-rebuild.cpp new file mode 100644 index 00000000000000..03824c42c595e0 --- /dev/null +++ b/libobs-d3d11/d3d11-rebuild.cpp @@ -0,0 +1,313 @@ +/****************************************************************************** + Copyright (C) 2016 by Hugh Bailey + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +******************************************************************************/ + +#include "d3d11-subsystem.hpp" + +inline void gs_vertex_buffer::Rebuild() +{ + uvBuffers.clear(); + uvSizes.clear(); + BuildBuffers(); +} + +inline void gs_index_buffer::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateBuffer(&bd, &srd, &indexBuffer); + if (FAILED(hr)) + throw HRError("Failed to create buffer", hr); +} + +inline void gs_texture_2d::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + if (isShared) { + hr = dev->OpenSharedResource((HANDLE)(uintptr_t)sharedHandle, + __uuidof(ID3D11Texture2D), (void**)&texture); + if (FAILED(hr)) + throw HRError("Failed to open shared 2D texture", hr); + } else { + hr = dev->CreateTexture2D(&td, + data.size() ? srd.data() : nullptr, + &texture); + if (FAILED(hr)) + throw HRError("Failed to create 2D texture", hr); + } + + hr = dev->CreateShaderResourceView(texture, &resourceDesc, &shaderRes); + if (FAILED(hr)) + throw HRError("Failed to create resource view", hr); + + if (isRenderTarget) + InitRenderTargets(); +} + +inline void gs_zstencil_buffer::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + hr = dev->CreateTexture2D(&td, nullptr, &texture); + if (FAILED(hr)) + throw HRError("Failed to create depth stencil texture", hr); + + hr = dev->CreateDepthStencilView(texture, &dsvd, &view); + if (FAILED(hr)) + throw HRError("Failed to create depth stencil view", hr); +} + +inline void gs_stage_surface::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateTexture2D(&td, nullptr, &texture); + if (FAILED(hr)) + throw HRError("Failed to create staging surface", hr); +} + +inline void gs_sampler_state::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateSamplerState(&sd, state.Assign()); + if (FAILED(hr)) + throw HRError("Failed to create sampler state", hr); +} + +inline void gs_vertex_shader::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + hr = dev->CreateVertexShader(data.data(), data.size(), nullptr, &shader); + if (FAILED(hr)) + throw HRError("Failed to create vertex shader", hr); + + hr = dev->CreateInputLayout(layoutData.data(), (UINT)layoutData.size(), + data.data(), data.size(), &layout); + if (FAILED(hr)) + throw HRError("Failed to create input layout", hr); + + if (constantSize) { + hr = dev->CreateBuffer(&bd, NULL, &constants); + if (FAILED(hr)) + throw HRError("Failed to create constant buffer", hr); + } + + for (gs_shader_param ¶m : params) { + param.nextSampler = nullptr; + param.curValue.clear(); + gs_shader_set_default(¶m); + } +} + +inline void gs_pixel_shader::Rebuild(ID3D11Device *dev) +{ + HRESULT hr; + + hr = dev->CreatePixelShader(data.data(), data.size(), nullptr, + &shader); + if (FAILED(hr)) + throw HRError("Failed to create pixel shader", hr); + + if (constantSize) { + hr = dev->CreateBuffer(&bd, NULL, &constants); + if (FAILED(hr)) + throw HRError("Failed to create constant buffer", hr); + } + + for (gs_shader_param ¶m : params) { + param.nextSampler = nullptr; + param.curValue.clear(); + gs_shader_set_default(¶m); + } +} + +inline void gs_swap_chain::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = device->factory->CreateSwapChain(dev, &swapDesc, &swap); + if (FAILED(hr)) + throw HRError("Failed to create swap chain", hr); + Init(); +} + +inline void SavedBlendState::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateBlendState(&bd, &state); + if (FAILED(hr)) + throw HRError("Failed to create blend state", hr); +} + +inline void SavedZStencilState::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateDepthStencilState(&dsd, &state); + if (FAILED(hr)) + throw HRError("Failed to create depth stencil state", hr); +} + +inline void SavedRasterState::Rebuild(ID3D11Device *dev) +{ + HRESULT hr = dev->CreateRasterizerState(&rd, &state); + if (FAILED(hr)) + throw HRError("Failed to create rasterizer state", hr); +} + +const static D3D_FEATURE_LEVEL featureLevels[] = +{ + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, +}; + +void gs_device::RebuildDevice() +try { + ID3D11Device *dev = nullptr; + HRESULT hr; + + blog(LOG_WARNING, "Device Remove/Reset! Rebuilding all assets..."); + + /* ----------------------------------------------------------------- */ + + gs_obj *obj = first_obj; + + while (obj) { + switch (obj->obj_type) { + case gs_type::gs_vertex_buffer: + ((gs_vertex_buffer*)obj)->Release(); + break; + case gs_type::gs_index_buffer: + ((gs_index_buffer*)obj)->Release(); + break; + case gs_type::gs_texture_2d: + ((gs_texture_2d*)obj)->Release(); + break; + case gs_type::gs_zstencil_buffer: + ((gs_zstencil_buffer*)obj)->Release(); + break; + case gs_type::gs_stage_surface: + ((gs_stage_surface*)obj)->Release(); + break; + case gs_type::gs_sampler_state: + ((gs_sampler_state*)obj)->Release(); + break; + case gs_type::gs_vertex_shader: + ((gs_vertex_shader*)obj)->Release(); + break; + case gs_type::gs_pixel_shader: + ((gs_pixel_shader*)obj)->Release(); + break; + case gs_type::gs_duplicator: + ((gs_duplicator*)obj)->Release(); + break; + case gs_type::gs_swap_chain: + ((gs_swap_chain*)obj)->Release(); + break; + } + + obj = obj->next; + } + + for (auto &state : zstencilStates) + state.Release(); + for (auto &state : rasterStates) + state.Release(); + for (auto &state : blendStates) + state.Release(); + + context->ClearState(); + + context.Release(); + device.Release(); + adapter.Release(); + factory.Release(); + + /* ----------------------------------------------------------------- */ + + InitFactory(adpIdx); + + uint32_t createFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; + hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, + nullptr, createFlags, featureLevels, + sizeof(featureLevels) / sizeof(D3D_FEATURE_LEVEL), + D3D11_SDK_VERSION, &device, nullptr, &context); + if (FAILED(hr)) + throw HRError("Failed to create device", hr); + + dev = device; + + obj = first_obj; + while (obj) { + switch (obj->obj_type) { + case gs_type::gs_vertex_buffer: + ((gs_vertex_buffer*)obj)->Rebuild(); + break; + case gs_type::gs_index_buffer: + ((gs_index_buffer*)obj)->Rebuild(dev); + break; + case gs_type::gs_texture_2d: + ((gs_texture_2d*)obj)->Rebuild(dev); + break; + case gs_type::gs_zstencil_buffer: + ((gs_zstencil_buffer*)obj)->Rebuild(dev); + break; + case gs_type::gs_stage_surface: + ((gs_stage_surface*)obj)->Rebuild(dev); + break; + case gs_type::gs_sampler_state: + ((gs_sampler_state*)obj)->Rebuild(dev); + break; + case gs_type::gs_vertex_shader: + ((gs_vertex_shader*)obj)->Rebuild(dev); + break; + case gs_type::gs_pixel_shader: + ((gs_pixel_shader*)obj)->Rebuild(dev); + break; + case gs_type::gs_duplicator: + ((gs_duplicator*)obj)->Start(); + break; + case gs_type::gs_swap_chain: + ((gs_swap_chain*)obj)->Rebuild(dev); + break; + } + + obj = obj->next; + } + + curRenderTarget = nullptr; + curZStencilBuffer = nullptr; + curRenderSide = 0; + memset(&curTextures, 0, sizeof(curTextures)); + memset(&curSamplers, 0, sizeof(curSamplers)); + curVertexBuffer = nullptr; + curIndexBuffer = nullptr; + curVertexShader = nullptr; + curPixelShader = nullptr; + curSwapChain = nullptr; + zstencilStateChanged = true; + rasterStateChanged = true; + blendStateChanged = true; + curDepthStencilState = nullptr; + curRasterState = nullptr; + curBlendState = nullptr; + curToplogy = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED; + + for (auto &state : zstencilStates) + state.Rebuild(dev); + for (auto &state : rasterStates) + state.Rebuild(dev); + for (auto &state : blendStates) + state.Rebuild(dev); + +} catch (const char *error) { + bcrash("Failed to recreate D3D11: %s", error); + +} catch (HRError error) { + bcrash("Failed to recreate D3D11: %s (%08lX)", + error.str, error.hr); +} diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index a665fcffc5a40c..dbd6afb808b841 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -1432,8 +1432,14 @@ void device_clear(gs_device_t *device, uint32_t clear_flags, void device_present(gs_device_t *device) { + HRESULT hr; + if (device->curSwapChain) { - device->curSwapChain->swap->Present(0, 0); + hr = device->curSwapChain->swap->Present(0, 0); + if (hr == DXGI_ERROR_DEVICE_REMOVED || + hr == DXGI_ERROR_DEVICE_RESET) { + device->RebuildDevice(); + } } else { blog(LOG_WARNING, "device_present (D3D11): No active swap"); } diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index ae97a83976b085..1771dbf621d6cb 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -265,6 +265,8 @@ struct gs_vertex_buffer : gs_obj { uvBuffers.clear(); } + inline void Rebuild(); + gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data, uint32_t flags); }; @@ -290,6 +292,8 @@ struct gs_index_buffer : gs_obj { void InitBuffer(); + inline void Rebuild(ID3D11Device *dev); + inline void Release() {indexBuffer.Release();} gs_index_buffer(gs_device_t *device, enum gs_index_type type, @@ -304,6 +308,8 @@ struct gs_texture : gs_obj { ComPtr shaderRes; D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesc = {}; + inline void Rebuild(ID3D11Device *dev); + inline gs_texture(gs_texture_type type, uint32_t levels, gs_color_format format) : type (type), @@ -354,6 +360,8 @@ struct gs_texture_2d : gs_texture { void InitRenderTargets(); void BackupTexture(const uint8_t **data); + inline void Rebuild(ID3D11Device *dev); + inline void Release() { texture.Release(); @@ -389,6 +397,8 @@ struct gs_zstencil_buffer : gs_obj { void InitBuffer(); + inline void Rebuild(ID3D11Device *dev); + inline void Release() { texture.Release(); @@ -414,6 +424,8 @@ struct gs_stage_surface : gs_obj { gs_color_format format; DXGI_FORMAT dxgiFormat; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { texture.Release(); @@ -428,6 +440,8 @@ struct gs_sampler_state : gs_obj { D3D11_SAMPLER_DESC sd = {}; gs_sampler_info info; + inline void Rebuild(ID3D11Device *dev); + inline void Release() {state.Release();} gs_sampler_state(gs_device_t *device, const gs_sampler_info *info); @@ -515,6 +529,8 @@ struct gs_vertex_shader : gs_shader { bool hasTangents; uint32_t nTexUnits; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { shader.Release(); @@ -558,6 +574,8 @@ struct gs_pixel_shader : gs_shader { ComPtr shader; vector> samplers; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { shader.Release(); @@ -592,6 +610,8 @@ struct gs_swap_chain : gs_obj { void Resize(uint32_t cx, uint32_t cy); void Init(); + inline void Rebuild(ID3D11Device *dev); + inline void Release() { target.Release(); @@ -637,6 +657,8 @@ struct SavedBlendState : BlendState { ComPtr state; D3D11_BLEND_DESC bd; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { state.Release(); @@ -692,6 +714,8 @@ struct SavedZStencilState : ZStencilState { ComPtr state; D3D11_DEPTH_STENCIL_DESC dsd; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { state.Release(); @@ -725,6 +749,8 @@ struct SavedRasterState : RasterState { ComPtr state; D3D11_RASTERIZER_DESC rd; + inline void Rebuild(ID3D11Device *dev); + inline void Release() { state.Release(); @@ -804,6 +830,8 @@ struct gs_device { void UpdateViewProjMatrix(); + void RebuildDevice(); + gs_device(uint32_t adapterIdx); ~gs_device(); }; From 81ab13a2a4c14cc2c7b89c65a25ed5959d761eff Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 08:10:21 -0700 Subject: [PATCH 66/80] win-capture: Cache cursor textures to prevent reallocation Whenever a cursor is captured and the cursor icon changes, it creates a new texture. This isn't particularly optimal, so instead just store a cache of cursor textures (based on size), and make the textures dynamic. Doing this will prevent unnecessary texture reallocation. --- plugins/win-capture/cursor-capture.c | 36 +++++++++++++++++++++++----- plugins/win-capture/cursor-capture.h | 11 +++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/plugins/win-capture/cursor-capture.c b/plugins/win-capture/cursor-capture.c index 33c1a014a65017..1cf54e68fa1a92 100644 --- a/plugins/win-capture/cursor-capture.c +++ b/plugins/win-capture/cursor-capture.c @@ -131,6 +131,25 @@ static inline uint8_t *cursor_capture_icon_bitmap(ICONINFO *ii, return output; } +static gs_texture_t *get_cached_texture(struct cursor_data *data, + uint32_t cx, uint32_t cy) +{ + struct cached_cursor cc; + + for (size_t i = 0; i < data->cached_textures.num; i++) { + struct cached_cursor *pcc = &data->cached_textures.array[i]; + + if (pcc->cx == cx && pcc->cy == cy) + return pcc->texture; + } + + cc.texture = gs_texture_create(cx, cy, GS_BGRA, 1, NULL, GS_DYNAMIC); + cc.cx = cx; + cc.cy = cy; + da_push_back(data->cached_textures, &cc); + return cc.texture; +} + static inline bool cursor_capture_icon(struct cursor_data *data, HICON icon) { uint8_t *bitmap; @@ -138,9 +157,6 @@ static inline bool cursor_capture_icon(struct cursor_data *data, HICON icon) uint32_t width; ICONINFO ii; - gs_texture_destroy(data->texture); - data->texture = NULL; - if (!icon) { return false; } @@ -150,8 +166,12 @@ static inline bool cursor_capture_icon(struct cursor_data *data, HICON icon) bitmap = cursor_capture_icon_bitmap(&ii, &width, &height); if (bitmap) { - data->texture = gs_texture_create(width, height, GS_BGRA, - 1, (const uint8_t**)&bitmap, 0); + if (data->last_cx != width && data->last_cy != height) { + data->texture = get_cached_texture(data, width, height); + data->last_cx = width; + data->last_cy = height; + } + gs_texture_set_image(data->texture, bitmap, width * 4, false); bfree(bitmap); data->x_hotspot = ii.xHotspot; @@ -217,6 +237,10 @@ void cursor_draw(struct cursor_data *data, long x_offset, long y_offset, void cursor_data_free(struct cursor_data *data) { - gs_texture_destroy(data->texture); + for (size_t i = 0; i < data->cached_textures.num; i++) { + struct cached_cursor *pcc = &data->cached_textures.array[i]; + gs_texture_destroy(pcc->texture); + } + da_free(data->cached_textures); memset(data, 0, sizeof(*data)); } diff --git a/plugins/win-capture/cursor-capture.h b/plugins/win-capture/cursor-capture.h index 36df191276a16e..88bf59f931a6cf 100644 --- a/plugins/win-capture/cursor-capture.h +++ b/plugins/win-capture/cursor-capture.h @@ -2,6 +2,12 @@ #include +struct cached_cursor { + gs_texture_t *texture; + uint32_t cx; + uint32_t cy; +}; + struct cursor_data { gs_texture_t *texture; HCURSOR current_cursor; @@ -9,6 +15,11 @@ struct cursor_data { long x_hotspot; long y_hotspot; bool visible; + + uint32_t last_cx; + uint32_t last_cy; + + DARRAY(struct cached_cursor) cached_textures; }; extern void cursor_capture(struct cursor_data *data); From f49065b1e64f5379617fa36207a4e8c30431c9aa Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 29 Oct 2016 08:23:44 -0700 Subject: [PATCH 67/80] win-capture: Use IUnknown for getting swap backbuffers Using IDXGIResource doesn't work with D3D12. D3D12 textures are not a subclass of that class. --- plugins/win-capture/graphics-hook/dxgi-capture.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/win-capture/graphics-hook/dxgi-capture.cpp b/plugins/win-capture/graphics-hook/dxgi-capture.cpp index 6580169b392b53..96f89e76c93049 100644 --- a/plugins/win-capture/graphics-hook/dxgi-capture.cpp +++ b/plugins/win-capture/graphics-hook/dxgi-capture.cpp @@ -87,12 +87,12 @@ static HRESULT STDMETHODCALLTYPE hook_resize_buffers(IDXGISwapChain *swap, return hr; } -static inline IDXGIResource *get_dxgi_backbuffer(IDXGISwapChain *swap) +static inline IUnknown *get_dxgi_backbuffer(IDXGISwapChain *swap) { IDXGIResource *res = nullptr; HRESULT hr; - hr = swap->GetBuffer(0, __uuidof(ID3D11Resource), (void**)&res); + hr = swap->GetBuffer(0, __uuidof(IUnknown), (void**)&res); if (FAILED(hr)) hlog_hr("get_dxgi_backbuffer: GetBuffer failed", hr); @@ -102,7 +102,7 @@ static inline IDXGIResource *get_dxgi_backbuffer(IDXGISwapChain *swap) static HRESULT STDMETHODCALLTYPE hook_present(IDXGISwapChain *swap, UINT sync_interval, UINT flags) { - IDXGIResource *backbuffer = nullptr; + IUnknown *backbuffer = nullptr; bool capture_overlay = global_hook_info->capture_overlay; bool test_draw = (flags & DXGI_PRESENT_TEST) != 0; bool capture; From 0b27b512949f0a9177b1843a0ab38636ae0d7ed2 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Sat, 29 Oct 2016 08:25:08 -0700 Subject: [PATCH 68/80] win-capture: Add D3D12 capture support Currently only supports shared texture capture, and doesn't support rescaling. --- .../win-capture/graphics-hook/CMakeLists.txt | 14 +- .../graphics-hook/d3d12-capture.cpp | 301 ++++++++++++++++++ .../graphics-hook/dxgi-capture.cpp | 15 + .../graphics-hook/graphics-hook-config.h.in | 15 + .../win-capture/graphics-hook/graphics-hook.h | 7 + 5 files changed, 351 insertions(+), 1 deletion(-) create mode 100644 plugins/win-capture/graphics-hook/d3d12-capture.cpp create mode 100644 plugins/win-capture/graphics-hook/graphics-hook-config.h.in diff --git a/plugins/win-capture/graphics-hook/CMakeLists.txt b/plugins/win-capture/graphics-hook/CMakeLists.txt index 986058c786316d..a302149ef375d5 100644 --- a/plugins/win-capture/graphics-hook/CMakeLists.txt +++ b/plugins/win-capture/graphics-hook/CMakeLists.txt @@ -1,6 +1,14 @@ project(graphics-hook) +set(COMPILE_D3D12_HOOK FALSE CACHE BOOL "Compile D3D12 hook support (required windows 10 SDK)") + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/graphics-hook-config.h.in" + "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h") + + set(graphics-hook_HEADERS + "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h" graphics-hook.h ../graphics-hook-info.h ../hook-helpers.h @@ -18,12 +26,16 @@ set(graphics-hook_SOURCES d3d9-capture.cpp dxgi-capture.cpp d3d10-capture.cpp - d3d11-capture.cpp) + d3d11-capture.cpp + d3d12-capture.cpp) add_library(graphics-hook MODULE ${graphics-hook_SOURCES} ${graphics-hook_HEADERS}) +target_include_directories(graphics-hook PUBLIC + "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config") + target_link_libraries(graphics-hook ipc-util psapi) diff --git a/plugins/win-capture/graphics-hook/d3d12-capture.cpp b/plugins/win-capture/graphics-hook/d3d12-capture.cpp new file mode 100644 index 00000000000000..c0b1902e484e2a --- /dev/null +++ b/plugins/win-capture/graphics-hook/d3d12-capture.cpp @@ -0,0 +1,301 @@ +#define _CRT_SECURE_NO_WARNINGS +#include +#include "graphics-hook.h" + +#if COMPILE_D3D12_HOOK + +#include +#include +#include + +#include "dxgi-helpers.hpp" +#include "../funchook.h" + +struct d3d12_data { + ID3D12Device *device; /* do not release */ + uint32_t base_cx; + uint32_t base_cy; + uint32_t cx; + uint32_t cy; + DXGI_FORMAT format; + bool using_shtex : 1; + bool using_scale : 1; + bool multisampled : 1; + + ID3D11Device *device11; + ID3D11DeviceContext *context11; + ID3D11On12Device *device11on12; + + union { + struct { + struct shtex_data *shtex_info; + ID3D11Resource *backbuffer11; + ID3D11Texture2D *copy_tex; + HANDLE handle; + }; + }; +}; + +static struct d3d12_data data = {}; + +void d3d12_free(void) +{ + if (data.copy_tex) + data.copy_tex->Release(); + if (data.backbuffer11) + data.backbuffer11->Release(); + if (data.device11) + data.device11->Release(); + if (data.context11) + data.context11->Release(); + if (data.device11on12) + data.device11on12->Release(); + + capture_free(); + + memset(&data, 0, sizeof(data)); + + hlog("----------------- d3d12 capture freed ----------------"); +} + +static bool create_d3d12_tex(ID3D12Resource *backbuffer) +{ + D3D11_RESOURCE_FLAGS rf11 = {}; + HRESULT hr; + + hr = data.device11on12->CreateWrappedResource(backbuffer, &rf11, + D3D12_RESOURCE_STATE_COPY_SOURCE, + D3D12_RESOURCE_STATE_PRESENT, + __uuidof(ID3D11Resource), + (void**)&data.backbuffer11); + if (FAILED(hr)) { + hlog_hr("create_d3d12_tex: failed to create backbuffer11", + hr); + return false; + } + + D3D11_TEXTURE2D_DESC desc11 = {}; + desc11.Width = data.cx; + desc11.Height = data.cy; + desc11.MipLevels = 1; + desc11.ArraySize = 1; + desc11.Format = data.format; + desc11.SampleDesc.Count = 1; + desc11.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc11.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + + hr = data.device11->CreateTexture2D(&desc11, nullptr, &data.copy_tex); + if (FAILED(hr)) { + hlog_hr("create_d3d12_tex: creation of d3d11 copy tex failed", + hr); + return false; + } + + data.device11on12->ReleaseWrappedResources(&data.backbuffer11, 1); + + IDXGIResource *dxgi_res; + hr = data.copy_tex->QueryInterface(__uuidof(IDXGIResource), + (void**)&dxgi_res); + if (FAILED(hr)) { + hlog_hr("create_d3d12_tex: failed to query " + "IDXGIResource interface from texture", hr); + return false; + } + + hr = dxgi_res->GetSharedHandle(&data.handle); + dxgi_res->Release(); + if (FAILED(hr)) { + hlog_hr("create_d3d12_tex: failed to get shared handle", hr); + return false; + } + + return true; +} + +typedef PFN_D3D11ON12_CREATE_DEVICE create_11_on_12_t; + +const static D3D_FEATURE_LEVEL feature_levels[] = +{ + D3D_FEATURE_LEVEL_11_0, + D3D_FEATURE_LEVEL_10_1, + D3D_FEATURE_LEVEL_10_0, + D3D_FEATURE_LEVEL_9_3, +}; + +static bool d3d12_init_11on12(void) +{ + static HMODULE d3d11 = nullptr; + static create_11_on_12_t create_11_on_12 = nullptr; + static bool initialized_11 = false; + static bool initialized_func = false; + HRESULT hr; + + if (!initialized_11 && !d3d11) { + d3d11 = load_system_library("d3d11.dll"); + if (!d3d11) { + hlog("d3d12_init_11on12: failed to load d3d11"); + } + initialized_11 = true; + } + + if (!d3d11) { + return false; + } + + if (!initialized_func && !create_11_on_12) { + create_11_on_12 = (create_11_on_12_t)GetProcAddress(d3d11, + "D3D11On12CreateDevice"); + if (!create_11_on_12) { + hlog("d3d12_init_11on12: Failed to get " + "D3D11On12CreateDevice address"); + } + + initialized_func = true; + } + + if (!create_11_on_12) { + return false; + } + + hr = create_11_on_12(data.device, 0, nullptr, 0, + nullptr, 0, 0, + &data.device11, &data.context11, nullptr); + if (FAILED(hr)) { + hlog_hr("d3d12_init_11on12: failed to create 11 device", hr); + return false; + } + + data.device11->QueryInterface(__uuidof(ID3D11On12Device), + (void**)&data.device11on12); + if (FAILED(hr)) { + hlog_hr("d3d12_init_11on12: failed to query 11on12 device", hr); + return false; + } + + return true; +} + +static bool d3d12_shtex_init(HWND window, ID3D12Resource *backbuffer) +{ + if (!d3d12_init_11on12()) { + return false; + } + if (!create_d3d12_tex(backbuffer)) { + return false; + } + if (!capture_init_shtex(&data.shtex_info, window, + data.base_cx, data.base_cy, data.cx, data.cy, + data.format, false, (uintptr_t)data.handle)) { + return false; + } + + hlog("d3d12 shared texture capture successful"); + return true; +} + +static inline bool d3d12_init_format(IDXGISwapChain *swap, HWND &window) +{ + DXGI_SWAP_CHAIN_DESC desc; + HRESULT hr; + + hr = swap->GetDesc(&desc); + if (FAILED(hr)) { + hlog_hr("d3d12_init_format: swap->GetDesc failed", hr); + return false; + } + + data.format = fix_dxgi_format(desc.BufferDesc.Format); + data.multisampled = desc.SampleDesc.Count > 1; + window = desc.OutputWindow; + data.base_cx = desc.BufferDesc.Width; + data.base_cy = desc.BufferDesc.Height; + + if (data.using_scale) { + data.cx = global_hook_info->cx; + data.cy = global_hook_info->cy; + } else { + data.cx = desc.BufferDesc.Width; + data.cy = desc.BufferDesc.Height; + } + return true; +} + +static void d3d12_init(IDXGISwapChain *swap, ID3D12Resource *backbuffer) +{ + bool success = true; + HWND window; + HRESULT hr; + + data.using_scale = global_hook_info->use_scale; + + hr = swap->GetDevice(__uuidof(ID3D12Device), (void**)&data.device); + if (FAILED(hr)) { + hlog_hr("d3d12_init: failed to get device from swap", hr); + return; + } + + data.device->Release(); + + if (!d3d12_init_format(swap, window)) { + return; + } + if (data.using_scale) { + hlog("d3d12_init: scaling currently unsupported; ignoring"); + } + if (success) { + if (global_hook_info->force_shmem) { + hlog("d3d12_init: shared memory capture currently " + "unsupported; ignoring"); + } + + success = d3d12_shtex_init(window, backbuffer); + } + + if (!success) + d3d12_free(); +} + +static inline void d3d12_copy_texture(ID3D11Resource *dst, ID3D11Resource *src) +{ + if (data.multisampled) { + data.context11->ResolveSubresource(dst, 0, src, 0, data.format); + } else { + data.context11->CopyResource(dst, src); + } +} + +static inline void d3d12_shtex_capture() +{ + data.device11on12->AcquireWrappedResources(&data.backbuffer11, 1); + d3d12_copy_texture(data.copy_tex, data.backbuffer11); + data.device11on12->ReleaseWrappedResources(&data.backbuffer11, 1); + data.context11->Flush(); +} + +void d3d12_capture(void *swap_ptr, void *backbuffer_ptr) +{ + IUnknown *unk_backbuffer = (IUnknown*)backbuffer_ptr; + IDXGISwapChain *swap = (IDXGISwapChain*)swap_ptr; + ID3D12Resource *backbuffer; + HRESULT hr; + + if (capture_should_stop()) { + d3d12_free(); + } + if (capture_should_init()) { + hr = unk_backbuffer->QueryInterface(__uuidof(ID3D12Resource), + (void**)&backbuffer); + if (FAILED(hr)) { + hlog_hr("d3d12_capture: failed to get backbuffer", hr); + return; + } + + d3d12_init(swap, backbuffer); + backbuffer->Release(); + } + if (capture_ready()) { + d3d12_shtex_capture(); + } +} + +#endif diff --git a/plugins/win-capture/graphics-hook/dxgi-capture.cpp b/plugins/win-capture/graphics-hook/dxgi-capture.cpp index 96f89e76c93049..1d8749a2eefda2 100644 --- a/plugins/win-capture/graphics-hook/dxgi-capture.cpp +++ b/plugins/win-capture/graphics-hook/dxgi-capture.cpp @@ -8,6 +8,10 @@ #include "graphics-hook.h" #include "../funchook.h" +#if COMPILE_D3D12_HOOK +#include +#endif + typedef HRESULT (STDMETHODCALLTYPE *resize_buffers_t)(IDXGISwapChain*, UINT, UINT, UINT, DXGI_FORMAT, UINT); typedef HRESULT (STDMETHODCALLTYPE *present_t)(IDXGISwapChain*, UINT, UINT); @@ -59,6 +63,17 @@ static bool setup_dxgi(IDXGISwapChain *swap) return true; } +#if COMPILE_D3D12_HOOK + hr = swap->GetDevice(__uuidof(ID3D12Device), (void**)&device); + if (SUCCEEDED(hr)) { + data.swap = swap; + data.capture = d3d12_capture; + data.free = d3d12_free; + device->Release(); + return true; + } +#endif + return false; } diff --git a/plugins/win-capture/graphics-hook/graphics-hook-config.h.in b/plugins/win-capture/graphics-hook/graphics-hook-config.h.in new file mode 100644 index 00000000000000..6753669f1a8ccc --- /dev/null +++ b/plugins/win-capture/graphics-hook/graphics-hook-config.h.in @@ -0,0 +1,15 @@ +#pragma once + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef ON +#define ON 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define COMPILE_D3D12_HOOK @COMPILE_D3D12_HOOK@ diff --git a/plugins/win-capture/graphics-hook/graphics-hook.h b/plugins/win-capture/graphics-hook/graphics-hook.h index 4440aff798c149..17f1e8e58ee1c3 100644 --- a/plugins/win-capture/graphics-hook/graphics-hook.h +++ b/plugins/win-capture/graphics-hook/graphics-hook.h @@ -1,5 +1,7 @@ #pragma once +#include "graphics-hook-config.h" + #ifdef _MSC_VER /* conversion from data/function pointer */ #pragma warning(disable: 4152) @@ -46,6 +48,11 @@ extern void d3d10_free(void); extern void d3d11_capture(void *swap, void *backbuffer); extern void d3d11_free(void); +#if COMPILE_D3D12_HOOK +extern void d3d12_capture(void *swap, void *backbuffer); +extern void d3d12_free(void); +#endif + extern uint8_t *get_d3d1x_vertex_shader(size_t *size); extern uint8_t *get_d3d1x_pixel_shader(size_t *size); From d0e186497f7ac3fdcfe8be5cf867b748ece7f51e Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 12:28:33 -0700 Subject: [PATCH 69/80] UI: Allow the ability to use deprecated sources --- UI/data/locale/en-US.ini | 1 + UI/window-basic-main.cpp | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 0b66d438afb860..24feab0dc2fc69 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -57,6 +57,7 @@ Reset="Reset" Hours="Hours" Minutes="Minutes" Seconds="Seconds" +Deprecated="Deprecated" # quick transitions QuickTransitions.SwapScenes="Swap Preview/Output Scenes After Transitioning" diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 6a73ebdee8948d..01c2ae3c06d008 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -3185,9 +3185,11 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() { const char *type; bool foundValues = false; + bool foundDeprecated = false; size_t idx = 0; QMenu *popup = new QMenu(QTStr("Add"), this); + QMenu *deprecated = new QMenu(QTStr("Deprecated"), popup); auto getActionAfter = [] (QMenu *menu, const QString &name) { @@ -3220,15 +3222,26 @@ QMenu *OBSBasic::CreateAddSourcePopupMenu() if ((caps & OBS_SOURCE_DEPRECATED) == 0) { addSource(popup, type, name); - foundValues = true; + } else { + addSource(deprecated, type, name); + foundDeprecated = true; } + foundValues = true; } addSource(popup, "scene", Str("Basic.Scene")); + if (!foundDeprecated) { + delete deprecated; + deprecated = nullptr; + } + if (!foundValues) { delete popup; popup = nullptr; + + } else if (foundDeprecated) { + popup->addMenu(deprecated); } return popup; From 01a33edea9a48aa37f23a82f564e8dd6155a7b8c Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Thu, 3 Nov 2016 20:34:57 +0100 Subject: [PATCH 70/80] UI: Add AMD presets and update settings --- UI/window-basic-main-outputs.cpp | 51 ++++++++++++++++++-------------- UI/window-basic-settings.cpp | 7 +++-- UI/window-basic-settings.hpp | 1 + 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index b703a4fb4a9ad2..dac83b6b133a0d 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -501,42 +501,49 @@ void SimpleOutput::UpdateRecordingSettings_nvenc(int cqp) void SimpleOutput::UpdateStreamingSettings_amd(obs_data_t *settings, int bitrate) { - int bits = bitrate * 1000; + // Static Properties obs_data_set_int(settings, "AMF.H264.Usage", 0); - obs_data_set_int(settings, "AMF.H264.QualityPreset", 2); - obs_data_set_int(settings, "AMF.H264.ProfileLevel", 51); + obs_data_set_int(settings, "AMF.H264.Profile", 100); // High + obs_data_set_string(settings, "profile", "high"); // High + obs_data_set_int(settings, "AMF.H264.ProfileLevel", 0); // Automatic + + // Rate Control Properties + obs_data_set_int(settings, "AMF.H264.RateControlMethod", 1); + obs_data_set_string(settings, "rate_control", "CBR"); + obs_data_set_int(settings, "AMF.H264.Bitrate.Target", bitrate); + obs_data_set_int(settings, "bitrate", bitrate); obs_data_set_int(settings, "AMF.H264.FillerData", 1); - obs_data_set_int(settings, "AMF.H264.FrameSkipping", -1); - obs_data_set_int(settings, "AMF.H264.BPicture.Pattern", 2); - obs_data_set_int(settings, "AMF.H264.BPicture.Reference", 1); - obs_data_set_int(settings, "AMF.H264.Bitrate.Target", bits); - obs_data_set_int(settings, "AMF.H264.Bitrate.Peak", bits); - obs_data_set_int(settings, "AMF.H264Advanced.VBVBuffer.Size", bits); - obs_data_set_string(settings, "profile", "high"); + obs_data_set_int(settings, "AMF.H264.VBVBuffer", 0); // Automatic VBV Buffer + obs_data_set_double(settings, "AMF.H264.VBVBuffer.Strictness", 0.9); + + // Picture Control Properties + obs_data_set_double(settings, "AMF.H264.KeyframeInterval", 2.0); + obs_data_set_int(settings, "keyint_sec", 2); } void SimpleOutput::UpdateRecordingSettings_amd_cqp(int cqp) { obs_data_t *settings = obs_data_create(); + // Static Properties obs_data_set_int(settings, "AMF.H264.Usage", 0); - obs_data_set_int(settings, "AMF.H264.QualityPreset", 2); - obs_data_set_int(settings, "AMF.H264.ProfileLevel", 51); - obs_data_set_int(settings, "AMF.H264.FillerData", 0); - obs_data_set_int(settings, "AMF.H264.FrameSkipping", 0); - obs_data_set_int(settings, "AMF.H264.QP.Minimum", 0); - obs_data_set_int(settings, "AMF.H264.QP.Maximum", 51); + obs_data_set_int(settings, "AMF.H264.Profile", 100); // High + obs_data_set_string(settings, "profile", "high"); // High + obs_data_set_int(settings, "AMF.H264.ProfileLevel", 0); // Automatic + + // Rate Control Properties + obs_data_set_int(settings, "AMF.H264.RateControlMethod", 0); + obs_data_set_string(settings, "rate_control", "CQP"); obs_data_set_int(settings, "AMF.H264.QP.IFrame", cqp); obs_data_set_int(settings, "AMF.H264.QP.PFrame", cqp); obs_data_set_int(settings, "AMF.H264.QP.BFrame", cqp); - obs_data_set_int(settings, "AMF.H264.BPicture.Pattern", 3); - obs_data_set_int(settings, "AMF.H264.BPicture.Reference", 1); - obs_data_set_int(settings, "keyint_sec", 1); - obs_data_set_string(settings, "rate_control", "CQP"); - obs_data_set_string(settings, "profile", "high"); - obs_encoder_update(h264Recording, settings); + // Picture Control Properties + obs_data_set_double(settings, "AMF.H264.KeyframeInterval", 2.0); + obs_data_set_int(settings, "keyint_sec", 2); + // Update and release + obs_encoder_update(h264Recording, settings); obs_data_release(settings); } diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 9d9444b3bcf714..93eb0d4d4aab02 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -3331,9 +3331,12 @@ void OBSBasicSettings::SimpleStreamingEncoderChanged() preset = curNVENCPreset; } else if (encoder == SIMPLE_ENCODER_AMD) { - /* none */ - defaultPreset = ""; + ui->simpleOutPreset->addItem("Speed", "speed"); + ui->simpleOutPreset->addItem("Balanced", "balanced"); + ui->simpleOutPreset->addItem("Quality", "quality"); + defaultPreset = "balanced"; + preset = curAMDPreset; } else { ui->simpleOutPreset->addItem("ultrafast", "ultrafast"); ui->simpleOutPreset->addItem("superfast", "superfast"); diff --git a/UI/window-basic-settings.hpp b/UI/window-basic-settings.hpp index e3bdcfaa38f8ed..3c7b26f86bf5ae 100644 --- a/UI/window-basic-settings.hpp +++ b/UI/window-basic-settings.hpp @@ -111,6 +111,7 @@ class OBSBasicSettings : public QDialog { QString curPreset; QString curQSVPreset; QString curNVENCPreset; + QString curAMDPreset; QString curAdvStreamEncoder; QString curAdvRecordEncoder; From 8307ba1118db0e40d62e78334436f010c6cd4611 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Thu, 3 Nov 2016 20:35:11 +0100 Subject: [PATCH 71/80] enc-amf: Update to release 1.4.0.0 --- .gitmodules | 2 +- plugins/enc-amf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index cb9da4185cf595..f7b08e93fb103c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,7 +7,7 @@ url = https://github.com/palana/Syphon-Framework.git [submodule "plugins/enc-amf"] path = plugins/enc-amf - url = https://github.com/Xaymar/OBS-AMD-Advanced-Media-Framework.git + url = https://github.com/Xaymar/obs-studio_amf-encoder-plugin.git [submodule "plugins/obs-browser"] path = plugins/obs-browser url = https://github.com/kc5nra/obs-browser.git diff --git a/plugins/enc-amf b/plugins/enc-amf index 2dea2ed63e776b..cafe7bdae18421 160000 --- a/plugins/enc-amf +++ b/plugins/enc-amf @@ -1 +1 @@ -Subproject commit 2dea2ed63e776bd7a135ebb5b20875ab20b6ee31 +Subproject commit cafe7bdae18421414911bbe337534182f3b571cd From ed85b22534bfb659abacd235c9ac7809a0bdf8da Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 13:32:26 -0700 Subject: [PATCH 72/80] Update translations from CrowdIn --- UI/data/locale/ca-ES.ini | 4 + UI/data/locale/cs-CZ.ini | 4 + UI/data/locale/da-DK.ini | 44 ++++- UI/data/locale/de-DE.ini | 5 +- UI/data/locale/el-GR.ini | 8 + UI/data/locale/es-ES.ini | 3 + UI/data/locale/eu-ES.ini | 4 + UI/data/locale/fi-FI.ini | 4 + UI/data/locale/fr-FR.ini | 3 + UI/data/locale/hr-HR.ini | 5 + UI/data/locale/hu-HU.ini | 5 +- UI/data/locale/it-IT.ini | 12 ++ UI/data/locale/ja-JP.ini | 3 + UI/data/locale/ko-KR.ini | 4 + UI/data/locale/ms-MY.ini | 168 +++++++++++++++--- UI/data/locale/pl-PL.ini | 3 + UI/data/locale/pt-BR.ini | 4 + UI/data/locale/pt-PT.ini | 29 +++ UI/data/locale/ru-RU.ini | 3 + UI/data/locale/sk-SK.ini | 18 ++ UI/data/locale/sr-CS.ini | 5 + UI/data/locale/sr-SP.ini | 5 + UI/data/locale/sv-SE.ini | 2 + UI/data/locale/uk-UA.ini | 4 + UI/data/locale/vi-VN.ini | 102 +++++++++-- UI/data/locale/zh-CN.ini | 4 + UI/data/locale/zh-TW.ini | 1 + .../frontend-tools/data/locale/ca-ES.ini | 8 + .../frontend-tools/data/locale/cs-CZ.ini | 8 + .../frontend-tools/data/locale/da-DK.ini | 1 + .../frontend-tools/data/locale/de-DE.ini | 8 + .../frontend-tools/data/locale/es-ES.ini | 8 + .../frontend-tools/data/locale/eu-ES.ini | 8 + .../frontend-tools/data/locale/fi-FI.ini | 8 + .../frontend-tools/data/locale/fr-FR.ini | 8 + .../frontend-tools/data/locale/hr-HR.ini | 8 + .../frontend-tools/data/locale/hu-HU.ini | 8 + .../frontend-tools/data/locale/it-IT.ini | 19 ++ .../frontend-tools/data/locale/ja-JP.ini | 8 + .../frontend-tools/data/locale/ko-KR.ini | 8 + .../frontend-tools/data/locale/ms-MY.ini | 10 ++ .../frontend-tools/data/locale/nb-NO.ini | 7 + .../frontend-tools/data/locale/nl-NL.ini | 1 + .../frontend-tools/data/locale/pl-PL.ini | 8 + .../frontend-tools/data/locale/pt-BR.ini | 8 + .../frontend-tools/data/locale/pt-PT.ini | 19 ++ .../frontend-tools/data/locale/ru-RU.ini | 8 + .../frontend-tools/data/locale/sr-CS.ini | 8 + .../frontend-tools/data/locale/sr-SP.ini | 8 + .../frontend-tools/data/locale/sv-SE.ini | 8 + .../frontend-tools/data/locale/uk-UA.ini | 8 + .../frontend-tools/data/locale/vi-VN.ini | 16 ++ .../frontend-tools/data/locale/zh-CN.ini | 8 + .../frontend-tools/data/locale/zh-TW.ini | 8 + .../coreaudio-encoder/data/locale/ms-MY.ini | 3 + plugins/image-source/data/locale/el-GR.ini | 1 + plugins/image-source/data/locale/ms-MY.ini | 15 ++ plugins/linux-jack/data/locale/vi-VN.ini | 3 + plugins/mac-syphon/data/locale/ms-MY.ini | 6 + plugins/mac-vth264/data/locale/ms-MY.ini | 7 + plugins/obs-ffmpeg/data/locale/el-GR.ini | 1 + plugins/obs-ffmpeg/data/locale/ko-KR.ini | 2 +- plugins/obs-ffmpeg/data/locale/vi-VN.ini | 25 +++ plugins/obs-filters/data/locale/nb-NO.ini | 2 + plugins/obs-outputs/data/locale/el-GR.ini | 1 + plugins/obs-outputs/data/locale/nb-NO.ini | 1 + plugins/obs-qsv11/data/locale/el-GR.ini | 2 + plugins/obs-qsv11/data/locale/vi-VN.ini | 12 ++ plugins/obs-text/data/locale/ca-ES.ini | 4 + plugins/obs-text/data/locale/cs-CZ.ini | 4 + plugins/obs-text/data/locale/de-DE.ini | 4 + plugins/obs-text/data/locale/el-GR.ini | 6 + plugins/obs-text/data/locale/es-ES.ini | 4 + plugins/obs-text/data/locale/eu-ES.ini | 4 + plugins/obs-text/data/locale/fi-FI.ini | 4 + plugins/obs-text/data/locale/fr-FR.ini | 4 + plugins/obs-text/data/locale/hr-HR.ini | 34 ++++ plugins/obs-text/data/locale/hu-HU.ini | 4 + plugins/obs-text/data/locale/it-IT.ini | 34 ++++ plugins/obs-text/data/locale/ja-JP.ini | 4 + plugins/obs-text/data/locale/ko-KR.ini | 4 + plugins/obs-text/data/locale/nb-NO.ini | 25 +++ plugins/obs-text/data/locale/pl-PL.ini | 4 + plugins/obs-text/data/locale/ru-RU.ini | 4 + plugins/obs-text/data/locale/sr-CS.ini | 34 ++++ plugins/obs-text/data/locale/sr-SP.ini | 34 ++++ plugins/obs-text/data/locale/sv-SE.ini | 4 + plugins/obs-text/data/locale/uk-UA.ini | 4 + plugins/obs-text/data/locale/zh-CN.ini | 4 + plugins/obs-text/data/locale/zh-TW.ini | 6 + plugins/obs-transitions/data/locale/el-GR.ini | 3 + plugins/obs-x264/data/locale/ko-KR.ini | 2 +- plugins/obs-x264/data/locale/vi-VN.ini | 13 ++ plugins/text-freetype2/data/locale/ms-MY.ini | 9 + plugins/win-capture/data/locale/el-GR.ini | 1 + plugins/win-capture/data/locale/es-ES.ini | 2 +- plugins/win-capture/data/locale/it-IT.ini | 1 + plugins/win-capture/data/locale/nb-NO.ini | 1 + plugins/win-capture/data/locale/vi-VN.ini | 23 +++ plugins/win-dshow/data/locale/el-GR.ini | 2 + plugins/win-dshow/data/locale/it-IT.ini | 1 + plugins/win-dshow/data/locale/nb-NO.ini | 3 + plugins/win-dshow/data/locale/sv-SE.ini | 1 + plugins/win-mf/data/locale/vi-VN.ini | 29 +++ 104 files changed, 1042 insertions(+), 52 deletions(-) create mode 100644 UI/frontend-plugins/frontend-tools/data/locale/it-IT.ini create mode 100644 UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini create mode 100644 UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini create mode 100644 UI/frontend-plugins/frontend-tools/data/locale/pt-PT.ini create mode 100644 UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini create mode 100644 plugins/coreaudio-encoder/data/locale/ms-MY.ini create mode 100644 plugins/image-source/data/locale/ms-MY.ini create mode 100644 plugins/linux-jack/data/locale/vi-VN.ini create mode 100644 plugins/mac-syphon/data/locale/ms-MY.ini create mode 100644 plugins/mac-vth264/data/locale/ms-MY.ini create mode 100644 plugins/obs-ffmpeg/data/locale/vi-VN.ini create mode 100644 plugins/obs-qsv11/data/locale/el-GR.ini create mode 100644 plugins/obs-qsv11/data/locale/vi-VN.ini create mode 100644 plugins/obs-text/data/locale/el-GR.ini create mode 100644 plugins/obs-text/data/locale/hr-HR.ini create mode 100644 plugins/obs-text/data/locale/it-IT.ini create mode 100644 plugins/obs-text/data/locale/nb-NO.ini create mode 100644 plugins/obs-text/data/locale/sr-CS.ini create mode 100644 plugins/obs-text/data/locale/sr-SP.ini create mode 100644 plugins/obs-x264/data/locale/vi-VN.ini create mode 100644 plugins/text-freetype2/data/locale/ms-MY.ini create mode 100644 plugins/win-capture/data/locale/vi-VN.ini create mode 100644 plugins/win-mf/data/locale/vi-VN.ini diff --git a/UI/data/locale/ca-ES.ini b/UI/data/locale/ca-ES.ini index a688099a9d0691..e76b2b452d724d 100644 --- a/UI/data/locale/ca-ES.ini +++ b/UI/data/locale/ca-ES.ini @@ -49,6 +49,9 @@ Right="Dreta" Top="Part superior" Bottom="Part inferior" Reset="Restableix" +Hours="Hores" +Minutes="Minuts" +Seconds="Segons" QuickTransitions.SwapScenes="Canvia la vista prèvia i sortida d'escenes després de la transició" QuickTransitions.SwapScenesTT="Canvia la vista prèvia i sortida d'escenes després de la transició (si encara existeix l'escena original de la sortida). \nAixò no desfarà qualsevol canvi que pugui haver fet a l'escena original de la sortida." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Advertiment de qualitat sense Basic.Settings.Output.Simple.Warn.MultipleQSV="Advertència: No es poden utilitzar diversos descodificadors QSV separats en transmetre i enregistrar al mateix temps. Per transmetre i engrestriar al mateix temps, si us plau modifiqueu-los, ja sigui el codificador de gravació o el codificador de transmissió." Basic.Settings.Output.Simple.Encoder.Software="Programari (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Maquinari (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Maquinari (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Maquinari (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Programari (preconfiguració de x264 amb baix ús de CPU, augmenta la mida del fitxer)" Basic.Settings.Output.VideoBitrate="Bitrate de vídeo" diff --git a/UI/data/locale/cs-CZ.ini b/UI/data/locale/cs-CZ.ini index 35042599ab845e..0bbe9e162e6cd9 100644 --- a/UI/data/locale/cs-CZ.ini +++ b/UI/data/locale/cs-CZ.ini @@ -49,6 +49,9 @@ Right="Vpravo" Top="Nahoře" Bottom="Dole" Reset="Resetovat" +Hours="Hodiny" +Minutes="Minuty" +Seconds="Vteřiny" QuickTransitions.SwapScenes="Prohodit scény náhledu a výstupu po přechodu" QuickTransitions.SwapScenesTT="Prohodí scény náhledu a výstupu po přechodu (pokud originální výstupní scéna stále existuje).\nTato funkce nevrátí provedené změny, které byly provedeny v originální scéně výstupu." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Varování nastavené kvality! Basic.Settings.Output.Simple.Warn.MultipleQSV="Varování: Není možné použit více oddělených QSV enkodérů pro streamování a nahrávání ve stejnou dobu. Pokud chcete tuto limitaci obejít, tak změňte použitý enkodér pro streamování či nahrávání." Basic.Settings.Output.Simple.Encoder.Software="Softwarový (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardwarový (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardwarový (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardwarový (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softwarový (x264 předvolba nízkého zatížení CPU, větší soubory)" Basic.Settings.Output.VideoBitrate="Bitrate videa" diff --git a/UI/data/locale/da-DK.ini b/UI/data/locale/da-DK.ini index 251a7380804faa..b05b4a1e26f202 100644 --- a/UI/data/locale/da-DK.ini +++ b/UI/data/locale/da-DK.ini @@ -49,10 +49,16 @@ Right="Højre" Top="Top" Bottom="Bund" Reset="Nulstil" +Hours="Timer" +Minutes="Minutter" +Seconds="Sekunder" QuickTransitions.SwapScenes="Byt om på forhåndsvisning/output scener efter overgang" +QuickTransitions.SwapScenesTT="Ombytter uddrag- og output-scener efter omskiftning (hvis oprindelige output-scene stadig eksisterer).\nDette vil ikke omgøre eventuelle ændringer, der måtte været udført på den oprindelige output-scene." QuickTransitions.DuplicateScene="Dupliker scene" +QuickTransitions.DuplicateSceneTT="Muliggør, ved redigere af den samme, scene, redigering af transformering/synlighed af kilder uden at ændre på output. \nFor at rediger egenskaber for kilder uden at ændre på output, aktivér 'Duplikér Kilder'.\nÆndring af denne værd vil nulstille den nuværende output-scene (hvis den stadig findes)." QuickTransitions.EditProperties="Dupliker kilder" +QuickTransitions.EditPropertiesTT="Muliggør, ved redigering af den samme scene, redigering af egenskaber for kilder uden at ændre på output.\nDette kan kun benyttes, hvis 'Duplikér Scene' er aktiv. \nVisse kilder (såsom optagne kilder eller mediekilder) understøtter ikke dette og kan ikke redigeres separat.\nÆndring af denne værdi vil nulstille den nuværende output-scene (hvis den stadig findes).\n\nAdvarsel: Da kilder vil blive duplikeret, kan dette kræve ekstra system- eller videoressourcer." QuickTransitions.HotkeyName="Hurtig overgang: %1" Basic.AddTransition="Tilføj konfigurerbar overgang" @@ -85,6 +91,7 @@ ConfirmExit.Text="OBS er aktiv i øjeblikket. Alle streams/optagelser vil blive ConfirmRemove.Title="Bekræfte fjern" ConfirmRemove.Text="Er du sikker på du ønsker at fjerne '$1'?" +ConfirmRemove.TextMultiple="Er du sikker på at du vil fjerne %1 elementer?" Output.ConnectFail.Title="Kunne ikke oprette forbindelse" Output.ConnectFail.BadPath="Ugyldig sti eller forbindelses URL. Kontroller indstillinger for at bekræfte, at de er gyldige." @@ -116,6 +123,7 @@ LicenseAgreement.Exit="Afslut" Remux.SourceFile="OBS optagelse" Remux.TargetFile="Destinationsfil" Remux.Remux="Remux" +Remux.OBSRecording="OBS optagelse" Remux.FinishedTitle="Remuxing færdigt" Remux.Finished="Optagelse remuxed" Remux.FinishedError="Optagelse remuxed, men filen kan være ufuldstændige" @@ -141,10 +149,16 @@ Basic.DisplayCapture="Indfang display" Basic.Main.PreviewConextMenu.Enable="Aktiver visning" +ScaleFiltering="Skala filtrering" +ScaleFiltering.Point="Punkt" +ScaleFiltering.Bilinear="Bilinear" +ScaleFiltering.Bicubic="Bikubisk" +ScaleFiltering.Lanczos="Lanczos" Deinterlacing="Deinterlacing" Deinterlacing.Discard="Kassér" Deinterlacing.Retro="Retro" +Deinterlacing.Blend="Bland" Deinterlacing.Linear="Lineær" Deinterlacing.Linear2x="Lineær 2x" @@ -178,7 +192,9 @@ Basic.PropertiesWindow.ConfirmTitle="Indstillinger ændret" Basic.PropertiesWindow.Confirm="Der er ændringer, som ikke er gemt. Vil du gerne beholde dem?" Basic.PropertiesWindow.NoProperties="Ingen egenskaber tilgængelige" Basic.PropertiesWindow.AddFiles="Tilføj filer" +Basic.PropertiesWindow.AddDir="Tilføj mappe" Basic.PropertiesWindow.AddURL="Tilføj sti/url" +Basic.PropertiesWindow.AddEditableListDir="Tilføj mappe til '%1'" Basic.PropertiesWindow.AddEditableListFiles="Tilføj filer til '%1'" Basic.PropertiesWindow.AddEditableListEntry="Tilføj emne til '%1'" Basic.PropertiesWindow.EditEditableListEntry="Rediger emne fra '%1'" @@ -242,7 +258,9 @@ Basic.Main.Connecting="Forbinder..." Basic.Main.StartRecording="Start optagelse" Basic.Main.StartStreaming="Start streaming" Basic.Main.StopRecording="Stop optagelse" +Basic.Main.StoppingRecording="Stopper optagelse..." Basic.Main.StopStreaming="Stop streaming" +Basic.Main.StoppingStreaming="Stopper stream..." Basic.Main.ForceStopStreaming="Stop streaming (ignorer forsinkelse)" Basic.MainMenu.File="&Fil" @@ -261,8 +279,9 @@ Basic.MainMenu.Edit.Undo="Fortryd (&U)" Basic.MainMenu.Edit.Redo="&Redo" Basic.MainMenu.Edit.UndoAction="Fortryd $1 (&U)" Basic.MainMenu.Edit.RedoAction="&Redo $1" +Basic.MainMenu.Edit.LockPreview="&Lås forhåndsvisning" Basic.MainMenu.Edit.Transform="&Transformering" -Basic.MainMenu.Edit.Transform.EditTransform="Redigere transformering... (&E)" +Basic.MainMenu.Edit.Transform.EditTransform="Rediger transformering... (&E)" Basic.MainMenu.Edit.Transform.ResetTransform="Nulstille transformering (&R)" Basic.MainMenu.Edit.Transform.Rotate90CW="Roter 90 grader CW" Basic.MainMenu.Edit.Transform.Rotate90CCW="Roter 90 grader CCW" @@ -279,10 +298,16 @@ Basic.MainMenu.Edit.Order.MoveToTop="Flyt til &Toppen" Basic.MainMenu.Edit.Order.MoveToBottom="Flyt til &Bunden" Basic.MainMenu.Edit.AdvAudio="&Avancerede lydegenskaber" +Basic.MainMenu.View="&Vis" +Basic.MainMenu.View.Toolbars="&Værktøjslinjer" +Basic.MainMenu.View.Toolbars.Listboxes="&Listebokse" +Basic.MainMenu.View.SceneTransitions="S&cene overgange" +Basic.MainMenu.View.StatusBar="&Statuslinje" Basic.MainMenu.SceneCollection="&Scenesamling" Basic.MainMenu.Profile="&Profil" +Basic.MainMenu.Tools="Værk&tøjer" Basic.MainMenu.Help="&Hjælp" Basic.MainMenu.Help.Website="Besøg &websted" @@ -302,11 +327,17 @@ Basic.Settings.General.Theme="Tema" Basic.Settings.General.Language="Sprog" Basic.Settings.General.WarnBeforeStartingStream="Vis bekræftelses-dialog ved opstart af stream" Basic.Settings.General.WarnBeforeStoppingStream="Vis bekræftelses-dialog ved afslutning af stream" +Basic.Settings.General.HideProjectorCursor="Skjul markør over projektorer" +Basic.Settings.General.ProjectorAlwaysOnTop="Hav altid projektorer øverst" Basic.Settings.General.Snapping="Kilde justeringsfastgørelse" Basic.Settings.General.ScreenSnapping="Fastgør kilder til kanten af skærmen" Basic.Settings.General.CenterSnapping="Fastgør kilder til horisontalt og vertikalt centrum" Basic.Settings.General.SourceSnapping="Fastgør kilder til andre kilder" Basic.Settings.General.SnapDistance="Fastgørings-følsomhed" +Basic.Settings.General.RecordWhenStreaming="Optag automatisk ved streaming" +Basic.Settings.General.KeepRecordingWhenStreamStops="Bliv ved med at optage når stream stopper" +Basic.Settings.General.SysTrayEnabled="Aktiver proceslinje-ikon" +Basic.Settings.General.SysTrayWhenStarted="Minimer til proceslinjen ved start" Basic.Settings.Stream="Stream" Basic.Settings.Stream.StreamType="Streamtype" @@ -329,6 +360,7 @@ Basic.Settings.Output.Simple.RecordingQuality.HQ="Samme kvalitet, stor filstørr Basic.Settings.Output.Simple.RecordingQuality.Lossless="Tabsfri kvalitet, utrolig stor filstørrelse" Basic.Settings.Output.Simple.Encoder.Software="Software (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)" Basic.Settings.Output.VideoBitrate="Video Bitrate" Basic.Settings.Output.AudioBitrate="Audio Bitrate" @@ -409,6 +441,11 @@ Basic.Settings.Audio.EnablePushToTalk="Aktiver tryk-for-tale" Basic.Settings.Audio.UnknownAudioDevice="[Enhed ikke tilsluttet eller ikke tilgængelig]" Basic.Settings.Advanced="Avanceret" +Basic.Settings.Advanced.General.ProcessPriority="Proces prioritet" +Basic.Settings.Advanced.General.ProcessPriority.High="Høj" +Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Over normal" +Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal" +Basic.Settings.Advanced.General.ProcessPriority.Idle="Ikke aktiv" Basic.Settings.Advanced.Video.ColorFormat="Farveformat" Basic.Settings.Advanced.Video.ColorSpace="YUV farverum" Basic.Settings.Advanced.Video.ColorRange="YUV farveområde" @@ -417,6 +454,8 @@ Basic.Settings.Advanced.Video.ColorRange.Full="Fuld" Basic.Settings.Advanced.StreamDelay="Stream forsinkelse" Basic.Settings.Advanced.StreamDelay.Duration="Varighed (sekunder)" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Anslået hukommelsesbrug: %1 MB" +Basic.Settings.Advanced.Network="Netværk" +Basic.Settings.Advanced.Network.BindToIP="Bind til IP" Basic.AdvAudio="Avancerede lydegenskaber" Basic.AdvAudio.Name="Navn" @@ -432,7 +471,10 @@ Basic.Hotkeys.StartRecording="Start optagelse" Basic.Hotkeys.StopRecording="Stop optagelse" Basic.Hotkeys.SelectScene="Skift til scene" +Basic.SystemTray.Show="Vis" +Basic.SystemTray.Hide="Skjul" +Basic.SystemTray.Message.Reconnecting="Afbrudt. Forbinder igen..." Hotkeys.Insert="Insert" Hotkeys.Delete="Delete" diff --git a/UI/data/locale/de-DE.ini b/UI/data/locale/de-DE.ini index b42c6c8fb35305..711c9d3618f349 100644 --- a/UI/data/locale/de-DE.ini +++ b/UI/data/locale/de-DE.ini @@ -49,6 +49,9 @@ Right="Rechts" Top="Oben" Bottom="Unten" Reset="Zurücksetzen" +Hours="Stunde(n)" +Minutes="Minute(n)" +Seconds="Sekunde(n)" QuickTransitions.SwapScenes="Tausche Vorschau/Ausgabe-Szenen nach dem Übergang" QuickTransitions.SwapScenesTT="Vertauscht die Vorschau- und Ausgabe-Szenen nach dem Übergang (falls die ursprüngliche Ausgabe-Szene noch vorhanden ist).\nEventuelle Änderungen an der original Ausgabe-Szene werden hierbei nicht rückgängig gemacht." @@ -498,7 +501,7 @@ Basic.Hotkeys.SelectScene="Zu Szene wechseln" Basic.SystemTray.Show="Anzeigen" Basic.SystemTray.Hide="Ausblenden" -Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbinde erneut..." +Basic.SystemTray.Message.Reconnecting="Verbindung verloren. Verbinde erneut..." Hotkeys.Insert="Einfügen" Hotkeys.Delete="Entfernen" diff --git a/UI/data/locale/el-GR.ini b/UI/data/locale/el-GR.ini index 4ecdca7f21dabf..a7267d7b194593 100644 --- a/UI/data/locale/el-GR.ini +++ b/UI/data/locale/el-GR.ini @@ -8,6 +8,7 @@ Cancel="Ακύρωση" Close="Κλείσιμο" Save="Αποθήκευση" Discard="Απόρριψη" +Disable="Απενεργοποίηση" Yes="Ναι" No="Όχι" Add="Προσθήκη" @@ -39,6 +40,13 @@ New="Νέο" Duplicate="Διπλότυπη εγγραφή" Enable="Ενεργοποίηση" DisableOSXVSync="Απενεργοποίηση OSX V-Sync" +Left="Αριστερά" +Right="Δεξιά" +Top="Επάνω" +Bottom="Κάτω" +Hours="Ώρες" +Minutes="Λεπτά" +Seconds="Δευτερόλεπτα" Basic.TransitionDuration="Διάρκεια" diff --git a/UI/data/locale/es-ES.ini b/UI/data/locale/es-ES.ini index e988ac915c6dd8..f6aee20e07a91b 100644 --- a/UI/data/locale/es-ES.ini +++ b/UI/data/locale/es-ES.ini @@ -49,6 +49,9 @@ Right="Derecha" Top="Arriba" Bottom="Abajo" Reset="Reiniciar" +Hours="Horas" +Minutes="Minutos" +Seconds="Segundos" QuickTransitions.SwapScenes="Cambiar vista previa y salida escenas después de la transición" QuickTransitions.SwapScenesTT="Cambia la vista previa y salida escenas después de la transición (si todavía existe la escena original de la salida). \nEsto no deshará cualquier cambio que pueda haber hecho a la escena original de la salida." diff --git a/UI/data/locale/eu-ES.ini b/UI/data/locale/eu-ES.ini index d2ac30de9775f8..9544a5fe07ec9f 100644 --- a/UI/data/locale/eu-ES.ini +++ b/UI/data/locale/eu-ES.ini @@ -49,6 +49,9 @@ Right="Eskuinean" Top="Goian" Bottom="Behean" Reset="Berrezarri" +Hours="ordu" +Minutes="minutu" +Seconds="segundo" QuickTransitions.SwapScenes="Trukatu Aurrebista/Irteera-eszenak trantsizioen ondoren" QuickTransitions.SwapScenesTT="Trukatu aurrebistak eta irteera-eszenak trantsizioen ondoren (baldin eta irteerakoaren jatorrizkoa eszena badago).\n Honek ez du desegingo irteerakoaren jatorrizko eszenari egindako aldaketak." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Galerarik gabeko kalitateaz oh Basic.Settings.Output.Simple.Warn.MultipleQSV="Kontuz: Ezin dituzu QSV kodeatzaile ugari bananduta erabili aldiberean jariotu eta grabatzerakoan. Aldiberean jariotu eta grabatzea nahi baduzu, mesedez aldatu bietako bat, grabaketa kodeatzailea edo jariotze kodeatzailea." Basic.Settings.Output.Simple.Encoder.Software="Softwarea (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardwarea (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardwarea (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardwarea (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softwarea (x264 PUZ erabilpen apaleko aurre-ezarpena, fitxategiaren tamaina handitzen du)" Basic.Settings.Output.VideoBitrate="Bideo bit-emaria" diff --git a/UI/data/locale/fi-FI.ini b/UI/data/locale/fi-FI.ini index b8c5ff70ecc197..9d876061e04dbc 100644 --- a/UI/data/locale/fi-FI.ini +++ b/UI/data/locale/fi-FI.ini @@ -49,6 +49,9 @@ Right="Oikea" Top="Ylhäältä" Bottom="Alhaalta" Reset="Palauta" +Hours="Tuntia" +Minutes="Minuuttia" +Seconds="Sekuntia" QuickTransitions.SwapScenes="Vaihda esikatselu- ja ulostulo-skenet siirtymän jälkeen" QuickTransitions.SwapScenesTT="Vaihda esikatselu- ja ulostulo-skenet siirtymän jälkeen (jos ulostulon alkuperäinen skene on yhä olemassa).\nTämä ei peruuta muutoksia joita on tehty alkuperäiseen skeneen." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Häviötön laatu!" Basic.Settings.Output.Simple.Warn.MultipleQSV="Varoitus: Et voi käyttää useampaa QSV-enkooderia lähettäessä ja tallentaessa samaan aikaan. Jos haluat tehdä molempia yhtä aikaa, vaihda lähetys tai tallennus-enkooderi." Basic.Settings.Output.Simple.Encoder.Software="Ohjelmistopohjainen (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Laitteistopohjainen (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Laitteisto (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Laitteistopohjainen (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Ohjelmistopohjainen (x264 matala CPU-käyttö, lisää tiedostokokoa)" Basic.Settings.Output.VideoBitrate="Kuvan bitrate" diff --git a/UI/data/locale/fr-FR.ini b/UI/data/locale/fr-FR.ini index 781e993bc027a7..4aaeb6c7f1c83c 100644 --- a/UI/data/locale/fr-FR.ini +++ b/UI/data/locale/fr-FR.ini @@ -49,6 +49,9 @@ Right="À droite" Top="En haut" Bottom="En bas" Reset="Réinitialiser" +Hours="Heures" +Minutes="Minutes" +Seconds="Secondes" QuickTransitions.SwapScenes="Permuter les scènes d'aperçu et de sortie après la transition" QuickTransitions.SwapScenesTT="Permute les scènes d'aperçu et de sortie après la transition (si la scène d'origine de la sortie existe toujours). \nCela n'annulera pas les modifications qui auront pu être faites sur la scène d'origine de la sortie." diff --git a/UI/data/locale/hr-HR.ini b/UI/data/locale/hr-HR.ini index 497e1a96433d80..a1b58249528613 100644 --- a/UI/data/locale/hr-HR.ini +++ b/UI/data/locale/hr-HR.ini @@ -48,6 +48,10 @@ Left="Sleva" Right="Zdesna" Top="Odozgo" Bottom="Odozdo" +Reset="Poništi" +Hours="Sati" +Minutes="Minuta" +Seconds="Sekundi" QuickTransitions.SwapScenes="Zameni scene pregleda/izlaza nakon prelaza" QuickTransitions.SwapScenesTT="Zamenjuje scene pregleda i izlaza nakon prelaza (ako originalna scena izlaza još uvek postoji).\nOvo neće poništiti promene koje su načinjene nad originalnom scenom izlaza." @@ -368,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Upozorenje za kvalitet bez gub Basic.Settings.Output.Simple.Warn.MultipleQSV="Upozorenje: Ne možete koristi više odvojenih QSV enkodera kada emitujete i snimate u isto vreme. Ako želite da emitujete i snimate u isto vreme, molim promenite ili enkoder snimanja ili enkoder emitovanja." Basic.Settings.Output.Simple.Encoder.Software="Softverski (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Mašinski (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Mašinski (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Mašinski (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softverski (x264 niska upotreba procesora, povećava veličinu datoteke)" Basic.Settings.Output.VideoBitrate="Protok videa" diff --git a/UI/data/locale/hu-HU.ini b/UI/data/locale/hu-HU.ini index f83119b3c1427d..c249c681ea564c 100644 --- a/UI/data/locale/hu-HU.ini +++ b/UI/data/locale/hu-HU.ini @@ -49,6 +49,9 @@ Right="Jobb" Top="Felső" Bottom="Alsó" Reset="Újraindít" +Hours="Óra" +Minutes="Perc" +Seconds="Másodperc" QuickTransitions.SwapScenes="Előnézeti/Kimeneti Jelenetek cseréje átmenet után" QuickTransitions.SwapScenesTT="Az előnézet és a kimeneti jelenet cseréje átmenet után (ha a kimenet eredeti jelenete még létezik).\nEz nincs kihatással a kimenet eredeti jelenetére." @@ -309,7 +312,7 @@ Basic.MainMenu.View.StatusBar="&Állapotsor" Basic.MainMenu.SceneCollection="&Jelenet gyűjtemény" Basic.MainMenu.Profile="&Profil" -Basic.MainMenu.Tools="&Eszközők" +Basic.MainMenu.Tools="&Eszközök" Basic.MainMenu.Help="&Segítség" Basic.MainMenu.Help.Website="Weboldal meglátogatása" diff --git a/UI/data/locale/it-IT.ini b/UI/data/locale/it-IT.ini index db93731da0b015..6bd310c7779baf 100644 --- a/UI/data/locale/it-IT.ini +++ b/UI/data/locale/it-IT.ini @@ -48,6 +48,10 @@ Left="Sinistra" Right="Destra" Top="Alto" Bottom="Basso" +Reset="Reset" +Hours="Ore" +Minutes="Minuti" +Seconds="Secondi" QuickTransitions.SwapScenes="Scambia Scena Preview/Uscita dopo la Transizione" QuickTransitions.SwapScenesTT="Scambia la scena in uniscita con quella in preview dopo la transizione (ammesso che la scena in uscita originale ci sia ancora).\nQuesto non modificherà eventuali cambiamenti apportati alla scena di uscita originale." @@ -308,6 +312,7 @@ Basic.MainMenu.View.StatusBar="&Barra di stato" Basic.MainMenu.SceneCollection="&Collezione scene" Basic.MainMenu.Profile="&Profilo" +Basic.MainMenu.Tools="&Strumenti" Basic.MainMenu.Help="Aiuto (&H)" Basic.MainMenu.Help.Website="Visita il sito" @@ -328,6 +333,7 @@ Basic.Settings.General.Language="Lingua" Basic.Settings.General.WarnBeforeStartingStream="Chiedi conferma quando si avvia una diretta" Basic.Settings.General.WarnBeforeStoppingStream="Chiedi conferma quando si termina una diretta" Basic.Settings.General.HideProjectorCursor="Nascondi cursore sopra proiettori" +Basic.Settings.General.ProjectorAlwaysOnTop="Rendono i proiettori sempre in primo piano" Basic.Settings.General.Snapping="Allineamento Snapping Source" Basic.Settings.General.ScreenSnapping="Snap source nei bordi dello schermo" Basic.Settings.General.CenterSnapping="Snap source al centro orizzontale e verticale" @@ -335,6 +341,8 @@ Basic.Settings.General.SourceSnapping="Snap sources ad altre sources" Basic.Settings.General.SnapDistance="Sensibilità Snap" Basic.Settings.General.RecordWhenStreaming="Registra automaticamente quando si è in diretta" Basic.Settings.General.KeepRecordingWhenStreamStops="Continua a registrare quando la diretta s'interrompe" +Basic.Settings.General.SysTrayEnabled="Abilita icona area di notifica" +Basic.Settings.General.SysTrayWhenStarted="Minimizza all'area di notifica all'avvio" Basic.Settings.Stream="Stream" Basic.Settings.Stream.StreamType="Tipo di stream" @@ -364,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Avviso sulla qualità lossless Basic.Settings.Output.Simple.Warn.MultipleQSV="Attenzione: Non è possibile usare più encoder QSV quando si è in diretta e si registra allo stesso tempo. Se vuoi andare in diretta e registrare allo stesso tempo, cambia l'encoder per la registrazione o l'encoder per la diretta." Basic.Settings.Output.Simple.Encoder.Software="Software (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (x264 Preset con basso utilizzo della CPU, aumenta le dimensioni del file)" Basic.Settings.Output.VideoBitrate="Bitrate video" @@ -489,7 +498,10 @@ Basic.Hotkeys.StartRecording="Inizia registrazione" Basic.Hotkeys.StopRecording="Ferma registrazione" Basic.Hotkeys.SelectScene="Passa alla scena" +Basic.SystemTray.Show="Mostra" +Basic.SystemTray.Hide="Nascondi" +Basic.SystemTray.Message.Reconnecting="Disconnesso. Riconnessione..." Hotkeys.Insert="Ins" Hotkeys.Delete="Canc" diff --git a/UI/data/locale/ja-JP.ini b/UI/data/locale/ja-JP.ini index 9fcd29c2429c43..76a6239fb8f572 100644 --- a/UI/data/locale/ja-JP.ini +++ b/UI/data/locale/ja-JP.ini @@ -49,6 +49,9 @@ Right="右" Top="上" Bottom="下" Reset="リセット" +Hours="時間" +Minutes="分" +Seconds="秒" QuickTransitions.SwapScenes="トランジション後にプレビュー/出力シーンを入れ替え" QuickTransitions.SwapScenesTT="(出力のオリジナルシーンがまだ存在する場合)、トランジション後のプレビューと出力シーンを入れ替えます。\nこれは出力のオリジナルシーンに加えられた可能性があるすべての変更を元に戻しません。" diff --git a/UI/data/locale/ko-KR.ini b/UI/data/locale/ko-KR.ini index 50353f0b588034..7dd16bd54fb043 100644 --- a/UI/data/locale/ko-KR.ini +++ b/UI/data/locale/ko-KR.ini @@ -49,6 +49,9 @@ Right="오른쪽" Top="위" Bottom="아래" Reset="초기화" +Hours="시" +Minutes="분" +Seconds="초" QuickTransitions.SwapScenes="전환 후 미리 보기/출력 장면을 교체" QuickTransitions.SwapScenesTT="(만약 출력 쪽 원본 장면이 있을 때) 전환 작업 이후 미리 보기와 출력 장면을 교체합니다. \n출력 쪽 원본 장면에서 변경한 내용은 사라지지 않습니다." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="무손실 품질 설정 경고 Basic.Settings.Output.Simple.Warn.MultipleQSV="경고: 방송과 녹화를 동시에 하고 있을 때 여러 개의 독립된 QSV 인코더를 사용할 수 없습니다. 두 작업을 동시에 하려면 녹화 혹은 방송 인코더 둘 중 하나를 바꿔야 합니다." Basic.Settings.Output.Simple.Encoder.Software="소프트웨어 (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="하드웨어 (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="하드웨어 (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="하드웨어 (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="소프트웨어 (x264 CPU 부담이 적지만 파일 크기가 증가)" Basic.Settings.Output.VideoBitrate="비디오 비트레이트" diff --git a/UI/data/locale/ms-MY.ini b/UI/data/locale/ms-MY.ini index 3970dbb0fe6ae8..a9fada0091ead4 100644 --- a/UI/data/locale/ms-MY.ini +++ b/UI/data/locale/ms-MY.ini @@ -23,11 +23,11 @@ Settings="Tetapan" Display="Paparan" Name="Nama" Exit="Keluar" -Mixer="Pengadun(suara)" +Mixer="Pengadun suara" Browse="Cari" Mono="Mono" Stereo="Stereo" -DroppedFrames="Gambar-gambar Terjatuh %1 (%2%)" +DroppedFrames="%1 Gambar Hilang (%2%)" PreviewProjector="Paparan Projektor penuh (Pratonton)" SceneProjector="Paparan Projektor penuh (Adegan)" SourceProjector="Paparan Projektor penuh (Sumber)" @@ -36,29 +36,33 @@ Revert="Ubah kembali" Show="Tunjuk" Hide="Sembunyi" Untitled="Tiada tajuk" -New="Baru" -Duplicate="Salin" +New="Baharu" +Duplicate="Salin semula" Enable="Benarkan" -DisableOSXVSync="Nyahaktifkan OSX V-Sync" -ResetOSXVSyncOnExit="Tetapkan semula OSX V-Sync apabila keluar" -HighResourceUsage="Pengekodan terbeban! Cuba turunkan tetapan video ataupun gunakan pratetapan pengekodan yang lebih cepat." +DisableOSXVSync="Nyahaktifkan V-Sync OSX" +ResetOSXVSyncOnExit="Set semula OSX V-Sync apabila keluar" +HighResourceUsage="Pengekodan terbeban! Cuba turunkan tetapan video ataupun gunakan pratetap pengekodan yang lebih laju." Transition="Peralihan" QuickTransitions="Peralihan Pantas" Left="Kiri" Right="Kanan" Top="Atas" Bottom="Bawah" +Reset="Set semula" +Hours="Jam" +Minutes="Minit" +Seconds="Saat" -QuickTransitions.SwapScenes="Tukar Pratonton/Output Adegan-adegan Selepas Peralihan" -QuickTransitions.SwapScenesTT="Menukarkan pratonton dan output adegan-adegan sleeps peralihan(jika output adegan mash wujud).\nIni tidak akan mengundurkan semarang perubahan yang mungkin telah dibuat pada output adegan yang asal." +QuickTransitions.SwapScenes="Tukar Pratonton/Pengeluaran Adegan Selepas Peralihan" +QuickTransitions.SwapScenesTT="Menukarkan pratonton dan pengeluaran adegan-adegan selepas peralihan(jika pengeluaran adegan mash wujud).\nIni tidak akan mengundurkan sebarang perubahan yang mungkin telah dilakukan pada pengeluaran adegan yang asal." QuickTransitions.DuplicateScene="Klonkan Adegan" -QuickTransitions.DuplicateSceneTT="Apabila menyunting adegan yang sama, ini membolehkan penyuntingan perubahan/keterlihatan tanpa mengubah output..\nUntuk edit sifat-sifat adegan-adegan tanpa mengubah suai output, aktifkan 'Klonkan Adegan'.\nPengubahan nilai ini akan menetapkan semula output adegan (jika adegan masih wujud)." +QuickTransitions.DuplicateSceneTT="Apabila menyunting adegan yang sama, ini membolehkan penyuntingan perubahan/keterlihatan tanpa mengubah pengeluaran.\nUntuk edit sifat-sifat adegan tanpa mengubah suai pengeluaran, aktifkan 'Klonkan Adegan'.\nPengubahan nilai ini akan menetapkan semula pengeluaran adegan (jika adegan masih wujud)." QuickTransitions.EditProperties="Klonkan Sumber" -QuickTransitions.EditPropertiesTT="Apabila menyunting adegan yang sama, ini membolehkan penyuntingan sumber-sumber tanpa mengubah output.\nIni hanya boleh dilakukan jika 'Klonkan Adegan' diaktifkan.\nSebahagian sumber (seperti sumber-sumber tangkapan atau media) tidak menyokong tetapan ini dan tidak boleh disunting secara berasingan.\nPenukaran nilai ini akan menetapkan semula output adegan yang sedang digunakan (jika adegan masih wujud).\n\nAmaran: Kerana sumber-sumber akan diklonkan, ini mungkin memerlukan penambahan sumber-sumber sistem/video." +QuickTransitions.EditPropertiesTT="Apabila menyunting adegan yang sama, ini membolehkan penyuntingan sumber-sumber tanpa mengubah pengeluaran.\nIni hanya boleh dilakukan jika 'Klonkan Adegan' diaktifkan.\nSebahagian sumber (seperti sumber-sumber penangkapan atau media) tidak menyokong tetapan ini dan tidak boleh disunting secara berasingan.\nPenukaran nilai ini akan menetapkan semula pengeluaran adegan yang sedang digunakan (jika adegan masih wujud).\n\nAmaran: Pilihan ini mungkin memerlukan sumber-sumber sistem/audio tambahan kerana sumber-sumber akan diklonkan." QuickTransitions.HotkeyName="Peralihan Pantas: %1" -Basic.AddTransition="Tambah Peralihan Yang Boleh Diubahsuai" -Basic.RemoveTransition="Buang Peralihan Yang Boleh Diubahsuai" +Basic.AddTransition="Tambah Peralihan yang Boleh Diubahsuai" +Basic.RemoveTransition="Buang Peralihan yang Boleh Diubahsuai" Basic.TransitionProperties="Sifat-sifat Peralihan" Basic.SceneTransitions="Peralihan-peralihan Adegan" Basic.TransitionDuration="Tempoh" @@ -87,24 +91,26 @@ ConfirmExit.Text="OBS kini sedang aktif. Semua 'stream'/rakaman akan ditutup. Ad ConfirmRemove.Title="Pengesahan untuk Buang" ConfirmRemove.Text="Adakah anda pasti untuk buang '$1'?" +ConfirmRemove.TextMultiple="Adakah anda yakin untuk buang %1 barang?" Output.ConnectFail.Title="Penyambungan gagal" Output.ConnectFail.BadPath="Sambungan URL atau Laluan yang tidak sah. Sila semak semula tetapan anda to mengesahkan bahawa semuanya sah." Output.ConnectFail.ConnectFailed="Penyambungan ke pelayan gagal" +Output.ConnectFail.InvalidStream="Tidak dapat mencapai saluran yang ditetapkan/kata kunci 'stream', sila semak semula kata kunci 'stream'. Jika ia betul, kemungkinan ada masalah menyambung kepada pelayan." Output.ConnectFail.Error="Ralat tidak dijangka berlaku sewaktu percubaan menyambung ke pelayan. Maklumat lanjut di dalam fail log." Output.ConnectFail.Disconnected="Terputus daripada pelayan." Output.RecordFail.Title="Gagal memulakan rakaman" -Output.RecordFail.Unsupported="Output format adalah tidak disokong atau tidak membenarkan lebih daripada satu 'audio track'. Sila semak tetapan anda dan cuba lagi." +Output.RecordFail.Unsupported="Format pengeluaran tidak disokong atau tidak membenarkan lebih daripada satu trek audio. Sila semak tetapan anda dan cuba lagi." Output.RecordNoSpace.Title="Ruang simpanan tidak cukup" Output.RecordNoSpace.Msg="Tiada ruang simpanan yang cukup untuk meneruskan rakaman." Output.RecordError.Title="Ralat rakaman" Output.RecordError.Msg="Ralat yang tidak ditetapkan berlaku semasa rakaman." Output.BadPath.Title="Laluan Fail Rosak" -Output.BadPath.Text="Laluan output fail yang dikonfigurasikan tidak sah.Sila semak semula tetapan anda untuk mengesahkan laluan fail yang sah telah ditetapkan." +Output.BadPath.Text="Laluan pengeluaran fail yang dikonfigurasikan tidak sah. Sila semak semula tetapan anda untuk mengesahkan laluan fail yang sah telah ditetapkan." -LogReturnDialog="Memuat naik Log Berjaya" +LogReturnDialog="Muat naik Log Berjaya" LogReturnDialog.CopyURL="Salin URL" LogReturnDialog.ErrorUploadingLog="Ralat memuat naikkan fail log" @@ -115,30 +121,51 @@ LicenseAgreement.IAgree="Saya Setuju" LicenseAgreement.Exit="Keluar" Remux.SourceFile="Rakaman OBS" -Remux.TargetFile="Fail sasaran" +Remux.TargetFile="Fail Sasaran" +Remux.Remux="Tukar format" Remux.OBSRecording="Rakaman OBS" +Remux.FinishedTitle="Penukaran format selesai" +Remux.Finished="Format rakaman ditukar" +Remux.FinishedError="Format rakaman ditukar, tetapi fail itu mungkin tidak lengkap" Remux.SelectRecording="Pilih Rakaman OBS …" Remux.SelectTarget="Pilih fail sasaran …" Remux.FileExistsTitle="Fail sasaran wujud" Remux.FileExists="Fail sasaran wujud, adakah anda mahu gantikannya?" +Remux.ExitUnfinishedTitle="Penukaran format sedang dijalankan" +Remux.ExitUnfinished="Penukaran format masih belum selesai, menghentikannya sekarang boleh menyebabkan fail sasaran tidak boleh digunakan.\nAdakah anda pasti untuk memberhentikan proses ini?" UpdateAvailable="Ada Versi Baru" UpdateAvailable.Text="Versi %1.%2.%3 kini ada. Klik sini untuk memuat turun" Basic.DesktopDevice1="Audio Desktop" -Basic.DesktopDevice2="Audio Desktop" +Basic.DesktopDevice2="Audio Desktop 2" Basic.AuxDevice1="Mic/Aux" Basic.AuxDevice2="Mic/Aux 2" Basic.AuxDevice3="Mic/Aux 3" Basic.AuxDevice4="Mic/Aux 4" Basic.Scene="Adegan" +Basic.DisplayCapture="Paparan Penuh" Basic.Main.PreviewConextMenu.Enable="Benarkan Pratonton" +ScaleFiltering="Skala Tapisan" +ScaleFiltering.Point="Point" +ScaleFiltering.Bilinear="Bilinear" +ScaleFiltering.Bicubic="Bicubic" +ScaleFiltering.Lanczos="Lanczos" +Deinterlacing="Deinterlacing" +Deinterlacing.Discard="Discard" Deinterlacing.Retro="Retro" +Deinterlacing.Blend="Blend" +Deinterlacing.Blend2x="Blend 2x" Deinterlacing.Linear="Linear" +Deinterlacing.Linear2x="Linear 2x" +Deinterlacing.Yadif="Yadif" +Deinterlacing.Yadif2x="Yadif 2x" +Deinterlacing.TopFieldFirst="Bahagian Atas Dahulu" +Deinterlacing.BottomFieldFirst="Bahagian Bawah Dahulu" Basic.Main.AddSceneDlg.Title="Tambah Adegan" Basic.Main.AddSceneDlg.Text="Sila taip nama adegan" @@ -170,14 +197,16 @@ Basic.PropertiesWindow.ConfirmTitle="Perubahan Tetapan" Basic.PropertiesWindow.Confirm="Ada perubahan yang belum disimpan. Adakah anda mahu menyimpannya?" Basic.PropertiesWindow.NoProperties="Tiada sifat-sifat disediakan" Basic.PropertiesWindow.AddFiles="Tambah Fail-Fail" +Basic.PropertiesWindow.AddDir="Tambah Direktori" Basic.PropertiesWindow.AddURL="Tambah laluan/URL" +Basic.PropertiesWindow.AddEditableListDir="Tambah direktori ke '%1'" Basic.PropertiesWindow.AddEditableListFiles="Tambah fail ke '%1'" Basic.PropertiesWindow.AddEditableListEntry="Tambah entri ke '%1'" Basic.PropertiesWindow.EditEditableListEntry="Sunting entri daripada '%1'" -Basic.PropertiesView.FPS.Simple="Nilai-nilai mudah FPS" -Basic.PropertiesView.FPS.Rational="Nilai-nilai pecahan FPS" -Basic.PropertiesView.FPS.ValidFPSRanges="Julat sah FPS:" +Basic.PropertiesView.FPS.Simple="Nilai-nilai FPS mudah" +Basic.PropertiesView.FPS.Rational="Nilai-nilai FPS pecahan" +Basic.PropertiesView.FPS.ValidFPSRanges="Julat FPS sah:" Basic.InteractionWindow="Berinteraksi dengan '%1'" @@ -201,6 +230,8 @@ Basic.TransformWindow="Pengubahan Item Adegan" Basic.TransformWindow.Position="Kedudukan" Basic.TransformWindow.Rotation="Pusingan" Basic.TransformWindow.Size="Saiz" +Basic.TransformWindow.Alignment="Kedudukan Penjajaran" +Basic.TransformWindow.Crop="Potong" Basic.TransformWindow.Alignment.TopLeft="Kiri Atas" Basic.TransformWindow.Alignment.TopCenter="Tengah Atas" @@ -224,13 +255,16 @@ Basic.Main.Connecting="Menyambung..." Basic.Main.StartRecording="Mula rakaman" Basic.Main.StartStreaming="Mula 'streaming'" Basic.Main.StopRecording="Hentikan rakaman" +Basic.Main.StoppingRecording="Menghentikan rakaman..." Basic.Main.StopStreaming="Hentikan 'streaming'" +Basic.Main.StoppingStreaming="Menghentikan 'streaming'..." Basic.Main.ForceStopStreaming="Berhenti 'streaming' (buang kelewatan)" Basic.MainMenu.File="&Fail" Basic.MainMenu.File.Export="&Export" Basic.MainMenu.File.Import="&Import" Basic.MainMenu.File.ShowRecordings="Papar &Rakaman" +Basic.MainMenu.File.Remux="Format& rakaman" Basic.MainMenu.File.Settings="&Tetapan" Basic.MainMenu.File.ShowSettingsFolder="Tunjukkan Folder Tetapan" Basic.MainMenu.File.ShowProfileFolder="Tunjukkan Folder Profil" @@ -242,11 +276,14 @@ Basic.MainMenu.Edit.Undo="&Ubah Balik" Basic.MainMenu.Edit.Redo="Buat Semula (&R)" Basic.MainMenu.Edit.UndoAction="&Ubah Balik $1" Basic.MainMenu.Edit.RedoAction="&Ubah Semula $1" +Basic.MainMenu.Edit.LockPreview="&Kunci Pratonton" Basic.MainMenu.Edit.Transform="&Ubah" Basic.MainMenu.Edit.Transform.EditTransform="&Sunting Perubahan..." Basic.MainMenu.Edit.Transform.Rotate90CW="Putarkan 90 darjah mengikut arah jam" Basic.MainMenu.Edit.Transform.Rotate90CCW="Putarkan 90 darjah melawan arah jam" Basic.MainMenu.Edit.Transform.Rotate180="Putarkan 180 darjah" +Basic.MainMenu.Edit.Transform.FlipHorizontal="Flip secara &Mendatar" +Basic.MainMenu.Edit.Transform.FlipVertical="Flip secara &Menegak" Basic.MainMenu.Edit.Transform.FitToScreen="&Muat di skrin" Basic.MainMenu.Edit.Transform.StretchToScreen="&Regangkan ke skrin" Basic.MainMenu.Edit.Order.MoveUp="Gerakkan ke &atas" @@ -260,8 +297,11 @@ Basic.MainMenu.Help.Website="Lawat laman &Web" Basic.MainMenu.Help.Logs="Fail &Log" Basic.MainMenu.Help.Logs.ShowLogs="&Tunjukkan Fail-Fail Log" Basic.MainMenu.Help.Logs.UploadCurrentLog="Muat naik Fail Log &Kini" +Basic.MainMenu.Help.Logs.UploadLastLog="Muat naik &Fail Log Terakhir" +Basic.MainMenu.Help.Logs.ViewCurrentLog="&Paparkan Log Semasa" Basic.MainMenu.Help.CheckForUpdates="Semak Versi Baharu" +Basic.Settings.ProgramRestart="Program ini mesti dimulakan semula untuk tetapan-tetapan ini berkesan." Basic.Settings.ConfirmTitle="Sahkan Perubahan" Basic.Settings.Confirm="Anda mempunyai perubahan yang tidak disimpan. Simpan perubahan?" @@ -270,38 +310,112 @@ Basic.Settings.General.Theme="Tema" Basic.Settings.General.Language="Bahasa" Basic.Settings.General.WarnBeforeStartingStream="Tunjukkan dialog pengesahan ketika memulakan 'stream'" Basic.Settings.General.WarnBeforeStoppingStream="Tunjukkan dialog pengesahan ketika menghentikan 'stream'" +Basic.Settings.General.HideProjectorCursor="Sembunyikan tetikus atas projektor" +Basic.Settings.General.ProjectorAlwaysOnTop="Jadikan projektor sentiasa di atas" +Basic.Settings.General.SnapDistance="Kepekaan 'snap'" +Basic.Settings.General.RecordWhenStreaming="Rakam apabila 'streaming' secara automatik" +Basic.Settings.General.KeepRecordingWhenStreamStops="Tetap rakam selepas 'stream' berhenti" Basic.Settings.Stream="'Stream'" Basic.Settings.Stream.StreamType="Jenis 'Stream'" +Basic.Settings.Output="Hasil" Basic.Settings.Output.Format="Format Rakaman" Basic.Settings.Output.SelectFile="Pilih Fail Rakaman" +Basic.Settings.Output.EnforceBitrate="Kuatkuasakan had nilai bit perkhidmatan 'streaming'" +Basic.Settings.Output.Mode.Simple="Mudah" +Basic.Settings.Output.Mode.Adv="Lanjutan" Basic.Settings.Output.Simple.RecordingQuality="Kualiti Rakaman" Basic.Settings.Output.Simple.RecordingQuality.Stream="Sama seperti 'stream'" Basic.Settings.Output.Simple.Encoder.Software="Perisian (x264)" +Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hardware (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hardware (AMD)" +Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hardware (NVENC)" +Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Software (Preset x264: pengunaan CPU rendah, menaikkan saiz fail)" +Basic.Settings.Output.VideoBitrate="Nilai Bit Video" +Basic.Settings.Output.AudioBitrate="Nilai Bit Audio" Basic.Settings.Output.Reconnect="Sambung semula secara automatik" Basic.Settings.Output.RetryDelay="Kelewatan Percubaan (saat)" Basic.Settings.Output.MaxRetries="Cubaan Maksimum" +Basic.Settings.Output.Adv.AudioTrack="Trek Audio" +Basic.Settings.Output.Adv.Streaming="'Streaming'" +Basic.Settings.Output.Adv.Audio.Track1="Trek 1" +Basic.Settings.Output.Adv.Audio.Track2="Trek 2" +Basic.Settings.Output.Adv.Audio.Track3="Trek 3" +Basic.Settings.Output.Adv.Audio.Track4="Trek 4" Basic.Settings.Output.Adv.Recording="Rakaman" Basic.Settings.Output.Adv.Recording.Type="Jenis" +Basic.Settings.Output.Adv.Recording.Type.Standard="Bias" +Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Gantikan jika fail wujud" Basic.Settings.Output.Adv.FFmpeg.Type="Jenis Output FFmpeg" +Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Semua Fail" +Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Laluan fail atau URL" +Basic.Settings.Output.Adv.FFmpeg.FormatAudio="Audio" +Basic.Settings.Output.Adv.FFmpeg.FormatVideo="Video" +Basic.Settings.Output.Adv.FFmpeg.FormatDefault="Format Asal" +Basic.Settings.Audio.EnablePushToMute="Benarkan Tekan-untuk-senyap" +Basic.Settings.Audio.PushToMuteDelay="Kelewatan Tekan-untuk-senyap" +Basic.Settings.Audio.EnablePushToTalk="Benarkan Tekan-untuk-cakap" +Basic.Settings.Audio.PushToTalkDelay="Kelewatan Tekan-untuk-cakap" +Basic.Settings.Audio.UnknownAudioDevice="[Peranti tidak disambung atau tiada]" +Basic.Settings.Advanced="Lanjutan" +Basic.Settings.Advanced.General.ProcessPriority="Keutamaan Proses" +Basic.Settings.Advanced.General.ProcessPriority.High="Tinggi" +Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Atas Normal" +Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal" Basic.Settings.Advanced.FormatWarning="Amaran:Format warna selain daripada 'NV12' lebih digunakan untuk rakaman,dan tidak disyorkan apabila 'streaming'.'Streaming' mungkin menyebabkan peningkatan penggunaan CPU disebabkan oleh penukaran format warna." - - - - - - +Basic.Settings.Advanced.Video.ColorFormat="Format Warna" +Basic.Settings.Advanced.Video.ColorRange.Partial="Sebahagian" +Basic.Settings.Advanced.Video.ColorRange.Full="Penuh" +Basic.Settings.Advanced.StreamDelay="Kelewatan 'Stream'" +Basic.Settings.Advanced.StreamDelay.MemoryUsage="Anggaran Penggunaan Memori: %1 MB" +Basic.Settings.Advanced.Network="Rangkaian" + +Basic.AdvAudio.Name="Nama" +Basic.AdvAudio.AudioTracks="Trek-trek" + +Basic.Settings.Hotkeys="Kekunci Pantas" + +Basic.Hotkeys.StartStreaming="Mula 'Streaming'" +Basic.Hotkeys.StartRecording="Mula Rakaman" +Basic.Hotkeys.StopRecording="Hentikan Rakaman" + +Basic.SystemTray.Show="Papar" +Basic.SystemTray.Hide="Sembunyi" + +Basic.SystemTray.Message.Reconnecting="Terputus. Menyambung semula..." + +Hotkeys.Insert="Insert" +Hotkeys.Delete="Delete" +Hotkeys.Home="Home" +Hotkeys.End="End" +Hotkeys.PageUp="Page Up" +Hotkeys.PageDown="Page Down" +Hotkeys.NumLock="Num Lock" +Hotkeys.ScrollLock="Scroll Lock" +Hotkeys.CapsLock="Caps Lock" +Hotkeys.Backspace="Backspace" +Hotkeys.Tab="Tab" +Hotkeys.Print="Print" +Hotkeys.Pause="Pause" +Hotkeys.Left="Left" +Hotkeys.Right="Right" +Hotkeys.Up="Up" +Hotkeys.Down="Down" +Hotkeys.Windows="Windows" Hotkeys.NumpadDecimal="Perpuluhan Numpad" +Mute="Senyap" +Push-to-mute="Tekan-untuk-senyap" +Push-to-talk="Tekan-untuk-cakap" diff --git a/UI/data/locale/pl-PL.ini b/UI/data/locale/pl-PL.ini index 14018ad8a741eb..54e48b87347ea0 100644 --- a/UI/data/locale/pl-PL.ini +++ b/UI/data/locale/pl-PL.ini @@ -49,6 +49,9 @@ Right="Od prawej" Top="Od góry" Bottom="Od dołu" Reset="Reset" +Hours="Godziny" +Minutes="Minuty" +Seconds="Sekundy" QuickTransitions.SwapScenes="Zamień podgląd/wyjście scen po przejściu" QuickTransitions.SwapScenesTT="Zamienia podgląd i wyjście scen po przejściu (jeżeli wyjście oryginalnej sceny istnieje).\nNie przywraca to zmian jakie zostały dokonane w oryginalnej scenie." diff --git a/UI/data/locale/pt-BR.ini b/UI/data/locale/pt-BR.ini index 15cf8d3a822a88..7f850ef21a752b 100644 --- a/UI/data/locale/pt-BR.ini +++ b/UI/data/locale/pt-BR.ini @@ -48,6 +48,10 @@ Left="Esquerda" Right="Direita" Top="Topo" Bottom="Baixo" +Reset="Repor" +Hours="Horas" +Minutes="Minutos" +Seconds="Segundos" QuickTransitions.SwapScenes="Trocar Cenas de Prévia/Saída após a Transição" QuickTransitions.SwapScenesTT="Troca a preview e a saída após transicionar (se a a cena original de saída ainda exisitr).\nIsto não irá desfazer nenhuma mudança que foi feita na cena original da saída." diff --git a/UI/data/locale/pt-PT.ini b/UI/data/locale/pt-PT.ini index 6edac0afe567ec..6e516a5236a782 100644 --- a/UI/data/locale/pt-PT.ini +++ b/UI/data/locale/pt-PT.ini @@ -48,6 +48,10 @@ Left="Esquerda" Right="Direita" Top="Cima" Bottom="Baixo" +Reset="Repor" +Hours="Horas" +Minutes="Minutos" +Seconds="Segundos" QuickTransitions.SwapScenes="Trocar pré-visualização/saída de cenas Depois de uma Transição" QuickTransitions.DuplicateScene="Duplicar cena" @@ -85,6 +89,7 @@ ConfirmExit.Text="O OBS está ligado. Todas as transmissões e gravações serã ConfirmRemove.Title="Comfirmar Remover" ConfirmRemove.Text="Tem a certeza que quer remover '$1'?" +ConfirmRemove.TextMultiple="Tem a certeza de que pretende remover %1 itens?" Output.ConnectFail.Title="Falha ao ligar" Output.ConnectFail.BadPath="Caminho ou endereço de ligação inválido. Por favor, verifique as suas definições para confirmar que são válidas." @@ -185,7 +190,9 @@ Basic.PropertiesWindow.ConfirmTitle="Definições alteradas" Basic.PropertiesWindow.Confirm="Há alterações não guardadas. Pretende mantê-las?" Basic.PropertiesWindow.NoProperties="Sem propriedades disponíveis" Basic.PropertiesWindow.AddFiles="Adicionar ficheiros" +Basic.PropertiesWindow.AddDir="Adicionar diretório" Basic.PropertiesWindow.AddURL="Adicionar caminho ou endereço" +Basic.PropertiesWindow.AddEditableListDir="Adicionar diretório a '%1'" Basic.PropertiesWindow.AddEditableListFiles="Adicionar ficheiros a '%1'" Basic.PropertiesWindow.AddEditableListEntry="Adicionar entrada a '%1'" Basic.PropertiesWindow.EditEditableListEntry="Editar entrada a '%1'" @@ -249,7 +256,9 @@ Basic.Main.Connecting="A ligar..." Basic.Main.StartRecording="Começar Gravação" Basic.Main.StartStreaming="Iniciar transmissão" Basic.Main.StopRecording="Parar Gravação" +Basic.Main.StoppingRecording="A parar gravação..." Basic.Main.StopStreaming="Parar transmissão" +Basic.Main.StoppingStreaming="A parar transmissão..." Basic.Main.ForceStopStreaming="Parar transmissão (ignorar atraso)" Basic.MainMenu.File="&Ficheiro" @@ -268,6 +277,7 @@ Basic.MainMenu.Edit.Undo="Desfazer" Basic.MainMenu.Edit.Redo="&Refazer" Basic.MainMenu.Edit.UndoAction="Desfazer $1" Basic.MainMenu.Edit.RedoAction="&Refazer $1" +Basic.MainMenu.Edit.LockPreview="B&loquear pré-visualização" Basic.MainMenu.Edit.Transform="&Transformar" Basic.MainMenu.Edit.Transform.EditTransform="&Editar Transformação..." Basic.MainMenu.Edit.Transform.ResetTransform="&Reset Transform" @@ -286,10 +296,15 @@ Basic.MainMenu.Edit.Order.MoveToTop="Mover para p &Topo" Basic.MainMenu.Edit.Order.MoveToBottom="Mover para o Fundo" Basic.MainMenu.Edit.AdvAudio="Propriedades &avançadas de áudio" +Basic.MainMenu.View="&Ver" +Basic.MainMenu.View.Toolbars="Barras de ferramen&tas" +Basic.MainMenu.View.SceneTransitions="Transições de &cenas" +Basic.MainMenu.View.StatusBar="&Barra de estado" Basic.MainMenu.SceneCollection="Coleção de cena" Basic.MainMenu.Profile="&Perfil" +Basic.MainMenu.Tools="&Ferramentas" Basic.MainMenu.Help="&Ajuda" Basic.MainMenu.Help.Website="Visitar &website" @@ -311,6 +326,10 @@ Basic.Settings.General.WarnBeforeStartingStream="Mostrar caixa de diálogo de co Basic.Settings.General.WarnBeforeStoppingStream="Mostrar caixa de diálogo de confirmação ao parar transmissões" Basic.Settings.General.Snapping="Alinhamentos com encaixe na Cena" Basic.Settings.General.SnapDistance="Sensibilidade do Snap" +Basic.Settings.General.RecordWhenStreaming="Gravar automaticamente quando estiver a transmitir" +Basic.Settings.General.KeepRecordingWhenStreamStops="Continuar a gravar quando a transmissão parar" +Basic.Settings.General.SysTrayEnabled="Ativar ícone da área de notificações" +Basic.Settings.General.SysTrayWhenStarted="Minimizar para a área de notificações quando iniciado" Basic.Settings.Stream="Transmissão" Basic.Settings.Stream.StreamType="Tipo de transmissão" @@ -423,6 +442,11 @@ Basic.Settings.Audio.PushToTalkDelay="Atraso do push-to-talk" Basic.Settings.Audio.UnknownAudioDevice="[Dispositivo não conectado ou não disponível]" Basic.Settings.Advanced="Avançado" +Basic.Settings.Advanced.General.ProcessPriority="Prioridade do precesso" +Basic.Settings.Advanced.General.ProcessPriority.High="Alta" +Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Acima do normal" +Basic.Settings.Advanced.General.ProcessPriority.Normal="Normal" +Basic.Settings.Advanced.General.ProcessPriority.Idle="Inativo" Basic.Settings.Advanced.FormatWarning="Aviso: Formatos de cor diferentes de NV12 destinam-se principalmente a gravação e não são recomendados durante a transmissão. A transmissão pode incorrer numa maior utilização do processador devido à conversão do formato de cor." Basic.Settings.Advanced.Audio.BufferingTime="Tempo de carregamento do áudio" Basic.Settings.Advanced.Video.ColorFormat="Formato de cor" @@ -434,6 +458,8 @@ Basic.Settings.Advanced.StreamDelay="Atraso na trasmissão" Basic.Settings.Advanced.StreamDelay.Duration="Duração (segundos)" Basic.Settings.Advanced.StreamDelay.Preserve="Preservar o ponto de corte (aumentar atraso) quando reconectar" Basic.Settings.Advanced.StreamDelay.MemoryUsage="Utilização estimada de memória: %1 MB" +Basic.Settings.Advanced.Network="Rede" +Basic.Settings.Advanced.Network.BindToIP="Ligar pelo IP" Basic.AdvAudio="Propriedades avançadas de áudio" Basic.AdvAudio.Name="Nome" @@ -452,7 +478,10 @@ Basic.Hotkeys.StartRecording="Iniciar gravação" Basic.Hotkeys.StopRecording="Parar gravação" Basic.Hotkeys.SelectScene="Mudar para cena" +Basic.SystemTray.Show="Mostrar" +Basic.SystemTray.Hide="Ocultar" +Basic.SystemTray.Message.Reconnecting="Desligado. A religar..." Hotkeys.Insert="Insert" Hotkeys.Delete="Delete" diff --git a/UI/data/locale/ru-RU.ini b/UI/data/locale/ru-RU.ini index b170c8b80e20ff..d0bbccba2dbf22 100644 --- a/UI/data/locale/ru-RU.ini +++ b/UI/data/locale/ru-RU.ini @@ -49,6 +49,9 @@ Right="Справа" Top="Сверху" Bottom="Снизу" Reset="Сбросить" +Hours="Часов" +Minutes="Минут" +Seconds="Секунд" QuickTransitions.SwapScenes="Замена Просмотра/Вывода Сцены После Перехода" QuickTransitions.SwapScenesTT="Замена просмотра и вывода сцены после перехода (если выходная оригинальная сцена до сих пор существует).\nЭто будет не отмена каких-либо изменений, что, возможно, было сделано в выходной оригинальной сцены." diff --git a/UI/data/locale/sk-SK.ini b/UI/data/locale/sk-SK.ini index bec05a6df6f9f3..af2bd1fc77f194 100644 --- a/UI/data/locale/sk-SK.ini +++ b/UI/data/locale/sk-SK.ini @@ -8,6 +8,7 @@ Cancel="Zrušiť" Close="Zatvoriť" Save="Uložiť" Discard="Zahodiť" +Disable="Zakázané" Yes="Áno" No="Nie" Add="Pridať" @@ -18,6 +19,7 @@ MoveUp="Posunúť vyššie" MoveDown="Posunúť nižšie" Settings="Nastavenia" Display="Monitor" +Name="Meno" Exit="Ukončiť" Mixer="Zmiešavač" Browse="Prehľadávať" @@ -32,8 +34,16 @@ Untitled="Bez názvu" New="Nový" Duplicate="Duplikovať" Enable="Povoliť" +Left="Vľavo" +Right="Vpravo" +Reset="Vynulovať" +Hours="Hodín" +Minutes="Minúty" +Seconds="Sekundy" +Basic.TransitionDuration="Trvanie" +Basic.TogglePreviewProgramMode="Štúdiový režim" TitleBar.Profile="Profil" @@ -45,7 +55,11 @@ NameExists.Text="Tento názov sa už používa." NoNameEntered.Title="Prosím, zadajte platný názov" NoNameEntered.Text="Nemôžete použiť prázdne názvy." +ConfirmStart.Title="Spustiť stream?" +ConfirmStart.Text="Naozaj chcete spustiť stream?" +ConfirmStop.Title="Zastaviť stream?" +ConfirmStop.Text="Naozaj chcete zastaviť stream?" ConfirmExit.Title="Ukončiť OBS?" ConfirmExit.Text="OBS je momentálne aktívny. Všetky prúdy údajov/záznamy sa ukončia. Naozaj pokračovať?" @@ -57,6 +71,9 @@ Output.ConnectFail.Title="Spojenie sa nepodarilo" Output.ConnectFail.BadPath="Neplatná cesta alebo URL. Prosím, skontrolujte, či sú vaše nastavenia správne." Output.ConnectFail.ConnectFailed="Spojenie so serverom sa nepodarilo" +Output.RecordFail.Title="Nepodarilo sa spustiť nahrávanie" +Output.RecordNoSpace.Title="Nedostatok miesta na disku" +Output.RecordError.Title="Chyba nahrávania" Output.BadPath.Title="Nesprávna cesta k súboru" @@ -68,6 +85,7 @@ LicenseAgreement.Exit="Ukončiť" Remux.SourceFile="OBS nahrávka" Remux.TargetFile="Cieľový súbor" +Remux.OBSRecording="OBS nahrávanie" Remux.SelectRecording="Vybrať OBS nahrávku …" Remux.SelectTarget="Vyberte cieľový súbor …" Remux.FileExistsTitle="Cieľový súbor existuje" diff --git a/UI/data/locale/sr-CS.ini b/UI/data/locale/sr-CS.ini index 2097d044057bcf..3a9e951d268c49 100644 --- a/UI/data/locale/sr-CS.ini +++ b/UI/data/locale/sr-CS.ini @@ -48,6 +48,10 @@ Left="Sleva" Right="Zdesna" Top="Odozgo" Bottom="Odozdo" +Reset="Poništi" +Hours="Sati" +Minutes="Minuta" +Seconds="Sekundi" QuickTransitions.SwapScenes="Zameni scene pregleda/izlaza nakon prelaza" QuickTransitions.SwapScenesTT="Zamenjuje scene pregleda i izlaza nakon prelaza (ako originalna scena izlaza još uvek postoji).\nOvo neće poništiti promene koje su načinjene nad originalnom scenom izlaza." @@ -368,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Upozorenje za kvalitet bez gub Basic.Settings.Output.Simple.Warn.MultipleQSV="Upozorenje: Ne možete koristi više odvojenih QSV enkodera kada emitujete i snimate u isto vreme. Ako želite da emitujete i snimate u isto vreme, molim promenite ili enkoder snimanja ili enkoder emitovanja." Basic.Settings.Output.Simple.Encoder.Software="Softverski (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Mašinski (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Mašinski (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Mašinski (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Softverski (x264 niska upotreba procesora, povećava veličinu datoteke)" Basic.Settings.Output.VideoBitrate="Protok videa" diff --git a/UI/data/locale/sr-SP.ini b/UI/data/locale/sr-SP.ini index a9c5a4483ad7ee..ceff058451f571 100644 --- a/UI/data/locale/sr-SP.ini +++ b/UI/data/locale/sr-SP.ini @@ -48,6 +48,10 @@ Left="Слева" Right="Здесна" Top="Одозго" Bottom="Одоздо" +Reset="Поништи" +Hours="Сати" +Minutes="Минута" +Seconds="Секунди" QuickTransitions.SwapScenes="Замени сцене прегледа/излаза након прелаза" QuickTransitions.SwapScenesTT="Замењује сцене прегледа и излаза након прелаза (ако оригинална сцена још увек постоји).\nОво неће поништити промене које су начињене над оригиналном сценом излаза." @@ -368,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Упозорење за ква Basic.Settings.Output.Simple.Warn.MultipleQSV="Упозорење: Не можете користити више одвојених QSV енкодера када емитујете и снимате у исто време. Ако желите да емитујете и снимате у исто време, молим промените или енкодер снимања или енкодер емитовања." Basic.Settings.Output.Simple.Encoder.Software="Софтверски (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Машински (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Машински (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Машински (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Софтверски (x264 ниска употреба процесора, повећава величину датотеке)" Basic.Settings.Output.VideoBitrate="Проток видеа" diff --git a/UI/data/locale/sv-SE.ini b/UI/data/locale/sv-SE.ini index 81c34c177b2b67..380595713278b2 100644 --- a/UI/data/locale/sv-SE.ini +++ b/UI/data/locale/sv-SE.ini @@ -367,6 +367,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Varning angående förlustfri Basic.Settings.Output.Simple.Warn.MultipleQSV="Varning: Du kan inte använda flera separata QSV-kodare när du streamar och spelar in samtidigt. Om du vill streama och spela in samtidigt, vänligen ändra inspelnings-kodek eller streaming-kodek." Basic.Settings.Output.Simple.Encoder.Software="Programvara (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Hårdvara (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Hårdvara (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Hårdvara (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Mjukvaru-kodek (x264-förinställning för lågt CPU-användning, ökar filstorleken)" Basic.Settings.Output.VideoBitrate="Bithastighet för video" @@ -483,6 +484,7 @@ Basic.AdvAudio.SyncOffset="Sync Offset (ms)" Basic.AdvAudio.AudioTracks="Spår" Basic.Settings.Hotkeys="Kortkommandon" +Basic.Settings.Hotkeys.Pair="Tangentkombinationer som delas med \"%1\" fungerar som strömbrytare" Basic.Hotkeys.StartStreaming="Börja strömma" Basic.Hotkeys.StopStreaming="Sluta strömma" diff --git a/UI/data/locale/uk-UA.ini b/UI/data/locale/uk-UA.ini index de7583584ac960..da6b69db4d00e5 100644 --- a/UI/data/locale/uk-UA.ini +++ b/UI/data/locale/uk-UA.ini @@ -49,6 +49,9 @@ Right="Зправа" Top="Зверху" Bottom="Знизу" Reset="Скинути" +Hours="Годин" +Minutes="Хвилин" +Seconds="Секунд" QuickTransitions.SwapScenes="Поміняти місцями сцени Перегляд/Вивід після Відео-переходу" QuickTransitions.SwapScenesTT="Міняє місцями сцени Перегляд та Вивід після закінчення Відео-переходу (якщо сцена Вивід ще існує).\nЗміни внесені до обох сцен залишаються." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="Якість Без втрат Basic.Settings.Output.Simple.Warn.MultipleQSV="Попередження: Не можна використовувати кілька окремих енкодерів QSV одночасно для запису і трансляції. Якщо ви хочете транслювати і записувати одночасно, будь ласка, змінить або енкодер запису, або енкодер трансляції на інший." Basic.Settings.Output.Simple.Encoder.Software="Програмний (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Апаратний (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Апаратний (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Апаратний (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Програмний (x264, шаблон з низьким завантаженням ЦП, збільшує файл)" Basic.Settings.Output.VideoBitrate="Відео бітрейт" diff --git a/UI/data/locale/vi-VN.ini b/UI/data/locale/vi-VN.ini index 22db6b23e588bf..48f87943338cc6 100644 --- a/UI/data/locale/vi-VN.ini +++ b/UI/data/locale/vi-VN.ini @@ -24,7 +24,7 @@ Display="Hiển thị" Name="Tên" Exit="Thoát" Mixer="Bộ trộn" -Browse="trình duyệt" +Browse="Chọn đường dẫn" Mono="Âm thanh đơn" Stereo="Âm thanh nổi" DroppedFrames="Khung rớt %1 (%2%)" @@ -41,18 +41,30 @@ Duplicate="Tạo bản sao" Enable="Kích hoạt" DisableOSXVSync="Tắt OSX V-Sync" ResetOSXVSyncOnExit="Đặt lại OSX V-Sync khi Thoát" -Transition="Chuyển tiếp" +HighResourceUsage="Encoder quá tải! Hãy xem xét giảm chất lượng video hoặc sử dụng 1 encoder nhanh hơn." +Transition="Chuyển cảnh" QuickTransitions="C. cảnh nhanh" Left="Trái" Right="Phải" Top="Trên" Bottom="Dưới" +Reset="Thiết lập lại" +Hours="Giờ" +Minutes="Phút" +Seconds="Giây" QuickTransitions.SwapScenes="Hoán đổi cảnh Xem trước/Đầu ra sau khi Chuyển cảnh" QuickTransitions.SwapScenesTT="Hoán đổi cảnh xem trước và cảnh đầu ra sau khi chuyển cảnh (nếu cảnh đầu ra gốc vẫn tồn tại).\nMọi thay đổi với cảnh đầu ra gốc sẽ không hoàn tác." QuickTransitions.DuplicateScene="Tạo bản sao cảnh" +QuickTransitions.HotkeyName="C. cảnh nhanh: %1" +Basic.AddTransition="Thêm cấu hình chuyển cảnh" +Basic.RemoveTransition="Xóa cấu hình chuyển cảnh" +Basic.TransitionDuration="Thời gian" +Basic.TogglePreviewProgramMode="Chế độ Studio" +TransitionNameDlg.Text="Vui lòng nhập tên của cảnh" +TransitionNameDlg.Title="Tên chuyển cảnh" TitleBar.Profile="Cấu hình" TitleBar.Scenes="Cảnh" @@ -63,18 +75,24 @@ NameExists.Text="Tên hiện đang sử dụng." NoNameEntered.Title="Vui lòng nhập tên hợp lệ" NoNameEntered.Text="Bạn không thể sử dụng tên có sản phẩm nào." +ConfirmStart.Title="Bắt đầu Stream?" +ConfirmStart.Text="Bạn có chắc muốn bắt đầu stream?" +ConfirmStop.Title="Ngừng Stream?" +ConfirmStop.Text="Bạn có chắc muốn dừng stream?" ConfirmExit.Title="Thoát OBS?" -ConfirmExit.Text="OBS là hiện đang hoạt động. Tất cả dòng/bản ghi sẽ được đóng cửa. Bạn có chắc bạn muốn thoát khỏi không?" +ConfirmExit.Text="OBS hiện đang hoạt động. Tất cả các stream/quay video sẽ bị tắt. Bạn có chắc muốn thoát không?" ConfirmRemove.Title="Xác nhận loại bỏ" ConfirmRemove.Text="Bạn có chắc bạn muốn loại bỏ '$1' không?" +ConfirmRemove.TextMultiple="Bạn có chắc bạn muốn xóa %1 nội dung không?" Output.ConnectFail.Title="Không thể kết nối" Output.ConnectFail.BadPath="URL không hợp lệ của đường dẫn hoặc kết nối. Xin vui lòng kiểm tra cài đặt của bạn để xác nhận rằng họ là hợp lệ." Output.ConnectFail.ConnectFailed="Không thể kết nối tới hệ phục vụ" -Output.ConnectFail.Error="Lỗi bất ngờ xảy ra khi thử kết nối tới hệ phục vụ. Biết thêm thông tin trong các tập tin log." +Output.ConnectFail.InvalidStream="Không thể truy cập kênh chỉ định hoặc khóa stream, Vui lòng kiểm tra khóa stream của bạn. Nếu nó đúng, có thể có một vấn đề về kết nối với máy chủ." +Output.ConnectFail.Error="1 lỗi bất ngờ xảy ra khi thử kết nối tới máy chủ. Thông tin thêm nằm trong log file." Output.ConnectFail.Disconnected="Ngắt kết nối từ máy chủ." Output.RecordFail.Title="Không thể bắt đầu ghi âm" @@ -100,6 +118,7 @@ LicenseAgreement.Exit="Thoát" Remux.SourceFile="Ghi âm OBS" Remux.TargetFile="Tệp đích" Remux.Remux="Remux" +Remux.OBSRecording="Ghi OBS" Remux.FinishedTitle="Remuxing đã hoàn thành" Remux.Finished="Ghi remuxed" Remux.FinishedError="Ghi âm remuxed, nhưng các tập tin có thể không đầy đủ" @@ -125,7 +144,21 @@ Basic.DisplayCapture="Chụp màn hình" Basic.Main.PreviewConextMenu.Enable="Bật xem trước" - +ScaleFiltering="Scale Filtering" +ScaleFiltering.Point="Point" +ScaleFiltering.Bilinear="Bilinear" +ScaleFiltering.Bicubic="Bicubic" +ScaleFiltering.Lanczos="Lanczos" + +Deinterlacing="Deinterlacing" +Deinterlacing.Discard="Discard" +Deinterlacing.Retro="Retro" +Deinterlacing.Blend="Blend" +Deinterlacing.Blend2x="Blend 2x" +Deinterlacing.Linear="Linear" +Deinterlacing.Linear2x="Linear 2x" +Deinterlacing.Yadif="Yadif" +Deinterlacing.Yadif2x="Yadif 2x" Basic.Main.AddSceneDlg.Title="Thêm cảnh" Basic.Main.AddSceneDlg.Text="Vui lòng nhập tên của cảnh" @@ -157,7 +190,9 @@ Basic.PropertiesWindow.ConfirmTitle="Thay đổi cài đặt" Basic.PropertiesWindow.Confirm="Có được lưu thay đổi. Bạn có muốn giữ họ?" Basic.PropertiesWindow.NoProperties="Không có tài sản có sẵn" Basic.PropertiesWindow.AddFiles="Thêm tập tin" +Basic.PropertiesWindow.AddDir="Thêm thư mục" Basic.PropertiesWindow.AddURL="Thêm đường dẫn/URL" +Basic.PropertiesWindow.AddEditableListDir="Thêm thư mục vào '%1'" Basic.PropertiesWindow.AddEditableListFiles="Thêm các tệp vào '%1'" Basic.PropertiesWindow.AddEditableListEntry="Thêm mục nhập vào '%1'" Basic.PropertiesWindow.EditEditableListEntry="Chỉnh sửa mục nhập từ '%1'" @@ -192,6 +227,7 @@ Basic.TransformWindow.Alignment="Vị trí liên kết" Basic.TransformWindow.BoundsType="Các giáp ranh hộp loại" Basic.TransformWindow.BoundsAlignment="Liên kết trong các giáp ranh hộp" Basic.TransformWindow.Bounds="Các giáp ranh hộp kích thước" +Basic.TransformWindow.Crop="Cắt" Basic.TransformWindow.Alignment.TopLeft="Góc trên trái" Basic.TransformWindow.Alignment.TopCenter="Đỉnh Trung tâm" @@ -220,7 +256,9 @@ Basic.Main.Connecting="Đang kết nối..." Basic.Main.StartRecording="Bắt đầu ghi âm" Basic.Main.StartStreaming="Bắt đầu Streaming" Basic.Main.StopRecording="Dừng ghi âm" +Basic.Main.StoppingRecording="Dừng ghi video..." Basic.Main.StopStreaming="Ngừng Streaming" +Basic.Main.StoppingStreaming="Dừng stream..." Basic.Main.ForceStopStreaming="Ngừng Streaming (huỷ chậm trễ)" Basic.MainMenu.File="&Tập tin" @@ -231,6 +269,7 @@ Basic.MainMenu.File.Remux="Re & mux bản ghi âm" Basic.MainMenu.File.Settings="&Cài đặt" Basic.MainMenu.File.ShowSettingsFolder="Hiển thị cài đặt thư mục" Basic.MainMenu.File.ShowProfileFolder="Hiển thị thư mục hồ sơ" +Basic.MainMenu.AlwaysOnTop="&Luôn trên đầu trang" Basic.MainMenu.File.Exit="&Thoát" Basic.MainMenu.Edit="& Chỉnh sửa" @@ -238,6 +277,7 @@ Basic.MainMenu.Edit.Undo="& Hoàn tác" Basic.MainMenu.Edit.Redo="& Làm lại" Basic.MainMenu.Edit.UndoAction="& Hoàn tác $1" Basic.MainMenu.Edit.RedoAction="& Làm lại $1" +Basic.MainMenu.Edit.LockPreview="&Khóa xem trước" Basic.MainMenu.Edit.Transform="Biến đổi" Basic.MainMenu.Edit.Transform.EditTransform="& Chỉnh sửa biến đổi..." Basic.MainMenu.Edit.Transform.ResetTransform="& Đặt lại biến đổi" @@ -256,10 +296,15 @@ Basic.MainMenu.Edit.Order.MoveToTop="Chuyển đến đầu trang" Basic.MainMenu.Edit.Order.MoveToBottom="Chuyển đến dưới cùng" Basic.MainMenu.Edit.AdvAudio="Thuộc tính âm thanh nâng cao" +Basic.MainMenu.View="&Hiển thị" +Basic.MainMenu.View.Toolbars="&Thanh công cụ" +Basic.MainMenu.View.Toolbars.Listboxes="&Listboxes" +Basic.MainMenu.View.StatusBar="&Thanh trạng thái" Basic.MainMenu.SceneCollection="& Cảnh bộ sưu tập" Basic.MainMenu.Profile="& Hồ sơ" +Basic.MainMenu.Tools="&Công cụ" Basic.MainMenu.Help="&Trợ giúp" Basic.MainMenu.Help.Website="Ghé thăm Website" @@ -277,6 +322,9 @@ Basic.Settings.Confirm="Bạn đã lưu thay đổi. Lưu thay đổi?" Basic.Settings.General="Chung" Basic.Settings.General.Theme="Theme" Basic.Settings.General.Language="Ngôn ngữ" +Basic.Settings.General.HideProjectorCursor="Ẩn con trỏ chuột trên màn chiếu" +Basic.Settings.General.ProjectorAlwaysOnTop="Làm cho màn chiếu luôn luôn trên đầu" +Basic.Settings.General.SysTrayEnabled="Bật khay biểu tượng hệ thống" Basic.Settings.Stream="Stream" Basic.Settings.Stream.StreamType="Kiểu Stream" @@ -301,6 +349,9 @@ Basic.Settings.Output.Simple.Warn.Lossless="Cảnh báo: Lossless chất lượn Basic.Settings.Output.Simple.Warn.Lossless.Msg="Bạn có chắc bạn muốn sử dụng lossless chất lượng?" Basic.Settings.Output.Simple.Warn.Lossless.Title="Lossless chất lượng cảnh báo!" Basic.Settings.Output.Simple.Encoder.Software="Phần mềm (x 264)" +Basic.Settings.Output.Simple.Encoder.Hardware.QSV="Phần cứng (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="Phần cứng (AMD)" +Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="Phần cứng (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="Phần mềm (x 264 sử dụng CPU thấp cài sẵn, tăng kích thước)" Basic.Settings.Output.VideoBitrate="Video Bitrate" Basic.Settings.Output.AudioBitrate="Âm thanh Bitrate" @@ -327,6 +378,8 @@ Basic.Settings.Output.Adv.Recording.Type="Loại" Basic.Settings.Output.Adv.Recording.Type.Standard="Chuản" Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Tùy chỉnh đầu ra (FFmpeg)" Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Sử dụng dòng mã hóa)" +Basic.Settings.Output.Adv.Recording.Filename="Định dạng tệp tin" +Basic.Settings.Output.Adv.Recording.OverwriteIfExists="Ghi đè nếu tập tin tồn tại" Basic.Settings.Output.Adv.FFmpeg.Type="FFmpeg ra loại" Basic.Settings.Output.Adv.FFmpeg.Type.URL="Sản lượng để URL" Basic.Settings.Output.Adv.FFmpeg.Type.RecordToFile="Đầu ra vào tập tin" @@ -374,27 +427,35 @@ Basic.Settings.Audio="Âm thanh" Basic.Settings.Audio.SampleRate="Tỷ lệ mẫu" Basic.Settings.Audio.Channels="Kênh Tivi" Basic.Settings.Audio.DesktopDevice="Thiết bị âm thanh máy tính" -Basic.Settings.Audio.DesktopDevice2="Thiết bị âm thanh máy tính" -Basic.Settings.Audio.AuxDevice="Mic/liên minh thiết bị âm thanh" -Basic.Settings.Audio.AuxDevice2="Mic/liên minh thiết bị âm thanh 2" -Basic.Settings.Audio.AuxDevice3="Mic/liên minh thiết bị âm thanh 3" +Basic.Settings.Audio.DesktopDevice2="Thiết bị âm thanh máy tính 2" +Basic.Settings.Audio.AuxDevice="Thiết bị âm thanh mic/phụ trợ" +Basic.Settings.Audio.AuxDevice2="Thiết bị âm thanh mic/phụ trợ 2" +Basic.Settings.Audio.AuxDevice3="Thiết bị âm thanh mic/phụ trợ 3" Basic.Settings.Audio.EnablePushToMute="Sử đẩy để tắt tiếng" Basic.Settings.Audio.PushToMuteDelay="Sự chậm trễ đẩy để tắt tiếng" Basic.Settings.Audio.EnablePushToTalk="Sử Push-to-talk" -Basic.Settings.Audio.PushToTalkDelay="Push-to-talk chậm trễ" +Basic.Settings.Audio.PushToTalkDelay="Bấm để nói trễ" +Basic.Settings.Audio.UnknownAudioDevice="[Thiết bị không được kết nối hoặc không sẵn dùng]" Basic.Settings.Advanced="Nâng cao" -Basic.Settings.Advanced.FormatWarning="Cảnh báo: Định dạng màu sắc khác hơn so với NV12 chủ yếu dành cho ghi âm, và không được khuyến cáo khi streaming. Trực tuyến có thể phải tăng sử dụng CPU do chuyển đổi định dạng màu sắc." +Basic.Settings.Advanced.General.ProcessPriority="Chương trình ưu tiên" +Basic.Settings.Advanced.General.ProcessPriority.High="Cao" +Basic.Settings.Advanced.General.ProcessPriority.AboveNormal="Trên bình thường" +Basic.Settings.Advanced.General.ProcessPriority.Normal="Thường" +Basic.Settings.Advanced.General.ProcessPriority.Idle="Rảnh" +Basic.Settings.Advanced.FormatWarning="Cảnh báo: Định dạng màu sắc khác với NV12 chủ yếu dành cho ghi âm và không được khuyến cáo khi streaming. Stream có thể làm tăng sử dụng CPU do phải chuyển đổi định dạng màu sắc." Basic.Settings.Advanced.Audio.BufferingTime="Âm thanh thời gian đệm" Basic.Settings.Advanced.Video.ColorFormat="Định dạng màu sắc" Basic.Settings.Advanced.Video.ColorSpace="Không gian màu YUV" Basic.Settings.Advanced.Video.ColorRange="Phạm vi màu YUV" Basic.Settings.Advanced.Video.ColorRange.Partial="Một phần" Basic.Settings.Advanced.Video.ColorRange.Full="Đầy đủ" -Basic.Settings.Advanced.StreamDelay="Sự chậm trễ Stream" -Basic.Settings.Advanced.StreamDelay.Duration="Thời gian (phút)" -Basic.Settings.Advanced.StreamDelay.Preserve="Bảo tồn cutoff điểm (tăng chậm trễ) khi kết nối lại" -Basic.Settings.Advanced.StreamDelay.MemoryUsage="Sử dụng ước tính bộ nhớ: %1 MB" +Basic.Settings.Advanced.StreamDelay="Stream trễ" +Basic.Settings.Advanced.StreamDelay.Duration="Thời gian (giây)" +Basic.Settings.Advanced.StreamDelay.Preserve="Giữ điểm cắt (tăng chậm trễ) khi kết nối lại" +Basic.Settings.Advanced.StreamDelay.MemoryUsage="Ước tính bộ nhớ sử dụng: %1 MB" +Basic.Settings.Advanced.Network="Mạng" +Basic.Settings.Advanced.Network.BindToIP="Liên kết với IP" Basic.AdvAudio="Thuộc tính âm thanh nâng cao" Basic.AdvAudio.Name="Tên" @@ -413,7 +474,10 @@ Basic.Hotkeys.StartRecording="Bắt đầu ghi âm" Basic.Hotkeys.StopRecording="Dừng ghi âm" Basic.Hotkeys.SelectScene="Chuyển cảnh" +Basic.SystemTray.Show="Hiện" +Basic.SystemTray.Hide="Ẩn" +Basic.SystemTray.Message.Reconnecting="Ngắt kết nối. Đang kết nối lại..." Hotkeys.Insert="Chèn" Hotkeys.Delete="Xoá" @@ -453,12 +517,12 @@ Hotkeys.MouseButton="Chuột %1" Mute="Tắt Tiếng" Unmute="Bật tiếng" -Push-to-mute="Đẩy để tắt tiếng" -Push-to-talk="Push-to-talk" +Push-to-mute="Bấm để tắt tiếng" +Push-to-talk="Bấm để nói" SceneItemShow="Hiển thị '%1'" SceneItemHide="Ẩn '%1'" -OutputWarnings.NoTracksSelected="Bạn phải chọn ít nhất một ca khúc" -OutputWarnings.MultiTrackRecording="Chú ý: Một số định dạng (chẳng hạn như FLV) không hỗ trợ nhiều bài hát cho một ghi âm" +OutputWarnings.NoTracksSelected="Bạn phải chọn ít nhất một track" +OutputWarnings.MultiTrackRecording="Chú ý: Một số định dạng (chẳng hạn như FLV) không hỗ trợ nhiều track cho mỗi video" diff --git a/UI/data/locale/zh-CN.ini b/UI/data/locale/zh-CN.ini index 25906032a81421..fe5ff36c77bcc8 100644 --- a/UI/data/locale/zh-CN.ini +++ b/UI/data/locale/zh-CN.ini @@ -49,6 +49,9 @@ Right="右" Top="上" Bottom="下" Reset="重置" +Hours="小时" +Minutes="分钟" +Seconds="秒" QuickTransitions.SwapScenes="在过渡动画后交换预览/输出场景" QuickTransitions.SwapScenesTT="在过渡后,交换预览和输出场景(如果输出的原始场景仍然存在). \n 这个不会撤消任何可能对输出的原始场景的更改." @@ -369,6 +372,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="无损质量警告!" Basic.Settings.Output.Simple.Warn.MultipleQSV="警告: 当同时推流和录像时, 你不能使用多个单独的 QSV 编码器. 如果你想要同时推流和录像, 请更改录像的编码器或者推流的编码器." Basic.Settings.Output.Simple.Encoder.Software="软件 (x264)" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="硬件 (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="硬件 (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="硬件 (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="软件 (x 264 低 CPU 使用率预设,增加文件大小)" Basic.Settings.Output.VideoBitrate="视频比特率" diff --git a/UI/data/locale/zh-TW.ini b/UI/data/locale/zh-TW.ini index 12e1fd6d6a06e9..d29d39b1ed9609 100644 --- a/UI/data/locale/zh-TW.ini +++ b/UI/data/locale/zh-TW.ini @@ -369,6 +369,7 @@ Basic.Settings.Output.Simple.Warn.Lossless.Title="無損畫質警告!" Basic.Settings.Output.Simple.Warn.MultipleQSV="警告︰同時串流和錄影時,不能使用多個不同的 QSV 編碼器。如果你想要在同一時間串流和錄影,請更改錄影編碼器或串流編碼器。" Basic.Settings.Output.Simple.Encoder.Software="軟體編碼( x264 )" Basic.Settings.Output.Simple.Encoder.Hardware.QSV="硬體編碼 (QSV)" +Basic.Settings.Output.Simple.Encoder.Hardware.AMD="硬體 (AMD)" Basic.Settings.Output.Simple.Encoder.Hardware.NVENC="硬體編碼 (NVENC)" Basic.Settings.Output.Simple.Encoder.SoftwareLowCPU="軟體編碼( x264 預設低 CPU 使用率,將增加檔案容量 )" Basic.Settings.Output.VideoBitrate="影像位元率(kbit/s)" diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ca-ES.ini b/UI/frontend-plugins/frontend-tools/data/locale/ca-ES.ini index 2b178557e8d105..b872d2a72a101d 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/ca-ES.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/ca-ES.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="No canviar" SceneSwitcher.OnNoMatch.SwitchTo="Canvia a:" SceneSwitcher.CheckInterval="Comprova el títol de la finestra activa cada:" SceneSwitcher.ActiveOrNotActive="El canviador de escena està:" +InvalidRegex.Title="Expressió regular no vàlida" +InvalidRegex.Text="La expressió regular que heu introduït no es vàlida." Active="Actiu" Inactive="Inactiu" Start="Inicia" Stop="Atura" +OutputTimer="Temporitzador de sortida" +OutputTimer.Stream="Atura la transmissió després de:" +OutputTimer.Record="Atura la gravació després de:" +OutputTimer.Stream.StoppingIn="La transmissió s'aturarà en:" +OutputTimer.Record.StoppingIn="La gravació s'aturarà en:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/cs-CZ.ini b/UI/frontend-plugins/frontend-tools/data/locale/cs-CZ.ini index c8a45651ef55bb..b39a6e95fa24a8 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/cs-CZ.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/cs-CZ.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Nepřepínat" SceneSwitcher.OnNoMatch.SwitchTo="Přepnout na:" SceneSwitcher.CheckInterval="Kontrolovat titulek aktivního okna každých:" SceneSwitcher.ActiveOrNotActive="Přepínač scén je:" +InvalidRegex.Title="Chybný regulární výraz" +InvalidRegex.Text="Zadaný regulární výraz je chybný." Active="Aktivní" Inactive="Neaktivní" Start="Spustit" Stop="Zastavit" +OutputTimer="Časovač" +OutputTimer.Stream="Přestat vysílat po:" +OutputTimer.Record="Přestat nahrávat po:" +OutputTimer.Stream.StoppingIn="Vysílání se zastaví za:" +OutputTimer.Record.StoppingIn="Nahrávání se zastaví za:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini b/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini index f72389cd61c883..868a27a9840d26 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/da-DK.ini @@ -9,3 +9,4 @@ Inactive="Inaktiv" Start="Start" Stop="Stop" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini b/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini index 4caf47eabb0410..87e476d277f4aa 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/de-DE.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Nicht wechseln" SceneSwitcher.OnNoMatch.SwitchTo="Wechseln zu:" SceneSwitcher.CheckInterval="Titel des aktiven Fensters überprüfen alle:" SceneSwitcher.ActiveOrNotActive="Szenenwechsler ist:" +InvalidRegex.Title="Ungültiger regulärer Ausdruck" +InvalidRegex.Text="Der reguläre Ausdruck, den Sie eingegeben haben, ist ungültig." Active="Aktiv" Inactive="Inaktiv" Start="Start" Stop="Stop" +OutputTimer="Ausgabetimer" +OutputTimer.Stream="Stoppe Stream nach:" +OutputTimer.Record="Stoppe Aufnahme nach:" +OutputTimer.Stream.StoppingIn="Stream stoppt in:" +OutputTimer.Record.StoppingIn="Aufnahme stoppt in:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/es-ES.ini b/UI/frontend-plugins/frontend-tools/data/locale/es-ES.ini index a08a8f9c7bb143..bde5b7c33ad8d5 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/es-ES.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/es-ES.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="No cambiar" SceneSwitcher.OnNoMatch.SwitchTo="Cambiar a:" SceneSwitcher.CheckInterval="Comprobar el título de la ventana activa cada:" SceneSwitcher.ActiveOrNotActive="El cambiador de escena está:" +InvalidRegex.Title="Expresión regular no válida" +InvalidRegex.Text="La expresión regular que ha introducido no es válida." Active="Activo" Inactive="Inactivo" Start="Iniciar" Stop="Detener" +OutputTimer="Temporizador de salida" +OutputTimer.Stream="Detener la transmisión después de:" +OutputTimer.Record="Detener la grabación después de:" +OutputTimer.Stream.StoppingIn="Finalizando transmisión en:" +OutputTimer.Record.StoppingIn="Finalizando grabación en:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/eu-ES.ini b/UI/frontend-plugins/frontend-tools/data/locale/eu-ES.ini index 99076b329835e0..2692dbedb2097e 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/eu-ES.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/eu-ES.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Ez aldatu" SceneSwitcher.OnNoMatch.SwitchTo="Aldatu hona:" SceneSwitcher.CheckInterval="Leiho aktiboaren titulua egiaztatzeko maiztasuna:" SceneSwitcher.ActiveOrNotActive="Eszena aldatzailea dago:" +InvalidRegex.Title="Adierazpen erregular baliogabea" +InvalidRegex.Text="Sartu duzun adierazpen erregularra baliogabea da." Active="Aktiboa" Inactive="Inaktiboa" Start="Hasi" Stop="Gelditu" +OutputTimer="Irteera tenporizadorea" +OutputTimer.Stream="Gelditu transmisioa hau pasata:" +OutputTimer.Record="Gelditu grabazioa hau pasata:" +OutputTimer.Stream.StoppingIn="Transmisioa geldituko da: hau barru:" +OutputTimer.Record.StoppingIn="Grabazioa geldituko da hau barru:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini b/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini index 0f208689db6c93..5cdccf9f0d26c0 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/fi-FI.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Älä vaihda" SceneSwitcher.OnNoMatch.SwitchTo="Vaihda:" SceneSwitcher.CheckInterval="Tarkista aktiivisen ikkunan otsikko:" SceneSwitcher.ActiveOrNotActive="Skenen vaihtaja:" +InvalidRegex.Title="Invalid Regular Expression" +InvalidRegex.Text="The regular expression that you entered is invalid." Active="Aktiivinen" Inactive="Ei käytössä" Start="Käynnistä" Stop="Pysäytä" +OutputTimer="Ulostulo-ajastin" +OutputTimer.Stream="Pysäyttää lähetyksen:" +OutputTimer.Record="Pysäyttää tallennuksen:" +OutputTimer.Stream.StoppingIn="Lähetys pysäytetään:" +OutputTimer.Record.StoppingIn="Tallennus pysäytetään:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/fr-FR.ini b/UI/frontend-plugins/frontend-tools/data/locale/fr-FR.ini index 65d0b4c3c65765..6f3365cd187f5d 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/fr-FR.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/fr-FR.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Ne rien faire" SceneSwitcher.OnNoMatch.SwitchTo="Basculer vers :" SceneSwitcher.CheckInterval="Détecter le titre de la fenêtre active toutes les :" SceneSwitcher.ActiveOrNotActive="Etat du sélecteur automatique :" +InvalidRegex.Title="Expression invalide" +InvalidRegex.Text="L'expression régulière saisie est invalide." Active="Actif" Inactive="Inactif" Start="Démarrer" Stop="Arrêter" +OutputTimer="Minuterie des sorties" +OutputTimer.Stream="Arrêter le streaming dans :" +OutputTimer.Record="Arrêter l'enregistrement dans :" +OutputTimer.Stream.StoppingIn="Arrêt du streaming dans :" +OutputTimer.Record.StoppingIn="Arrêt de l'enregistrement dans :" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/hr-HR.ini b/UI/frontend-plugins/frontend-tools/data/locale/hr-HR.ini index fb81a5492b8769..1cfa1fb21ea699 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/hr-HR.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/hr-HR.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Ne menjaj" SceneSwitcher.OnNoMatch.SwitchTo="Promeni na:" SceneSwitcher.CheckInterval="Proveravaj naziv aktivnog prozora svakih:" SceneSwitcher.ActiveOrNotActive="Menjač scena je:" +InvalidRegex.Title="Neispravan regularni izraz" +InvalidRegex.Text="Regularni izraz koji ste uneli nije ispravan." Active="Aktivan" Inactive="Neaktivan" Start="Pokreni" Stop="Zaustavi" +OutputTimer="Tempomat snimanja i emitovanja" +OutputTimer.Stream="Zaustavi emitovanje nakon:" +OutputTimer.Record="Zaustavi snimanje nakon:" +OutputTimer.Stream.StoppingIn="Prekidanje emitovanja za:" +OutputTimer.Record.StoppingIn="Prekidanje snimanja za:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/hu-HU.ini b/UI/frontend-plugins/frontend-tools/data/locale/hu-HU.ini index bfd99aa64220e6..b21cd1149aadcf 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/hu-HU.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/hu-HU.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Ne váltson" SceneSwitcher.OnNoMatch.SwitchTo="Váltson:" SceneSwitcher.CheckInterval="Aktív ablak ellenőrzése ennyi időközönként:" SceneSwitcher.ActiveOrNotActive="Jelenet váltó:" +InvalidRegex.Title="Érvénytelen kifejezés" +InvalidRegex.Text="A megadott kifejezés érvénytelen." Active="Aktív" Inactive="Inaktiv" Start="Start" Stop="Stop" +OutputTimer="Kimeneti időzítő" +OutputTimer.Stream="Stream leállítása:" +OutputTimer.Record="Felvétel leállítása:" +OutputTimer.Stream.StoppingIn="A stream leáll:" +OutputTimer.Record.StoppingIn="Felvétel leáll:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/it-IT.ini b/UI/frontend-plugins/frontend-tools/data/locale/it-IT.ini new file mode 100644 index 00000000000000..d9372a0db55dc1 --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/data/locale/it-IT.ini @@ -0,0 +1,19 @@ +SceneSwitcher="Cambia scena automatico" +SceneSwitcher.OnNoMatch="Quando nessuna scena coincide a:" +SceneSwitcher.OnNoMatch.DontSwitch="Non passare" +SceneSwitcher.OnNoMatch.SwitchTo="Passa a:" +SceneSwitcher.CheckInterval="Controlla il titolo della finestra attiva ogni:" +SceneSwitcher.ActiveOrNotActive="Lo scene switcher è:" +InvalidRegex.Title="Espressione regolare non valida" +InvalidRegex.Text="L'espressione regolare che hai inserito non è valido." +Active="Attivo" +Inactive="Inattivo" +Start="Inizio" +Stop="Stop" + +OutputTimer="Timer Output" +OutputTimer.Stream="Termina diretta dopo:" +OutputTimer.Record="Termina registrazione dopo:" +OutputTimer.Stream.StoppingIn="La diretta terminerà in:" +OutputTimer.Record.StoppingIn="La registrazione terminerà in:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ja-JP.ini b/UI/frontend-plugins/frontend-tools/data/locale/ja-JP.ini index 714c79cdcfa2a8..841df85c0122f1 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/ja-JP.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/ja-JP.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="切り替えない" SceneSwitcher.OnNoMatch.SwitchTo="切り替える:" SceneSwitcher.CheckInterval="アクティブウィンドウタイトルを確認する間隔:" SceneSwitcher.ActiveOrNotActive="シーンスイッチャーは:" +InvalidRegex.Title="無効な正規表現" +InvalidRegex.Text="入力した正規表現は有効ではありません。" Active="アクティブ" Inactive="非アクティブ" Start="開始" Stop="停止" +OutputTimer="出力タイマー" +OutputTimer.Stream="配信停止の時間設定:" +OutputTimer.Record="録画停止の時間設定:" +OutputTimer.Stream.StoppingIn="配信停止まで:" +OutputTimer.Record.StoppingIn="録画停止まで:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ko-KR.ini b/UI/frontend-plugins/frontend-tools/data/locale/ko-KR.ini index cbfee50a85b04f..21b86a91acaa1a 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/ko-KR.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/ko-KR.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="전환하지 않음" SceneSwitcher.OnNoMatch.SwitchTo="여기로 전환:" SceneSwitcher.CheckInterval="활성화된 윈도우 제목을 확인:" SceneSwitcher.ActiveOrNotActive="장면 전환기:" +InvalidRegex.Title="유효하지 않은 정규 표현" +InvalidRegex.Text="입력한 정규 표현이 유효하지 않습니다." Active="활성화" Inactive="비활성화" Start="시작" Stop="중단" +OutputTimer="출력 시간 설정" +OutputTimer.Stream="이 시간 이후 방송 중단:" +OutputTimer.Record="이 시간 이후 녹화 중단:" +OutputTimer.Stream.StoppingIn="방송 중지까지 남은 시간:" +OutputTimer.Record.StoppingIn="녹화 중지까지 남은 시간:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini b/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..85716a80c36ebe --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/data/locale/ms-MY.ini @@ -0,0 +1,10 @@ +Active="Aktif" +Inactive="Tidak Aktif" +Start="Mula" +Stop="Berhenti" + +OutputTimer.Stream="Berhenti 'streaming' selepas:" +OutputTimer.Record="Berhenti merakam selepas:" +OutputTimer.Stream.StoppingIn="'Streaming' dihentikan dalam:" +OutputTimer.Record.StoppingIn="Rakaman dihentikan dalam:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini new file mode 100644 index 00000000000000..fb93191f5586d0 --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/data/locale/nb-NO.ini @@ -0,0 +1,7 @@ +SceneSwitcher.OnNoMatch.SwitchTo="Bytt til:" +Active="Aktiv" +Inactive="Inaktiv" +Start="Start" +Stop="Stopp" + + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/nl-NL.ini b/UI/frontend-plugins/frontend-tools/data/locale/nl-NL.ini index b785c86159bf87..dafb9a0d14a6f8 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/nl-NL.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/nl-NL.ini @@ -9,3 +9,4 @@ Inactive="Inactief" Start="Start" Stop="Stop" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/pl-PL.ini b/UI/frontend-plugins/frontend-tools/data/locale/pl-PL.ini index dd2d18dc193a93..4b8410d166fbea 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/pl-PL.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/pl-PL.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Nie przełączaj" SceneSwitcher.OnNoMatch.SwitchTo="Przełącz na:" SceneSwitcher.CheckInterval="Sprawdź tytuł aktywnego okna co:" SceneSwitcher.ActiveOrNotActive="Przełączanie scen jest:" +InvalidRegex.Title="Nieprawidłowe wyrażenie regularne" +InvalidRegex.Text="Podane wyrażenie regularne jest nieprawidłowe." Active="Aktywne" Inactive="Nieaktywne" Start="Start" Stop="Stop" +OutputTimer="Wyłącznik czasowy" +OutputTimer.Stream="Zatrzymaj stream po:" +OutputTimer.Record="Zatrzymaj nagrywanie po:" +OutputTimer.Stream.StoppingIn="Zatrzymanie streamu za:" +OutputTimer.Record.StoppingIn="Zatrzymanie nagrywania za:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini b/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini index 5a6a4eb4cc3515..10f3839cf0126c 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/pt-BR.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Não alternar" SceneSwitcher.OnNoMatch.SwitchTo="Alternar para:" SceneSwitcher.CheckInterval="Checar o título da janela ativa a cada:" SceneSwitcher.ActiveOrNotActive="O alternador de cenas está:" +InvalidRegex.Title="Expressão regular inválida" +InvalidRegex.Text="A expressão regular que introduziu é inválida." Active="Ligado" Inactive="Desligado" Start="Iniciar" Stop="Parar" +OutputTimer="Temporizador de saída" +OutputTimer.Stream="Para a transmissão após:" +OutputTimer.Record="Parar a gravação após:" +OutputTimer.Stream.StoppingIn="A transmissão irá parar em:" +OutputTimer.Record.StoppingIn="A gravação irá parar em:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/pt-PT.ini b/UI/frontend-plugins/frontend-tools/data/locale/pt-PT.ini new file mode 100644 index 00000000000000..5d73a34f42c3eb --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/data/locale/pt-PT.ini @@ -0,0 +1,19 @@ +SceneSwitcher="Troca automática de cenas" +SceneSwitcher.OnNoMatch="Quando nenhuma janela corresponder:" +SceneSwitcher.OnNoMatch.DontSwitch="Não trocar" +SceneSwitcher.OnNoMatch.SwitchTo="Trocar para:" +SceneSwitcher.CheckInterval="Verificar o nome da janela ativa a cada:" +SceneSwitcher.ActiveOrNotActive="A troca de cenas está:" +InvalidRegex.Title="Expressão regular inválida" +InvalidRegex.Text="A expressão regular que introduziu é inválida." +Active="Ativa" +Inactive="Inativa" +Start="Iniciar" +Stop="Parar" + +OutputTimer="Temporizador de saída" +OutputTimer.Stream="Para a transmissão após:" +OutputTimer.Record="Parar a gravação após:" +OutputTimer.Stream.StoppingIn="A transmissão irá parar em:" +OutputTimer.Record.StoppingIn="A gravação irá parar em:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini b/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini index 831e0d00d73ae1..c502469610883d 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/ru-RU.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Не переключать" SceneSwitcher.OnNoMatch.SwitchTo="Переключать на:" SceneSwitcher.CheckInterval="Проверять имя активного окна каждые:" SceneSwitcher.ActiveOrNotActive="Переключатель сцен:" +InvalidRegex.Title="Недопустимое регулярное выражение" +InvalidRegex.Text="Регулярное выражение, которое вы ввели, содержит ошибки." Active="Активен" Inactive="Неактивен" Start="Запустить" Stop="Остановить" +OutputTimer="Таймер записи и стрима" +OutputTimer.Stream="Завершить стрим через:" +OutputTimer.Record="Завершить запись через:" +OutputTimer.Stream.StoppingIn="Стрим будет завершён через:" +OutputTimer.Record.StoppingIn="Запись будет завершена через:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sr-CS.ini b/UI/frontend-plugins/frontend-tools/data/locale/sr-CS.ini index fb81a5492b8769..1cfa1fb21ea699 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sr-CS.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sr-CS.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Ne menjaj" SceneSwitcher.OnNoMatch.SwitchTo="Promeni na:" SceneSwitcher.CheckInterval="Proveravaj naziv aktivnog prozora svakih:" SceneSwitcher.ActiveOrNotActive="Menjač scena je:" +InvalidRegex.Title="Neispravan regularni izraz" +InvalidRegex.Text="Regularni izraz koji ste uneli nije ispravan." Active="Aktivan" Inactive="Neaktivan" Start="Pokreni" Stop="Zaustavi" +OutputTimer="Tempomat snimanja i emitovanja" +OutputTimer.Stream="Zaustavi emitovanje nakon:" +OutputTimer.Record="Zaustavi snimanje nakon:" +OutputTimer.Stream.StoppingIn="Prekidanje emitovanja za:" +OutputTimer.Record.StoppingIn="Prekidanje snimanja za:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini b/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini index 983378fdd56a57..bb74ac5b05f477 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sr-SP.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Не мењај" SceneSwitcher.OnNoMatch.SwitchTo="Промени на:" SceneSwitcher.CheckInterval="Проверавај назив активног прозора сваких:" SceneSwitcher.ActiveOrNotActive="Мењач сцена је:" +InvalidRegex.Title="Неисправан регуларни израз" +InvalidRegex.Text="Регуларни израз који сте унели није исправан." Active="Активан" Inactive="Неактиван" Start="Покрени" Stop="Заустави" +OutputTimer="Темпомат снимања и емитовања" +OutputTimer.Stream="Заустави емитовање након:" +OutputTimer.Record="Заустави снимање након:" +OutputTimer.Stream.StoppingIn="Прекидање емитовања за:" +OutputTimer.Record.StoppingIn="Прекидање снимања за:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/sv-SE.ini b/UI/frontend-plugins/frontend-tools/data/locale/sv-SE.ini index a2f6330c46b66b..0b070b23ab0885 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/sv-SE.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/sv-SE.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Byt inte" SceneSwitcher.OnNoMatch.SwitchTo="Byt till:" SceneSwitcher.CheckInterval="Kontrollera aktiv fönstertitel varje:" SceneSwitcher.ActiveOrNotActive="Scenbytaren är:" +InvalidRegex.Title="Ogiltigt reguljärt uttryck" +InvalidRegex.Text="Det reguljära uttrycket du angav är ogiltigt." Active="Aktiv" Inactive="Inaktiv" Start="Starta" Stop="Stoppa" +OutputTimer="Utdatatimer" +OutputTimer.Stream="Sluta streama efter:" +OutputTimer.Record="Stoppa inspelningen efter:" +OutputTimer.Stream.StoppingIn="Streamen stoppas om:" +OutputTimer.Record.StoppingIn="Inspelningen stoppas om:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/uk-UA.ini b/UI/frontend-plugins/frontend-tools/data/locale/uk-UA.ini index 12a1a0b0398386..855e3b827dd137 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/uk-UA.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/uk-UA.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="Нічого не робити" SceneSwitcher.OnNoMatch.SwitchTo="Перейти до:" SceneSwitcher.CheckInterval="Перевіряти заголовок активного вікна кожні:" SceneSwitcher.ActiveOrNotActive="Автоматичний перехід між Сценами:" +InvalidRegex.Title="Неприпустимий регулярний вираз" +InvalidRegex.Text="Ви ввели неприпустимий регулярний вираз (шаблон)." Active="Активний" Inactive="Неактивний" Start="Запустити" Stop="Зупинити" +OutputTimer="Таймер для Виводу" +OutputTimer.Stream="Закінчити трансляцію за:" +OutputTimer.Record="Зупинити запис за:" +OutputTimer.Stream.StoppingIn="Трансляція припиниться за:" +OutputTimer.Record.StoppingIn="Запис зупиниться за:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..b77e9c69a82f1b --- /dev/null +++ b/UI/frontend-plugins/frontend-tools/data/locale/vi-VN.ini @@ -0,0 +1,16 @@ +SceneSwitcher="Tự động chuyển cảnh" +SceneSwitcher.OnNoMatch="Khi cửa sổ không khớp:" +SceneSwitcher.OnNoMatch.DontSwitch="Không chuyển" +SceneSwitcher.OnNoMatch.SwitchTo="Chuyển sang:" +SceneSwitcher.CheckInterval="Kiểm tra tiêu đề cửa sổ mỗi:" +SceneSwitcher.ActiveOrNotActive="Chuyển cảnh đang:" +Active="Đang hoạt động" +Inactive="Không hoạt động" +Start="Bắt đầu" +Stop="Dừng" + +OutputTimer.Stream="Dừng stream sau:" +OutputTimer.Record="Dừng ghi video sau:" +OutputTimer.Stream.StoppingIn="Stream sẽ dừng trong:" +OutputTimer.Record.StoppingIn="Quay video sẽ dừng trong:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini b/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini index 1ae756f64a7786..22c56bfc1af2fc 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/zh-CN.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="不切换" SceneSwitcher.OnNoMatch.SwitchTo="切换到:" SceneSwitcher.CheckInterval="检查活动窗口的标题,每:" SceneSwitcher.ActiveOrNotActive="场景切换器是:" +InvalidRegex.Title="无效的正则表达式" +InvalidRegex.Text="您输入的正则表达式是无效的。" Active="已激活" Inactive="未激活" Start="开始" Stop="停止" +OutputTimer="输出计时器" +OutputTimer.Stream="停止流处理后:" +OutputTimer.Record="停止录制后:" +OutputTimer.Stream.StoppingIn="串流停止在:" +OutputTimer.Record.StoppingIn="录制停止在:" + diff --git a/UI/frontend-plugins/frontend-tools/data/locale/zh-TW.ini b/UI/frontend-plugins/frontend-tools/data/locale/zh-TW.ini index ac7668aee2c4d5..892cb30c70705b 100644 --- a/UI/frontend-plugins/frontend-tools/data/locale/zh-TW.ini +++ b/UI/frontend-plugins/frontend-tools/data/locale/zh-TW.ini @@ -4,8 +4,16 @@ SceneSwitcher.OnNoMatch.DontSwitch="不切換" SceneSwitcher.OnNoMatch.SwitchTo="切換到︰" SceneSwitcher.CheckInterval="檢查使用中視窗標題的頻率︰" SceneSwitcher.ActiveOrNotActive="場景切換器︰" +InvalidRegex.Title="無效的正規表達式" +InvalidRegex.Text="您輸入的正則運算式不正確" Active="啟動中" Inactive="未啟動" Start="開始" Stop="停止" +OutputTimer="輸出計時器" +OutputTimer.Stream="在下面時間後停止串流:" +OutputTimer.Record="在下面時間後停止錄影:" +OutputTimer.Stream.StoppingIn="串流將在下面時間內停止" +OutputTimer.Record.StoppingIn="錄影將在下面時間內停止" + diff --git a/plugins/coreaudio-encoder/data/locale/ms-MY.ini b/plugins/coreaudio-encoder/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..bc6299a2022083 --- /dev/null +++ b/plugins/coreaudio-encoder/data/locale/ms-MY.ini @@ -0,0 +1,3 @@ +Bitrate="Nilai Bit" +AllowHEAAC="Benarkan HE-AAC" + diff --git a/plugins/image-source/data/locale/el-GR.ini b/plugins/image-source/data/locale/el-GR.ini index dd23c1185f55a9..e5c37e30f58418 100644 --- a/plugins/image-source/data/locale/el-GR.ini +++ b/plugins/image-source/data/locale/el-GR.ini @@ -2,4 +2,5 @@ ImageInput="Εικόνα" File="Αρχείο εικόνας" UnloadWhenNotShowing="Ξεφόρτωση εικόνας όταν δεν εμφανίζεται" +SlideShow.Files="Αρχεία φωτογραφίας" diff --git a/plugins/image-source/data/locale/ms-MY.ini b/plugins/image-source/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..82c4d5318bb90c --- /dev/null +++ b/plugins/image-source/data/locale/ms-MY.ini @@ -0,0 +1,15 @@ +ImageInput="Imej" +File="Fail Imej" +UnloadWhenNotShowing="Nyahmuatkan imej apabila tidak ditunjukkan" + +SlideShow="Tayangan Slaid Imej" +SlideShow.TransitionSpeed="Kelajuan Peralihan (milisaat)" +SlideShow.SlideTime="Masa Antara Slaid (milisaat)" +SlideShow.Files="Fail-fail Imej" +SlideShow.Randomize="Rawakkan Main balik" +SlideShow.Transition="Peralihan" +SlideShow.Transition.Cut="Potong" +SlideShow.Transition.Fade="Pudar" +SlideShow.Transition.Swipe="Sapu" +SlideShow.Transition.Slide="Slaid" + diff --git a/plugins/linux-jack/data/locale/vi-VN.ini b/plugins/linux-jack/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..11d5f2acf41454 --- /dev/null +++ b/plugins/linux-jack/data/locale/vi-VN.ini @@ -0,0 +1,3 @@ +StartJACKServer="Bắt đầu JACK server" +Channels="Số lượng các kênh" + diff --git a/plugins/mac-syphon/data/locale/ms-MY.ini b/plugins/mac-syphon/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..009f81bf8b1690 --- /dev/null +++ b/plugins/mac-syphon/data/locale/ms-MY.ini @@ -0,0 +1,6 @@ +Source="Sumber" +LaunchSyphonInject="Lancarkan 'SyphonInject'" +Application="Aplikasi" +SyphonLicense="Lesen Syphon" +AllowTransparency="Benarkan Ketelusan" + diff --git a/plugins/mac-vth264/data/locale/ms-MY.ini b/plugins/mac-vth264/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..88648b267c2e19 --- /dev/null +++ b/plugins/mac-vth264/data/locale/ms-MY.ini @@ -0,0 +1,7 @@ +Bitrate="Nilai Bit" +UseMaxBitrate="Had Nilai Bit" +MaxBitrate="Nilai bit maksimum" +None="(Tiada)" +UseBFrames="Gunakan 'B-Frames'" + + diff --git a/plugins/obs-ffmpeg/data/locale/el-GR.ini b/plugins/obs-ffmpeg/data/locale/el-GR.ini index d82c271c1cd25f..ef5e18cfccccdc 100644 --- a/plugins/obs-ffmpeg/data/locale/el-GR.ini +++ b/plugins/obs-ffmpeg/data/locale/el-GR.ini @@ -2,6 +2,7 @@ FFmpegOutput="Έξοδος FFmpeg" FFmpegAAC="FFmpeg προεπιλεγμένος κωδικοποιητής AAC" Bitrate="Ρυθμός μετάδοσης bit" +NVENC.Preset.default="Προεπιλογή" LocalFile="Τοπικό αρχείο" Looping="Επανάληψη" diff --git a/plugins/obs-ffmpeg/data/locale/ko-KR.ini b/plugins/obs-ffmpeg/data/locale/ko-KR.ini index c2a3b024093668..132c31a35f9fc5 100644 --- a/plugins/obs-ffmpeg/data/locale/ko-KR.ini +++ b/plugins/obs-ffmpeg/data/locale/ko-KR.ini @@ -27,7 +27,7 @@ ClearOnMediaEnd="재생이 끝나면 소스를 숨기기" Advanced="고급" AudioBufferSize="오디오 버퍼 크기 (프레임)" VideoBufferSize="비디오 버퍼 크기 (프레임)" -FrameDropping="프레임 드롭 수준" +FrameDropping="프레임 손실 수준" DiscardNone="없음" DiscardDefault="기본 (유효하지 않은 패킷)" DiscardNonRef="비 참조 프레임" diff --git a/plugins/obs-ffmpeg/data/locale/vi-VN.ini b/plugins/obs-ffmpeg/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..75092cff00840c --- /dev/null +++ b/plugins/obs-ffmpeg/data/locale/vi-VN.ini @@ -0,0 +1,25 @@ +FFmpegOutput="FFmpeg đầu ra" +FFmpegAAC="FFmpeg AAC Encoder mặc định" +Bitrate="Bitrate" +Preset="Mẫu thiết lập" +RateControl="Cách kiểm soát bitrate" +KeyframeIntervalSec="Thời gian đặt Keyframe (giây, 0=tự động)" +Lossless="Lossless" + +NVENC.Use2Pass="Sử dụng 2-Pass Encoding" +NVENC.Preset.default="Mặc định" +NVENC.Preset.hq="Chất lượng cao" +NVENC.Preset.hp="Hiệu suất cao" +NVENC.Preset.bd="Bluray" +NVENC.Preset.ll="Độ trễ thấp" +NVENC.Preset.llhq="Độ trễ thấp chất lượng cao" +NVENC.Preset.llhp="Độ trễ thấp hiệu suất cao" +NVENC.Level="Cấp độ" + +LocalFile="Tập tin cục bộ" +Looping="Lặp lại" +Input="Nhập" +InputFormat="Định dạng đầu vào" + + + diff --git a/plugins/obs-filters/data/locale/nb-NO.ini b/plugins/obs-filters/data/locale/nb-NO.ini index 2c517b3e4ceb77..406547e2c004bc 100644 --- a/plugins/obs-filters/data/locale/nb-NO.ini +++ b/plugins/obs-filters/data/locale/nb-NO.ini @@ -51,4 +51,6 @@ NoiseGate.HoldTime="Holdetid (millisekunder)" NoiseGate.ReleaseTime="Løslatelsestid (millisekunder)" Gain.GainDB="Forsterkning (dB)" StretchImage="Strekk bilde (ignorer bildets sideforhold)" +Resolution="Oppløsning" +None="Ingen" diff --git a/plugins/obs-outputs/data/locale/el-GR.ini b/plugins/obs-outputs/data/locale/el-GR.ini index 465f0386ddf8e9..e31000f5c22b75 100644 --- a/plugins/obs-outputs/data/locale/el-GR.ini +++ b/plugins/obs-outputs/data/locale/el-GR.ini @@ -2,4 +2,5 @@ RTMPStream="Ροή RTMP" RTMPStream.DropThreshold="Όριο απωλειών (χιλιοστά δευτερολέπτου)" FLVOutput="FLV Αρχείο Εξόδου" FLVOutput.FilePath="Διαδρομή Αρχείου" +Default="Προεπιλογή" diff --git a/plugins/obs-outputs/data/locale/nb-NO.ini b/plugins/obs-outputs/data/locale/nb-NO.ini index ce20f139096aac..7ad019444a21b0 100644 --- a/plugins/obs-outputs/data/locale/nb-NO.ini +++ b/plugins/obs-outputs/data/locale/nb-NO.ini @@ -2,4 +2,5 @@ RTMPStream="RTMP-strøm" RTMPStream.DropThreshold="Senk terskelen (millisekunder)" FLVOutput="FLV-filutgang" FLVOutput.FilePath="Filbane" +Default="Standard" diff --git a/plugins/obs-qsv11/data/locale/el-GR.ini b/plugins/obs-qsv11/data/locale/el-GR.ini new file mode 100644 index 00000000000000..d26ebd65b8ff47 --- /dev/null +++ b/plugins/obs-qsv11/data/locale/el-GR.ini @@ -0,0 +1,2 @@ +Profile="Προφίλ" + diff --git a/plugins/obs-qsv11/data/locale/vi-VN.ini b/plugins/obs-qsv11/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..1cff115ff54163 --- /dev/null +++ b/plugins/obs-qsv11/data/locale/vi-VN.ini @@ -0,0 +1,12 @@ +TargetUsage="Mục tiêu sử dụng" +Bitrate="Bitrate" +MaxBitrate="Bitrate Cao nhất" +RateControl="Cách kiểm soát bitrate" +KeyframeIntervalSec="Thời gian đặt Keyframe (giây, 0=tự động)" +Profile="Hồ sơ" +AsyncDepth="Async Depth" +Accuracy="Độ chính xác" +Convergence="Convergence" +ICQQuality="ICQ chất lượng" +LookAheadDepth="Lookahead Depth" + diff --git a/plugins/obs-text/data/locale/ca-ES.ini b/plugins/obs-text/data/locale/ca-ES.ini index 35586b5574c565..0c81137d493a5e 100644 --- a/plugins/obs-text/data/locale/ca-ES.ini +++ b/plugins/obs-text/data/locale/ca-ES.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Arxius de text" Filter.AllFiles="Tots els fitxers" Color="Color" Opacity="Opacitat" +Gradient="Gradient" +Gradient.Color="Color del gradient" +Gradient.Opacity="Opacitat del gradient" +Gradient.Direction="Direcció del gradient" BkColor="Color de fons" BkOpacity="Opacitat del fons" Alignment="Alineació" diff --git a/plugins/obs-text/data/locale/cs-CZ.ini b/plugins/obs-text/data/locale/cs-CZ.ini index dd4bf7db3e26ed..9a0d01c2e614a8 100644 --- a/plugins/obs-text/data/locale/cs-CZ.ini +++ b/plugins/obs-text/data/locale/cs-CZ.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Textové soubory" Filter.AllFiles="Všechny soubory" Color="Barva" Opacity="Krytí" +Gradient="Přechod barvy" +Gradient.Color="Barva přechodu" +Gradient.Opacity="Průhlednost přechodu" +Gradient.Direction="Směr přechodu" BkColor="Barva pozadí" BkOpacity="Průhlednost pozadí" Alignment="Zarovnání" diff --git a/plugins/obs-text/data/locale/de-DE.ini b/plugins/obs-text/data/locale/de-DE.ini index 36f8d77efeeed7..b8980fc4a53731 100644 --- a/plugins/obs-text/data/locale/de-DE.ini +++ b/plugins/obs-text/data/locale/de-DE.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Textdateien" Filter.AllFiles="Alle Dateien" Color="Farbe" Opacity="Deckkraft" +Gradient="Farbverlauf" +Gradient.Color="Verlaufsfarbe" +Gradient.Opacity="Verlaufsdeckkraft" +Gradient.Direction="Verlaufsrichtung" BkColor="Hintergrundfarbe" BkOpacity="Hintergrunddeckkraft" Alignment="Ausrichtung" diff --git a/plugins/obs-text/data/locale/el-GR.ini b/plugins/obs-text/data/locale/el-GR.ini new file mode 100644 index 00000000000000..b57170a52de12a --- /dev/null +++ b/plugins/obs-text/data/locale/el-GR.ini @@ -0,0 +1,6 @@ +Text="Κείμενο" +Filter.TextFiles="Αρχεία κειμένου" +Filter.AllFiles="Όλα τα αρχεία" +Color="Χρώμα" +Alignment.Right="Δεξιά" + diff --git a/plugins/obs-text/data/locale/es-ES.ini b/plugins/obs-text/data/locale/es-ES.ini index 2332182a2e3acd..35cea31cb7d65a 100644 --- a/plugins/obs-text/data/locale/es-ES.ini +++ b/plugins/obs-text/data/locale/es-ES.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Archivos de texto" Filter.AllFiles="Todos los archivos" Color="Color" Opacity="Opacidad" +Gradient="Degradado" +Gradient.Color="Color del degradado" +Gradient.Opacity="Opacidad del degradado" +Gradient.Direction="Dirección del degradado" BkColor="Color del fondo" BkOpacity="Opacidad del fondo" Alignment="Alineamiento" diff --git a/plugins/obs-text/data/locale/eu-ES.ini b/plugins/obs-text/data/locale/eu-ES.ini index 3a75a66fa65978..6c998b0ca39226 100644 --- a/plugins/obs-text/data/locale/eu-ES.ini +++ b/plugins/obs-text/data/locale/eu-ES.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Testu fitxategiak" Filter.AllFiles="Fitxategi guztiak" Color="Kolorea" Opacity="Opakutasuna" +Gradient="Gradientea" +Gradient.Color="Gradientearen kolorea" +Gradient.Opacity="Gradientearen opakutasuna" +Gradient.Direction="Gradientearen norabidea" BkColor="Atzeko planoaren kolorea" BkOpacity="Atzeko planoaren opakutasuna" Alignment="Lerrokatzea" diff --git a/plugins/obs-text/data/locale/fi-FI.ini b/plugins/obs-text/data/locale/fi-FI.ini index 912a4e14d4d26a..1df85fdfef233d 100644 --- a/plugins/obs-text/data/locale/fi-FI.ini +++ b/plugins/obs-text/data/locale/fi-FI.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Tekstitiedostot" Filter.AllFiles="Kaikki tiedostot" Color="Väri" Opacity="Läpinäkyvyys" +Gradient="Liuku" +Gradient.Color="Liukuväri" +Gradient.Opacity="Liukuva läpinäkyvyys" +Gradient.Direction="Liu'un suunta" BkColor="Taustaväri" BkOpacity="Taustan läpinäkyvyys" Alignment="Sijoittelu" diff --git a/plugins/obs-text/data/locale/fr-FR.ini b/plugins/obs-text/data/locale/fr-FR.ini index 9db7ed5d5cb4ac..3a9bbca5f3fc3c 100644 --- a/plugins/obs-text/data/locale/fr-FR.ini +++ b/plugins/obs-text/data/locale/fr-FR.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Fichiers texte" Filter.AllFiles="Tous les fichiers" Color="Couleur" Opacity="Opacité" +Gradient="Dégradé" +Gradient.Color="Couleur du dégradé" +Gradient.Opacity="Opacité du dégradé" +Gradient.Direction="Direction du dégradé" BkColor="Couleur de l'arrière-plan" BkOpacity="Transparence de l'arrière-plan" Alignment="Alignement" diff --git a/plugins/obs-text/data/locale/hr-HR.ini b/plugins/obs-text/data/locale/hr-HR.ini new file mode 100644 index 00000000000000..148f12c635764e --- /dev/null +++ b/plugins/obs-text/data/locale/hr-HR.ini @@ -0,0 +1,34 @@ +TextGDIPlus="Tekst (GDI+)" +Font="Font" +Text="Tekst" +ReadFromFile="Učitaj iz datoteke" +TextFile="Tekstualne datoteka (UTF-8)" +Filter.TextFiles="Tekstualne datoteke" +Filter.AllFiles="Sve datoteke" +Color="Boja" +Opacity="Prozirnost" +Gradient="Nijansa" +Gradient.Color="Boja nijanse" +Gradient.Opacity="Nijansa prozirnosti" +Gradient.Direction="Pravac nijansi" +BkColor="Pozadinska boja" +BkOpacity="Prozirnost pozadine" +Alignment="Poravnanje" +Alignment.Left="Levo" +Alignment.Center="Centrirano" +Alignment.Right="Desno" +Vertical="Uspravno" +VerticalAlignment="Uspravno poravnanje" +VerticalAlignment.Top="Vrh" +VerticalAlignment.Bottom="Dno" +Outline="Okvir" +Outline.Size="Debljina okvira" +Outline.Color="Boja okvira" +Outline.Opacity="Prozirnost okvira" +ChatlogMode="Režim zapisnika ćaskanja" +ChatlogMode.Lines="Broj linija u zapisniku" +UseCustomExtents="Koristi posebne dimenzije teksta" +UseCustomExtents.Wrap="Prelom" +Width="Širina" +Height="Visina" + diff --git a/plugins/obs-text/data/locale/hu-HU.ini b/plugins/obs-text/data/locale/hu-HU.ini index e46508a303ccc7..b5d5966a162bd8 100644 --- a/plugins/obs-text/data/locale/hu-HU.ini +++ b/plugins/obs-text/data/locale/hu-HU.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Szöveges fájlok" Filter.AllFiles="Minden fájl" Color="Szín" Opacity="Áttetszőség" +Gradient="Színátmenet" +Gradient.Color="Színátmenet színe" +Gradient.Opacity="Színátmenet áttetszősége" +Gradient.Direction="Színátmenet iránya" BkColor="Háttérszín" BkOpacity="Háttér áttetszőség" Alignment="Pozíció" diff --git a/plugins/obs-text/data/locale/it-IT.ini b/plugins/obs-text/data/locale/it-IT.ini new file mode 100644 index 00000000000000..520009538e72e2 --- /dev/null +++ b/plugins/obs-text/data/locale/it-IT.ini @@ -0,0 +1,34 @@ +TextGDIPlus="Testo (GDI+)" +Font="Font" +Text="Testo" +ReadFromFile="Leggi da file" +TextFile="File di testo (UTF-8)" +Filter.TextFiles="File di testo" +Filter.AllFiles="Tutti i file" +Color="Colore" +Opacity="Opacità" +Gradient="Sfumato" +Gradient.Color="Colore sfumatura" +Gradient.Opacity="Opacità sfumatura" +Gradient.Direction="Direzione sfumatura" +BkColor="Colore dello sfondo" +BkOpacity="Opacità Sfondo" +Alignment="Allineamento" +Alignment.Left="A sinistra" +Alignment.Center="Al centro" +Alignment.Right="A destra" +Vertical="Verticale" +VerticalAlignment="Allineamento verticale" +VerticalAlignment.Top="Alto" +VerticalAlignment.Bottom="Dal basso" +Outline="Contorno" +Outline.Size="Dimensione contorno" +Outline.Color="Colore del contorno" +Outline.Opacity="Opacità contorno" +ChatlogMode="Modalità Chatlog" +ChatlogMode.Lines="Limite linea Chatlog" +UseCustomExtents="Usa personalizzazioni testo" +UseCustomExtents.Wrap="A capo automatico" +Width="Larghezza" +Height="Altezza" + diff --git a/plugins/obs-text/data/locale/ja-JP.ini b/plugins/obs-text/data/locale/ja-JP.ini index 7797aa078f720f..386b4ce24c0c93 100644 --- a/plugins/obs-text/data/locale/ja-JP.ini +++ b/plugins/obs-text/data/locale/ja-JP.ini @@ -7,6 +7,10 @@ Filter.TextFiles="テキストファイル" Filter.AllFiles="すべてのファイル" Color="色" Opacity="不透明度" +Gradient="グラデーション" +Gradient.Color="グラデーションカラー" +Gradient.Opacity="グラデーションの不透明度" +Gradient.Direction="グラデーションの方向" BkColor="背景色" BkOpacity="背景の不透明度" Alignment="位置揃え" diff --git a/plugins/obs-text/data/locale/ko-KR.ini b/plugins/obs-text/data/locale/ko-KR.ini index 2547c759c2be78..ecc0e5fdbcbc06 100644 --- a/plugins/obs-text/data/locale/ko-KR.ini +++ b/plugins/obs-text/data/locale/ko-KR.ini @@ -7,6 +7,10 @@ Filter.TextFiles="텍스트 파일" Filter.AllFiles="모든 파일" Color="색" Opacity="투명도" +Gradient="바림" +Gradient.Color="바림 색" +Gradient.Opacity="발미 불투명도" +Gradient.Direction="바림 방향" BkColor="배경 색상" BkOpacity="배경 불투명도" Alignment="정렬" diff --git a/plugins/obs-text/data/locale/nb-NO.ini b/plugins/obs-text/data/locale/nb-NO.ini new file mode 100644 index 00000000000000..2366aa094d714f --- /dev/null +++ b/plugins/obs-text/data/locale/nb-NO.ini @@ -0,0 +1,25 @@ +TextGDIPlus="Tekst (GDI +)" +Font="Skrifttype" +Text="Tekst" +ReadFromFile="Lese fra fil" +TextFile="Tekstfil (UTF-8)" +Filter.TextFiles="Tekstfiler" +Filter.AllFiles="Alle filer" +Color="Farge" +Opacity="Gjennomsiktighet" +BkColor="Bakgrunnsfarge" +BkOpacity="Gjennomsiktighet bakgrunn" +Alignment="Justering" +Alignment.Left="Venstre" +Alignment.Center="I midten" +Alignment.Right="Høyre" +Vertical="Vertikal" +VerticalAlignment="Loddrett justering" +VerticalAlignment.Top="Topp" +VerticalAlignment.Bottom="Bunn" +ChatlogMode="Chatlog modus" +UseCustomExtents="Bruk egendefinerte tekst-utvidelser" +UseCustomExtents.Wrap="Ordbrytning" +Width="Bredde" +Height="Høyde" + diff --git a/plugins/obs-text/data/locale/pl-PL.ini b/plugins/obs-text/data/locale/pl-PL.ini index 6298b53682aed9..384ca1528ec4ee 100644 --- a/plugins/obs-text/data/locale/pl-PL.ini +++ b/plugins/obs-text/data/locale/pl-PL.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Pliki tekstowe" Filter.AllFiles="Wszystkie pliki" Color="Kolor" Opacity="Przezroczystość" +Gradient="Gradient" +Gradient.Color="Kolor gradientu" +Gradient.Opacity="Przezroczystość gradientu" +Gradient.Direction="Kierunek gradientu" BkColor="Kolor tła" BkOpacity="Przezroczystość tła" Alignment="Wyrównanie" diff --git a/plugins/obs-text/data/locale/ru-RU.ini b/plugins/obs-text/data/locale/ru-RU.ini index 04d81ce0f3471e..07dafecd7ab4f5 100644 --- a/plugins/obs-text/data/locale/ru-RU.ini +++ b/plugins/obs-text/data/locale/ru-RU.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Текстовые файлы" Filter.AllFiles="Все файлы" Color="Цвет" Opacity="Непрозрачность" +Gradient="Градиент" +Gradient.Color="Цвет градиента" +Gradient.Opacity="Непрозрачность градиента" +Gradient.Direction="Направление градиента" BkColor="Цвет фона" BkOpacity="Непрозрачность фона" Alignment="Выравнивание" diff --git a/plugins/obs-text/data/locale/sr-CS.ini b/plugins/obs-text/data/locale/sr-CS.ini new file mode 100644 index 00000000000000..148f12c635764e --- /dev/null +++ b/plugins/obs-text/data/locale/sr-CS.ini @@ -0,0 +1,34 @@ +TextGDIPlus="Tekst (GDI+)" +Font="Font" +Text="Tekst" +ReadFromFile="Učitaj iz datoteke" +TextFile="Tekstualne datoteka (UTF-8)" +Filter.TextFiles="Tekstualne datoteke" +Filter.AllFiles="Sve datoteke" +Color="Boja" +Opacity="Prozirnost" +Gradient="Nijansa" +Gradient.Color="Boja nijanse" +Gradient.Opacity="Nijansa prozirnosti" +Gradient.Direction="Pravac nijansi" +BkColor="Pozadinska boja" +BkOpacity="Prozirnost pozadine" +Alignment="Poravnanje" +Alignment.Left="Levo" +Alignment.Center="Centrirano" +Alignment.Right="Desno" +Vertical="Uspravno" +VerticalAlignment="Uspravno poravnanje" +VerticalAlignment.Top="Vrh" +VerticalAlignment.Bottom="Dno" +Outline="Okvir" +Outline.Size="Debljina okvira" +Outline.Color="Boja okvira" +Outline.Opacity="Prozirnost okvira" +ChatlogMode="Režim zapisnika ćaskanja" +ChatlogMode.Lines="Broj linija u zapisniku" +UseCustomExtents="Koristi posebne dimenzije teksta" +UseCustomExtents.Wrap="Prelom" +Width="Širina" +Height="Visina" + diff --git a/plugins/obs-text/data/locale/sr-SP.ini b/plugins/obs-text/data/locale/sr-SP.ini new file mode 100644 index 00000000000000..6ca784c88f8b99 --- /dev/null +++ b/plugins/obs-text/data/locale/sr-SP.ini @@ -0,0 +1,34 @@ +TextGDIPlus="Текст (GDI+)" +Font="Фонт" +Text="Текст" +ReadFromFile="Учитај из датотеке" +TextFile="Текстуалне датотеке (UTF-8)" +Filter.TextFiles="Текстуалне датотеке" +Filter.AllFiles="Све датотеке" +Color="Боја" +Opacity="Прозирност" +Gradient="Нијанса" +Gradient.Color="Боја нијансе" +Gradient.Opacity="Нијанса прозирности" +Gradient.Direction="Правац нијанси" +BkColor="Позадинска боја" +BkOpacity="Прозирност позадине" +Alignment="Поравнање" +Alignment.Left="Лево" +Alignment.Center="Центрирано" +Alignment.Right="Десно" +Vertical="Усправно" +VerticalAlignment="Усправно поравнање" +VerticalAlignment.Top="Врх" +VerticalAlignment.Bottom="Дно" +Outline="Оквир" +Outline.Size="Дебљина оквира" +Outline.Color="Боја оквира" +Outline.Opacity="Прозирност оквира" +ChatlogMode="Режим записника ћаскања" +ChatlogMode.Lines="Број линија у записнику" +UseCustomExtents="Користи посебне димензије текста" +UseCustomExtents.Wrap="Прелом" +Width="Ширина" +Height="Висина" + diff --git a/plugins/obs-text/data/locale/sv-SE.ini b/plugins/obs-text/data/locale/sv-SE.ini index 70fa8b9d39df3e..7f108f844faa5c 100644 --- a/plugins/obs-text/data/locale/sv-SE.ini +++ b/plugins/obs-text/data/locale/sv-SE.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Textfiler" Filter.AllFiles="Alla filer" Color="Färg" Opacity="Opacitet" +Gradient="Gradient" +Gradient.Color="Gradientfärg" +Gradient.Opacity="Gradientopacitet" +Gradient.Direction="Gradientriktning" BkColor="Bakgrundsfärg" BkOpacity="Bakgrundsopacitet" Alignment="Justering" diff --git a/plugins/obs-text/data/locale/uk-UA.ini b/plugins/obs-text/data/locale/uk-UA.ini index 1ea325ccb37bcd..a6c9ba9ae7539d 100644 --- a/plugins/obs-text/data/locale/uk-UA.ini +++ b/plugins/obs-text/data/locale/uk-UA.ini @@ -7,6 +7,10 @@ Filter.TextFiles="Текстові файли" Filter.AllFiles="Всі файли" Color="Колір" Opacity="Непрозорість" +Gradient="Градієнтна заливка" +Gradient.Color="Колір градієнта" +Gradient.Opacity="Непрозорость градієнта" +Gradient.Direction="Напрямок градієнта (кут)" BkColor="Колір фону" BkOpacity="Непрозорість фону" Alignment="Вирівнювання" diff --git a/plugins/obs-text/data/locale/zh-CN.ini b/plugins/obs-text/data/locale/zh-CN.ini index d86290e69e060b..83d03610457528 100644 --- a/plugins/obs-text/data/locale/zh-CN.ini +++ b/plugins/obs-text/data/locale/zh-CN.ini @@ -7,6 +7,10 @@ Filter.TextFiles="文本文件" Filter.AllFiles="所有文件" Color="色彩" Opacity="不透明度" +Gradient="渐变" +Gradient.Color="渐变颜色" +Gradient.Opacity="渐变不透明度" +Gradient.Direction="渐变方向" BkColor="背景颜色" BkOpacity="背景不透明度" Alignment="对齐" diff --git a/plugins/obs-text/data/locale/zh-TW.ini b/plugins/obs-text/data/locale/zh-TW.ini index b883e91efef2bd..8f18a35a83a59b 100644 --- a/plugins/obs-text/data/locale/zh-TW.ini +++ b/plugins/obs-text/data/locale/zh-TW.ini @@ -7,6 +7,12 @@ Filter.TextFiles="文字檔案" Filter.AllFiles="所有檔案" Color="顏色" Opacity="不透明度" +Gradient="漸層" +Gradient.Color="漸層色彩" +Gradient.Opacity="漸層不透明度" +Gradient.Direction="漸層方向" +BkColor="背景顏色" +BkOpacity="背景不透明度" Alignment="對齊方式" Alignment.Left="靠左對齊" Alignment.Center="置中" diff --git a/plugins/obs-transitions/data/locale/el-GR.ini b/plugins/obs-transitions/data/locale/el-GR.ini index a23a5cfbae9644..f8b75f37045646 100644 --- a/plugins/obs-transitions/data/locale/el-GR.ini +++ b/plugins/obs-transitions/data/locale/el-GR.ini @@ -1,3 +1,6 @@ FadeTransition="Ξεθώριασμα" CutTransition="Αποκοπή" +Direction.Left="Αριστερά" +Direction.Right="Δεξιά" +Color="Χρώμα" diff --git a/plugins/obs-x264/data/locale/ko-KR.ini b/plugins/obs-x264/data/locale/ko-KR.ini index 88a0b034555331..ee9a40266217da 100644 --- a/plugins/obs-x264/data/locale/ko-KR.ini +++ b/plugins/obs-x264/data/locale/ko-KR.ini @@ -5,7 +5,7 @@ RateControl="데이터율 제어" CRF="CRF" KeyframeIntervalSec="키프레임 간격 (초 단위, 0=자동)" CPUPreset="CPU 사용량 사전설정 (높음 = 적은 CPU 부담)" -Profile="프로필" +Profile="프로파일" Tune="조정" None="(없음)" EncoderOptions="x264 설정 (공백으로 구분)" diff --git a/plugins/obs-x264/data/locale/vi-VN.ini b/plugins/obs-x264/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..5de7382ca5daed --- /dev/null +++ b/plugins/obs-x264/data/locale/vi-VN.ini @@ -0,0 +1,13 @@ +Bitrate="Bitrate" +CustomBufsize="Sử dụng tùy chỉnh bộ đệm kích thước" +BufferSize="Bộ nhớ đệm lớn nhất" +RateControl="Cách kiểm soát bitrate" +CRF="CRF" +KeyframeIntervalSec="Keyframe Interval (giây, 0 = auto)" +CPUPreset="CPU sử dụng (cao hơn = ít sử dụng CPU)" +Profile="Hồ sơ" +Tune="Điều chỉnh" +None="(Trống)" +EncoderOptions="x264 tùy chọn (phân cách bởi khoảng trống)" +VFR="Framerate thay đổi được (VFR)" + diff --git a/plugins/text-freetype2/data/locale/ms-MY.ini b/plugins/text-freetype2/data/locale/ms-MY.ini new file mode 100644 index 00000000000000..95ab97ffb25e66 --- /dev/null +++ b/plugins/text-freetype2/data/locale/ms-MY.ini @@ -0,0 +1,9 @@ +TextFreetype2="Teks (FreeType 2)" +Font="Jenis Tulisan" +Text="Teks" +TextFile="Fail teks (UTF-8 atau UTF-16)" +TextFileFilter="Fail teks (*.txt);;" +ChatLogMode="Mod log chat (6 baris terakhir)" +Color1="Warna 1" +Color2="Warna 2" + diff --git a/plugins/win-capture/data/locale/el-GR.ini b/plugins/win-capture/data/locale/el-GR.ini index 2670624a879279..1763126b82a321 100644 --- a/plugins/win-capture/data/locale/el-GR.ini +++ b/plugins/win-capture/data/locale/el-GR.ini @@ -16,4 +16,5 @@ GameCapture.ForceScaling="Εξανάγκαση Κλιμάκωσης" GameCapture.ScaleRes="Κλιμάκωση Ανάλυσης" GameCapture.LimitFramerate="Περιορισμός των frame καταγραφής" GameCapture.CaptureOverlays="Καταγραφή επικαλύψεων τρίτου προσώπου (όπως π.χ. steam)" +Mode="Τύπος" diff --git a/plugins/win-capture/data/locale/es-ES.ini b/plugins/win-capture/data/locale/es-ES.ini index 33605484448ae8..878c98c864c0f7 100644 --- a/plugins/win-capture/data/locale/es-ES.ini +++ b/plugins/win-capture/data/locale/es-ES.ini @@ -16,7 +16,7 @@ GameCapture.CaptureWindow="Capturar ventana específica" GameCapture.UseHotkey="Capturar ventana en primer plano con teclas de acceso rápido" GameCapture.ForceScaling="Forzar escalado" GameCapture.ScaleRes="Resolución de la escala" -GameCapture.LimitFramerate="Limitar ratio de captura" +GameCapture.LimitFramerate="Limitar velocidad de los fotogramas de la captura" GameCapture.CaptureOverlays="Capturar capas de aplicaciones externas (tales como Steam)" GameCapture.AntiCheatHook="Utilice la compatibilidad anti-trampa" GameCapture.HotkeyStart="Captura ventana en primer plano" diff --git a/plugins/win-capture/data/locale/it-IT.ini b/plugins/win-capture/data/locale/it-IT.ini index 92b828cbfdde4c..7d502929ae4853 100644 --- a/plugins/win-capture/data/locale/it-IT.ini +++ b/plugins/win-capture/data/locale/it-IT.ini @@ -21,4 +21,5 @@ GameCapture.CaptureOverlays="Cattura overlay di terze parti (ad esempio Steam)" GameCapture.AntiCheatHook="Usa la compatibilità anti-cheat" GameCapture.HotkeyStart="Cattura finestra in primo piano" GameCapture.HotkeyStop="Disattiva cattura" +Mode="Modalità" diff --git a/plugins/win-capture/data/locale/nb-NO.ini b/plugins/win-capture/data/locale/nb-NO.ini index c06e0b5d3c3fd5..da9320abec3a02 100644 --- a/plugins/win-capture/data/locale/nb-NO.ini +++ b/plugins/win-capture/data/locale/nb-NO.ini @@ -17,4 +17,5 @@ GameCapture.ScaleRes="Skaler oppløsning" GameCapture.LimitFramerate="Begrens opptakets bildefrekvens" GameCapture.CaptureOverlays="Ta opp tredjeparts overlag (som Steam)" GameCapture.AntiCheatHook="Bruk antijukskompitabilitet-hook" +Mode="Modus" diff --git a/plugins/win-capture/data/locale/vi-VN.ini b/plugins/win-capture/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..21f3fc4ea79d08 --- /dev/null +++ b/plugins/win-capture/data/locale/vi-VN.ini @@ -0,0 +1,23 @@ +MonitorCapture="Quay màn hình" +WindowCapture="Quay cửa sổ" +WindowCapture.Window="Cửa sổ" +WindowCapture.Priority="Cửa sổ ưu tiên" +WindowCapture.Priority.Title="Tiêu đề cửa sổ" +WindowCapture.Priority.Class="Lớp cửa sổ" +WindowCapture.Priority.Exe="Tên thực thi" +CaptureCursor="Quay cả con trỏ" +Compatibility="Khả năng tương thích đa adapter" +AllowTransparency="Cho phép trong suốt" +Monitor="Hiển thị" +PrimaryMonitor="Màn hình chính" +GameCapture="Quay trò chơi" +GameCapture.AnyFullscreen="Quay tất cả các ứng dụng fullscreen" +GameCapture.CaptureWindow="Quay cửa sổ cụ thể" +GameCapture.UseHotkey="Quay nền trước cửa sổ với phím nóng" +GameCapture.LimitFramerate="Giới hạn framerate" +GameCapture.CaptureOverlays="Quay cả overlay (chẳng hạn như Steam)" +GameCapture.AntiCheatHook="Dùng hook tương thích với phần mềm chống gian lận" +GameCapture.HotkeyStart="Quay nền trước cửa sổ" +GameCapture.HotkeyStop="Tắt quay" +Mode="Chế độ" + diff --git a/plugins/win-dshow/data/locale/el-GR.ini b/plugins/win-dshow/data/locale/el-GR.ini index a1125d803da966..48618f6bcdc23f 100644 --- a/plugins/win-dshow/data/locale/el-GR.ini +++ b/plugins/win-dshow/data/locale/el-GR.ini @@ -22,6 +22,8 @@ AudioOutputMode.WaveOut="Έξοδος ήχου επιφάνειας εργασί UseCustomAudioDevice="Χρήση προσαρμοσμένης συσκευής ήχου" AudioDevice="Συσκευή Ήχου" Buffering="Γίνεται φόρτωση" +Buffering.Enable="Ενεργοποίηση" +Buffering.Disable="Απενεργοποίηση" Activate="Ενεργοποίηση" Deactivate="Απενεργοποίηση" FlipVertically="Κάθετη αναστροφή" diff --git a/plugins/win-dshow/data/locale/it-IT.ini b/plugins/win-dshow/data/locale/it-IT.ini index 84320ff971ca8e..bf8d605c6a9682 100644 --- a/plugins/win-dshow/data/locale/it-IT.ini +++ b/plugins/win-dshow/data/locale/it-IT.ini @@ -24,6 +24,7 @@ AudioOutputMode.WaveOut="Output audio desktop (WaveOut)" UseCustomAudioDevice="Usa il dispositivo audio personalizzato" AudioDevice="Dispositivo audio" Buffering="Buffering" +Buffering.ToolTip="Quando abilitato, carica audio e video per garantire la più fluida e la più\naccurata riproduzione possibile, ma a costo di un aumento della latenza. Quando si usa\nil buffering con una scheda di acquisizione video, si consiglia di impostare la scheda e il\nprogramma allla stessa frequenza fotogrammi per migliori resulti.\n\nQuando disattivato, assicura la riproduzione di latenza minima, ma a scapito della precisione di frame\nnella riproduzione. Questo è l'ideale per le telecamere per il volto, o quando si desidera utilizzare la finestra di anteprima\ndel programma per giocare alla console.\n\nAuto-detect (predefinito) imposta attivato se il dispositivo ha ritardo e disabilitato\nse non ha alcun ritardo." Buffering.AutoDetect="Ricon. autom." Buffering.Enable="Abilita" Buffering.Disable="Disabilita" diff --git a/plugins/win-dshow/data/locale/nb-NO.ini b/plugins/win-dshow/data/locale/nb-NO.ini index 2aa8e069586bba..fd9c325c2f643e 100644 --- a/plugins/win-dshow/data/locale/nb-NO.ini +++ b/plugins/win-dshow/data/locale/nb-NO.ini @@ -24,6 +24,9 @@ AudioOutputMode.WaveOut="Send ut skrivebordslyd (WaveOut)" UseCustomAudioDevice="Bruk egendefinert lydenhet" AudioDevice="Lydenhet" Buffering="Bufring" +Buffering.AutoDetect="Automatisk søk" +Buffering.Enable="Aktiver" +Buffering.Disable="Deaktiver" Activate="Aktiver" Deactivate="Deaktiver" FlipVertically="Vend loddrett" diff --git a/plugins/win-dshow/data/locale/sv-SE.ini b/plugins/win-dshow/data/locale/sv-SE.ini index 3f27a26ebdc7d8..b5c6447e1c8ed3 100644 --- a/plugins/win-dshow/data/locale/sv-SE.ini +++ b/plugins/win-dshow/data/locale/sv-SE.ini @@ -24,6 +24,7 @@ AudioOutputMode.WaveOut="Skrivbordsljud (WaveOut)" UseCustomAudioDevice="Använd anpassad ljudenhet" AudioDevice="Ljudenhet" Buffering="Buffrar" +Buffering.ToolTip="Aktiverad: buffrar data för video/ljud för att försäkra den mest jämna \n och träffsäkra uppspelningen som möjligt, men med mer latens. När buffrandet används med ett capture card är det rekommenderat att sätta kortet och programmet till till samma framerate för optimalt resultat.\n\nAvaktiverad: garanterar lägsta möjliga uppspelningslatens, men på bekostnad av träffsäkerheten för \nuppspelningen av bildrutor. Det här är idealt för facecams, eller när du vill använda programmets förhandsvisningsfönster\nför att spela på en konsol.\n\nUpptäck automatiskt (standard): aktiverar om enheten dröjer, och avaktiverad om den inte dröjer." Buffering.AutoDetect="Upptäck automatiskt" Buffering.Enable="Aktivera" Buffering.Disable="Inaktivera" diff --git a/plugins/win-mf/data/locale/vi-VN.ini b/plugins/win-mf/data/locale/vi-VN.ini new file mode 100644 index 00000000000000..42a805561dd04d --- /dev/null +++ b/plugins/win-mf/data/locale/vi-VN.ini @@ -0,0 +1,29 @@ +MFAACEnc="Media Foundation AAC Encoder" +Bitrate="Bitrate" + +MF.H264.EncoderName="Media Foundation H264 Encoder" +MF.H264.Encoder="Tên Encoder" +MF.H264.LowLatency="Độ trễ thấp (Tắt frame re-ordering)" +MF.H264.CustomBufsize="Sử dụng tùy chỉnh bộ đệm kích thước" +MF.H264.BufferSize="Kích cỡ bộ đệm" +MF.H264.CustomMaxBitrate="Sử dụng tùy chỉnh Bitrate cao nhất" +MF.H264.Bitrate="Bitrate" +MF.H264.MaxBitrate="Bitrate Cao nhất" +MF.H264.KeyframeIntervalSec="Keyframe Interval (giây, 0 = auto)" +MF.H264.RateControl="Cách kiểm soát bitrate" +MF.H264.CBR="CBR (Bitrate cố định)" +MF.H264.VBR="VBR (Bitrate thay đổi được)" +MF.H264.CQP="CQP (Chất lượng cố định)" +MF.H264.MinQP="QP Thấp nhất" +MF.H264.MaxQP="QP Cao nhất" +MF.H264.QPI="QP I-Frame" +MF.H264.QPP="QP P-Frame" +MF.H264.QPB="QP B-Frame" +MF.H264.Profile="Hồ sơ" +MF.H264.Advanced="Nâng cao" + +MF.H264.EncoderSWMicrosoft="Microsoft Software H.264 Encoder" +MF.H264.EncoderHWAMD="AMD Video Coding Engine H.264 Encoder (Media Foundation)" +MF.H264.EncoderHWIntel="Intel Quick Sync H.264 Encoder (Media Foundation)" +MF.H264.EncoderHWNVIDIA="NVIDIA NVENC H.264 Encoder (Media Foundation)" + From 5b44b1994e28ae9cd23b0b84c20b5bd69ff70c17 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 13:36:23 -0700 Subject: [PATCH 73/80] libobs: Update to version 0.16.3 --- libobs/obs-config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs/obs-config.h b/libobs/obs-config.h index 3636e76b0441b7..efd5db47a7c1df 100644 --- a/libobs/obs-config.h +++ b/libobs/obs-config.h @@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 2 +#define LIBOBS_API_PATCH_VER 3 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ ((major << 24) | \ From 41a3a306557c22ecd37d73600e0facc368b7fe94 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 3 Nov 2016 14:22:08 -0700 Subject: [PATCH 74/80] win-mf: Deprecate AMD Media Foundation H.264 encoder --- plugins/win-mf/mf-h264.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/win-mf/mf-h264.cpp b/plugins/win-mf/mf-h264.cpp index 56fc5ae22efca5..d10e691e71b083 100644 --- a/plugins/win-mf/mf-h264.cpp +++ b/plugins/win-mf/mf-h264.cpp @@ -542,12 +542,7 @@ void RegisterMFH264Encoders() if (!CanSpawnEncoder(e)) continue; - if (e->Type() == EncoderType::H264_QSV || - e->Type() == EncoderType::H264_NVENC) - info.caps = OBS_ENCODER_CAP_DEPRECATED; - else - info.caps = 0; - + info.caps = OBS_ENCODER_CAP_DEPRECATED; info.id = e->Id(); info.type_data = new TypeData(e); info.free_type_data = [] (void *type_data) { From 2c5577facd775538cb0070a5c8e2faf69d69a45a Mon Sep 17 00:00:00 2001 From: Ryan Foster Date: Fri, 4 Nov 2016 06:25:46 -0400 Subject: [PATCH 75/80] UI: Fix tab order of Crop fields in Transform Properties --- UI/forms/OBSBasicTransform.ui | 38 +++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/UI/forms/OBSBasicTransform.ui b/UI/forms/OBSBasicTransform.ui index c801b3da795617..817e516ddc75af 100644 --- a/UI/forms/OBSBasicTransform.ui +++ b/UI/forms/OBSBasicTransform.ui @@ -493,6 +493,25 @@ + + + + + 0 + 0 + + + + + 70 + 0 + + + + 100000 + + + @@ -602,25 +621,6 @@ - - - - - 0 - 0 - - - - - 70 - 0 - - - - 100000 - - - From 25fa89579643fb547ac140c3ffdbe5cc211fceb5 Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Fri, 4 Nov 2016 11:53:59 +0100 Subject: [PATCH 76/80] enc-amf: Update to Version 1.4.1.0 --- plugins/enc-amf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/enc-amf b/plugins/enc-amf index cafe7bdae18421..e85db76474eb3e 160000 --- a/plugins/enc-amf +++ b/plugins/enc-amf @@ -1 +1 @@ -Subproject commit cafe7bdae18421414911bbe337534182f3b571cd +Subproject commit e85db76474eb3e11dcc773bd1dd7a87407cb36bc From 06894c6e84d1a12bce4cbfd635cdb17065f1e496 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 4 Nov 2016 04:26:52 -0700 Subject: [PATCH 77/80] Revert "UI: Only scale HiDPI on QT 5.6+" This reverts commit 404258f41a407ce2f0b070271ffceecf1626c66e. --- UI/obs-app.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index c236a2b3f19441..78cc5b44884152 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -29,7 +29,6 @@ #include #include -#include #include #include #include @@ -1320,9 +1319,7 @@ static int run_program(fstream &logFile, int argc, char *argv[]) QCoreApplication::addLibraryPath("."); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); -#endif OBSApp program(argc, argv, profilerNameStore.get()); try { From fa0bd585a56463b61de11cdddedc427e822e3c80 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 4 Nov 2016 04:27:07 -0700 Subject: [PATCH 78/80] Revert "UI: Enable HiDPI scaling." This reverts commit c4eebbba54717bac6abb1ae22ae1cb492fe212ad. --- UI/obs-app.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 78cc5b44884152..84ff5205e66df1 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -1319,8 +1319,6 @@ static int run_program(fstream &logFile, int argc, char *argv[]) QCoreApplication::addLibraryPath("."); - QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - OBSApp program(argc, argv, profilerNameStore.get()); try { program.AppInit(); From b25a38517fdea0751faff309f98fef74dcd39c9b Mon Sep 17 00:00:00 2001 From: Michael Fabian Dirks Date: Fri, 4 Nov 2016 13:51:25 +0100 Subject: [PATCH 79/80] enc-amf: Fix VS2013 compiling issue VS2013 doesn't include by default, this quick update fixes that problem. --- plugins/enc-amf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/enc-amf b/plugins/enc-amf index e85db76474eb3e..caf8f62aa15f17 160000 --- a/plugins/enc-amf +++ b/plugins/enc-amf @@ -1 +1 @@ -Subproject commit e85db76474eb3e11dcc773bd1dd7a87407cb36bc +Subproject commit caf8f62aa15f1745e408b6809f8e875a372e76eb From b77fdd7c9a99b34414afeb90d5d5a2970fb58f58 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Fri, 4 Nov 2016 05:54:02 -0700 Subject: [PATCH 80/80] libobs: Update to version 0.16.4 --- libobs/obs-config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libobs/obs-config.h b/libobs/obs-config.h index efd5db47a7c1df..f4e3a9e7e473cc 100644 --- a/libobs/obs-config.h +++ b/libobs/obs-config.h @@ -41,7 +41,7 @@ * * Reset to zero each major or minor version */ -#define LIBOBS_API_PATCH_VER 3 +#define LIBOBS_API_PATCH_VER 4 #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ ((major << 24) | \