浏览代码

Merge pull request #1043 from DDRBoxman/decklinkout

Decklink: Add decklink output
Jim 7 年之前
父节点
当前提交
a43a4fac7e
共有 95 个文件被更改,包括 2973 次插入1036 次删除
  1. 20 0
      plugins/decklink/DecklinkBase.cpp
  2. 33 0
      plugins/decklink/DecklinkBase.h
  3. 20 22
      plugins/decklink/DecklinkInput.cpp
  4. 4 25
      plugins/decklink/DecklinkInput.hpp
  5. 110 0
      plugins/decklink/DecklinkOutput.cpp
  6. 33 0
      plugins/decklink/DecklinkOutput.hpp
  7. 32 0
      plugins/decklink/const.h
  8. 1 0
      plugins/decklink/data/locale/en-US.ini
  9. 3 2
      plugins/decklink/decklink-device-discovery.hpp
  10. 107 11
      plugins/decklink/decklink-device-instance.cpp
  11. 16 2
      plugins/decklink/decklink-device-instance.hpp
  12. 16 0
      plugins/decklink/decklink-device-mode.cpp
  13. 3 0
      plugins/decklink/decklink-device-mode.hpp
  14. 75 28
      plugins/decklink/decklink-device.cpp
  15. 9 5
      plugins/decklink/decklink-device.hpp
  16. 17 0
      plugins/decklink/decklink-devices.cpp
  17. 8 0
      plugins/decklink/decklink-devices.hpp
  18. 239 0
      plugins/decklink/decklink-output.cpp
  19. 288 0
      plugins/decklink/decklink-source.cpp
  20. 17 5
      plugins/decklink/linux/CMakeLists.txt
  21. 175 59
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h
  22. 19 9
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h
  23. 3 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h
  24. 1 1
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h
  25. 3 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h
  26. 62 0
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_9.h
  27. 8 4
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h
  28. 7 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h
  29. 27 13
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch.cpp
  30. 146 0
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v10_8.cpp
  31. 8 8
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp
  32. 10 10
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp
  33. 58 12
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h
  34. 9 4
      plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h
  35. 4 4
      plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h
  36. 3 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h
  37. 45 0
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_9.h
  38. 27 27
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h
  39. 6 6
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h
  40. 35 35
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h
  41. 4 4
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h
  42. 5 5
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h
  43. 6 6
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h
  44. 3 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h
  45. 3 3
      plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h
  46. 13 8
      plugins/decklink/linux/decklink-sdk/LinuxCOM.h
  47. 26 8
      plugins/decklink/mac/CMakeLists.txt
  48. 177 61
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h
  49. 19 9
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h
  50. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h
  51. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h
  52. 62 0
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_9.h
  53. 8 4
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h
  54. 7 3
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h
  55. 31 18
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch.cpp
  56. 193 0
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v10_8.cpp
  57. 10 10
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp
  58. 13 13
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp
  59. 58 12
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h
  60. 21 17
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h
  61. 9 4
      plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h
  62. 5 4
      plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h
  63. 3 3
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h
  64. 45 0
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_9.h
  65. 18 18
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h
  66. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h
  67. 18 18
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h
  68. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h
  69. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h
  70. 4 4
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h
  71. 2 2
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h
  72. 18 18
      plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h
  73. 9 328
      plugins/decklink/plugin-main.cpp
  74. 19 6
      plugins/decklink/win/CMakeLists.txt
  75. 167 49
      plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl
  76. 15 9
      plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl
  77. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl
  78. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl
  79. 52 10
      plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl
  80. 5 5
      plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl
  81. 40 0
      plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming_v10_8.idl
  82. 4 3
      plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl
  83. 4 4
      plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h
  84. 3 3
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl
  85. 1 1
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl
  86. 46 0
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_8.idl
  87. 61 0
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_9.idl
  88. 21 21
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl
  89. 4 4
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl
  90. 9 9
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl
  91. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl
  92. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl
  93. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl
  94. 2 2
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl
  95. 3 3
      plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl

+ 20 - 0
plugins/decklink/DecklinkBase.cpp

@@ -0,0 +1,20 @@
+#include "DecklinkBase.h"
+
+DecklinkBase::DecklinkBase(DeckLinkDeviceDiscovery *discovery_)
+		: discovery(discovery_)
+{
+}
+
+DeckLinkDevice *DecklinkBase::GetDevice() const
+{
+	return instance ? instance->GetDevice() : nullptr;
+}
+
+bool DecklinkBase::Activate(DeckLinkDevice*, long long)
+{
+	return false;
+}
+
+void DecklinkBase::Deactivate()
+{
+}

+ 33 - 0
plugins/decklink/DecklinkBase.h

@@ -0,0 +1,33 @@
+#pragma once
+
+#include <map>
+#include <vector>
+#include <mutex>
+
+#include <obs-module.h>
+
+#include "platform.hpp"
+
+#include "decklink-device-discovery.hpp"
+#include "decklink-device-instance.hpp"
+#include "decklink-device-mode.hpp"
+
+class DecklinkBase {
+
+protected:
+	DecklinkBase(DeckLinkDeviceDiscovery *discovery_);
+	ComPtr<DeckLinkDeviceInstance>       instance;
+	DeckLinkDeviceDiscovery              *discovery;
+	std::recursive_mutex                 deviceMutex;
+	volatile long                        activateRefs = 0;
+	BMDPixelFormat                       pixelFormat = bmdFormat8BitYUV;
+	video_colorspace                     colorSpace = VIDEO_CS_DEFAULT;
+	video_range_type                     colorRange = VIDEO_RANGE_DEFAULT;
+	speaker_layout                       channelFormat = SPEAKERS_STEREO;
+
+public:
+	virtual bool Activate(DeckLinkDevice *device, long long modeId);
+	virtual void Deactivate();
+
+	DeckLinkDevice *GetDevice() const;
+};

+ 20 - 22
plugins/decklink/decklink.cpp → plugins/decklink/DecklinkInput.cpp

@@ -1,30 +1,23 @@
-#include "decklink.hpp"
-#include "decklink-device-discovery.hpp"
-#include "decklink-device-instance.hpp"
-#include "decklink-device-mode.hpp"
+#include "DecklinkInput.hpp"
 
 #include <util/threading.h>
 
-DeckLink::DeckLink(obs_source_t *source, DeckLinkDeviceDiscovery *discovery_) :
-	discovery(discovery_), source(source)
+DeckLinkInput::DeckLinkInput(obs_source_t *source, DeckLinkDeviceDiscovery *discovery_)
+		: DecklinkBase(discovery_),
+		  source(source)
 {
-	discovery->AddCallback(DeckLink::DevicesChanged, this);
+	discovery->AddCallback(DeckLinkInput::DevicesChanged, this);
 }
 
-DeckLink::~DeckLink(void)
+DeckLinkInput::~DeckLinkInput(void)
 {
-	discovery->RemoveCallback(DeckLink::DevicesChanged, this);
+	discovery->RemoveCallback(DeckLinkInput::DevicesChanged, this);
 	Deactivate();
 }
 
-DeckLinkDevice *DeckLink::GetDevice() const
+void DeckLinkInput::DevicesChanged(void *param, DeckLinkDevice *device, bool added)
 {
-	return instance ? instance->GetDevice() : nullptr;
-}
-
-void DeckLink::DevicesChanged(void *param, DeckLinkDevice *device, bool added)
-{
-	DeckLink *decklink = reinterpret_cast<DeckLink*>(param);
+	DeckLinkInput *decklink = reinterpret_cast<DeckLinkInput*>(param);
 	std::lock_guard<std::recursive_mutex> lock(decklink->deviceMutex);
 
 	obs_source_update_properties(decklink->source);
@@ -54,7 +47,7 @@ void DeckLink::DevicesChanged(void *param, DeckLinkDevice *device, bool added)
 	}
 }
 
-bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
+bool DeckLinkInput::Activate(DeckLinkDevice *device, long long modeId)
 {
 	std::lock_guard<std::recursive_mutex> lock(deviceMutex);
 	DeckLinkDevice *curDevice = GetDevice();
@@ -82,7 +75,12 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
 	if (instance == nullptr)
 		return false;
 
-	DeckLinkDeviceMode *mode = GetDevice()->FindMode(modeId);
+	if (GetDevice() == nullptr) {
+		LOG(LOG_ERROR, "Tried to activate an input with nullptr device.");
+		return false;
+	}
+
+	DeckLinkDeviceMode *mode = GetDevice()->FindInputMode(modeId);
 	if (mode == nullptr) {
 		instance = nullptr;
 		return false;
@@ -100,7 +98,7 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
 	return true;
 }
 
-void DeckLink::Deactivate(void)
+void DeckLinkInput::Deactivate(void)
 {
 	std::lock_guard<std::recursive_mutex> lock(deviceMutex);
 	if (instance)
@@ -111,12 +109,12 @@ void DeckLink::Deactivate(void)
 	os_atomic_dec_long(&activateRefs);
 }
 
-bool DeckLink::Capturing(void)
+bool DeckLinkInput::Capturing(void)
 {
 	return isCapturing;
 }
 
-void DeckLink::SaveSettings()
+void DeckLinkInput::SaveSettings()
 {
 	if (!instance)
 		return;
@@ -136,7 +134,7 @@ void DeckLink::SaveSettings()
 	obs_data_release(settings);
 }
 
-obs_source_t *DeckLink::GetSource(void) const
+obs_source_t *DeckLinkInput::GetSource(void) const
 {
 	return source;
 }

+ 4 - 25
plugins/decklink/decklink.hpp → plugins/decklink/DecklinkInput.hpp

@@ -1,40 +1,19 @@
 #pragma once
 
-#include "platform.hpp"
+#include "DecklinkBase.h"
 
-#include <obs-module.h>
-
-#include <map>
-#include <vector>
-#include <mutex>
-
-class DeckLinkDeviceDiscovery;
-class DeckLinkDeviceInstance;
-class DeckLinkDevice;
-class DeckLinkDeviceMode;
-
-class DeckLink {
+class DeckLinkInput : public DecklinkBase {
 protected:
-	ComPtr<DeckLinkDeviceInstance>        instance;
-	DeckLinkDeviceDiscovery               *discovery;
 	bool                                  isCapturing = false;
 	obs_source_t                          *source;
-	volatile long                         activateRefs = 0;
-	std::recursive_mutex                  deviceMutex;
-	BMDPixelFormat                        pixelFormat = bmdFormat8BitYUV;
-	video_colorspace                      colorSpace = VIDEO_CS_DEFAULT;
-	video_range_type                      colorRange = VIDEO_RANGE_DEFAULT;
-	speaker_layout                        channelFormat = SPEAKERS_STEREO;
 
 	void SaveSettings();
 	static void DevicesChanged(void *param, DeckLinkDevice *device,
 			bool added);
 
 public:
-	DeckLink(obs_source_t *source, DeckLinkDeviceDiscovery *discovery);
-	virtual ~DeckLink(void);
-
-	DeckLinkDevice *GetDevice() const;
+	DeckLinkInput(obs_source_t *source, DeckLinkDeviceDiscovery *discovery);
+	virtual ~DeckLinkInput(void);
 
 	long long GetActiveModeId(void) const;
 	obs_source_t *GetSource(void) const;

+ 110 - 0
plugins/decklink/DecklinkOutput.cpp

@@ -0,0 +1,110 @@
+#include "DecklinkOutput.hpp"
+
+#include <util/threading.h>
+
+DeckLinkOutput::DeckLinkOutput(obs_output_t *output, DeckLinkDeviceDiscovery *discovery_)
+		: DecklinkBase(discovery_),
+		  output(output)
+{
+	discovery->AddCallback(DeckLinkOutput::DevicesChanged, this);
+}
+
+DeckLinkOutput::~DeckLinkOutput(void)
+{
+	discovery->RemoveCallback(DeckLinkOutput::DevicesChanged, this);
+	Deactivate();
+}
+
+void DeckLinkOutput::DevicesChanged(void *param, DeckLinkDevice *device, bool)
+{
+	auto *decklink = reinterpret_cast<DeckLinkOutput*>(param);
+	std::lock_guard<std::recursive_mutex> lock(decklink->deviceMutex);
+
+	blog(LOG_DEBUG, "%s", device->GetHash().c_str());
+}
+
+bool DeckLinkOutput::Activate(DeckLinkDevice *device, long long modeId)
+{
+	std::lock_guard<std::recursive_mutex> lock(deviceMutex);
+	DeckLinkDevice *curDevice = GetDevice();
+	const bool same = device == curDevice;
+	const bool isActive = instance != nullptr;
+
+	if (same) {
+		if (!isActive)
+			return false;
+
+		if (instance->GetActiveModeId() == modeId &&
+			instance->GetActivePixelFormat() == pixelFormat &&
+			instance->GetActiveColorSpace() == colorSpace &&
+			instance->GetActiveColorRange() == colorRange &&
+			instance->GetActiveChannelFormat() == channelFormat)
+			return false;
+	}
+
+	if (isActive)
+		instance->StopOutput();
+
+	if (!same)
+		instance.Set(new DeckLinkDeviceInstance(this, device));
+
+	if (instance == nullptr)
+		return false;
+
+	DeckLinkDeviceMode *mode = GetDevice()->FindOutputMode(modeId);
+	if (mode == nullptr) {
+		instance = nullptr;
+		return false;
+	}
+
+
+	if (!instance->StartOutput(mode)) {
+		instance = nullptr;
+		return false;
+	}
+
+	os_atomic_inc_long(&activateRefs);
+	return true;
+}
+
+void DeckLinkOutput::Deactivate(void)
+{
+	std::lock_guard<std::recursive_mutex> lock(deviceMutex);
+	if (instance)
+		instance->StopOutput();
+
+	instance = nullptr;
+
+	os_atomic_dec_long(&activateRefs);
+}
+
+obs_output_t *DeckLinkOutput::GetOutput(void) const
+{
+	return output;
+}
+
+void DeckLinkOutput::DisplayVideoFrame(video_data *frame)
+{
+	instance->DisplayVideoFrame(frame);
+}
+
+void DeckLinkOutput::WriteAudio(audio_data *frames)
+{
+	instance->WriteAudio(frames);
+}
+
+void DeckLinkOutput::SetSize(int width, int height)
+{
+	this->width = width;
+	this->height = height;
+}
+
+int DeckLinkOutput::GetWidth()
+{
+	return width;
+}
+
+int DeckLinkOutput::GetHeight()
+{
+	return height;
+}

+ 33 - 0
plugins/decklink/DecklinkOutput.hpp

@@ -0,0 +1,33 @@
+#pragma once
+
+#include "DecklinkBase.h"
+
+#include "../../libobs/media-io/video-scaler.h"
+
+class DeckLinkOutput : public DecklinkBase {
+protected:
+	obs_output_t *output;
+	int width;
+	int height;
+
+	static void DevicesChanged(void *param, DeckLinkDevice *device, bool added);
+
+public:
+	const char *deviceHash;
+	long long modeID;
+	uint64_t start_timestamp;
+	uint32_t audio_samplerate;
+	size_t audio_planes;
+	size_t audio_size;
+
+	DeckLinkOutput(obs_output_t *output, DeckLinkDeviceDiscovery *discovery);
+	virtual ~DeckLinkOutput(void);
+	obs_output_t *GetOutput(void) const;
+	bool Activate(DeckLinkDevice *device, long long modeId) override;
+	void Deactivate() override;
+	void DisplayVideoFrame(video_data *pData);
+	void WriteAudio(audio_data *frames);
+	void SetSize(int width, int height);
+	int GetWidth();
+	int GetHeight();
+};

+ 32 - 0
plugins/decklink/const.h

@@ -0,0 +1,32 @@
+#define DEVICE_HASH     "device_hash"
+#define DEVICE_NAME     "device_name"
+#define MODE_ID         "mode_id"
+#define MODE_NAME       "mode_name"
+#define CHANNEL_FORMAT  "channel_format"
+#define PIXEL_FORMAT    "pixel_format"
+#define COLOR_SPACE     "color_space"
+#define COLOR_RANGE     "color_range"
+#define BUFFERING       "buffering"
+#define DEACTIVATE_WNS  "deactivate_when_not_showing"
+#define AUTO_START      "auto_start"
+
+#define TEXT_DEVICE                 obs_module_text("Device")
+#define TEXT_MODE                   obs_module_text("Mode")
+#define TEXT_PIXEL_FORMAT           obs_module_text("PixelFormat")
+#define TEXT_COLOR_SPACE            obs_module_text("ColorSpace")
+#define TEXT_COLOR_SPACE_DEFAULT    obs_module_text("ColorSpace.Default")
+#define TEXT_COLOR_RANGE            obs_module_text("ColorRange")
+#define TEXT_COLOR_RANGE_DEFAULT    obs_module_text("ColorRange.Default")
+#define TEXT_COLOR_RANGE_PARTIAL    obs_module_text("ColorRange.Partial")
+#define TEXT_COLOR_RANGE_FULL       obs_module_text("ColorRange.Full")
+#define TEXT_CHANNEL_FORMAT         obs_module_text("ChannelFormat")
+#define TEXT_CHANNEL_FORMAT_NONE    obs_module_text("ChannelFormat.None")
+#define TEXT_CHANNEL_FORMAT_2_0CH   obs_module_text("ChannelFormat.2_0ch")
+#define TEXT_CHANNEL_FORMAT_2_1CH   obs_module_text("ChannelFormat.2_1ch")
+#define TEXT_CHANNEL_FORMAT_4_0CH   obs_module_text("ChannelFormat.4_0ch")
+#define TEXT_CHANNEL_FORMAT_4_1CH   obs_module_text("ChannelFormat.4_1ch")
+#define TEXT_CHANNEL_FORMAT_5_1CH   obs_module_text("ChannelFormat.5_1ch")
+#define TEXT_CHANNEL_FORMAT_7_1CH   obs_module_text("ChannelFormat.7_1ch")
+#define TEXT_BUFFERING              obs_module_text("Buffering")
+#define TEXT_DWNS                   obs_module_text("DeactivateWhenNotShowing")
+#define TEXT_AUTO_START             obs_module_text("AutoStart")

+ 1 - 0
plugins/decklink/data/locale/en-US.ini

@@ -18,3 +18,4 @@ ChannelFormat.4_1ch="4.1ch"
 ChannelFormat.5_1ch="5.1ch"
 ChannelFormat.7_1ch="7.1ch"
 DeactivateWhenNotShowing="Deactivate when not showing"
+AutoStart="Auto start on launch"

+ 3 - 2
plugins/decklink/decklink-device-discovery.hpp

@@ -1,10 +1,11 @@
 #pragma once
 
+#include <obs-module.h>
+#include "platform.hpp"
+
 #include <vector>
 #include <mutex>
 
-#include "decklink.hpp"
-
 class DeckLinkDevice;
 
 typedef void (*DeviceChangeCallback)(void *param, DeckLinkDevice *device,

+ 107 - 11
plugins/decklink/decklink-device-instance.cpp

@@ -1,13 +1,14 @@
 #include "decklink-device-instance.hpp"
 #include "audio-repack.hpp"
 
+#include "DecklinkInput.hpp"
+#include "DecklinkOutput.hpp"
+
 #include <util/platform.h>
 #include <util/threading.h>
 
 #include <sstream>
-
-#define LOG(level, message, ...) blog(level, "%s: " message, \
-		obs_source_get_name(this->decklink->GetSource()), ##__VA_ARGS__)
+#include <algorithm>
 
 static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
 {
@@ -55,7 +56,7 @@ static inline audio_repack_mode_t ConvertRepackFormat(speaker_layout format)
 	}
 }
 
-DeckLinkDeviceInstance::DeckLinkDeviceInstance(DeckLink *decklink_,
+DeckLinkDeviceInstance::DeckLinkDeviceInstance(DecklinkBase *decklink_,
 		DeckLinkDevice *device_) :
 	currentFrame(), currentPacket(), decklink(decklink_), device(device_)
 {
@@ -85,7 +86,7 @@ void DeckLinkDeviceInstance::HandleAudioPacket(
 	currentPacket.frames      = frameCount;
 	currentPacket.timestamp   = timestamp;
 
-	if (decklink && !decklink->buffering) {
+	if (decklink && !static_cast<DeckLinkInput*>(decklink)->buffering) {
 		currentPacket.timestamp = os_gettime_ns();
 		currentPacket.timestamp -=
 			(uint64_t)frameCount * 1000000000ULL /
@@ -112,7 +113,7 @@ void DeckLinkDeviceInstance::HandleAudioPacket(
 	nextAudioTS = timestamp +
 		((uint64_t)frameCount * 1000000000ULL / 48000ULL) + 1;
 
-	obs_source_output_audio(decklink->GetSource(), &currentPacket);
+	obs_source_output_audio(static_cast<DeckLinkInput*>(decklink)->GetSource(), &currentPacket);
 }
 
 void DeckLinkDeviceInstance::HandleVideoFrame(
@@ -133,7 +134,7 @@ void DeckLinkDeviceInstance::HandleVideoFrame(
 	currentFrame.height      = (uint32_t)videoFrame->GetHeight();
 	currentFrame.timestamp   = timestamp;
 
-	obs_source_output_video(decklink->GetSource(), &currentFrame);
+	obs_source_output_video(static_cast<DeckLinkInput*>(decklink)->GetSource(), &currentFrame);
 }
 
 void DeckLinkDeviceInstance::FinalizeStream()
@@ -161,7 +162,7 @@ void DeckLinkDeviceInstance::SetupVideoFormat(DeckLinkDeviceMode *mode_)
 
 	currentFrame.format = ConvertPixelFormat(pixelFormat);
 
-	colorSpace = decklink->GetColorSpace();
+	colorSpace = static_cast<DeckLinkInput*>(decklink)->GetColorSpace();
 	if (colorSpace == VIDEO_CS_DEFAULT) {
 		const BMDDisplayModeFlags flags = mode_->GetDisplayModeFlags();
 		if (flags & bmdDisplayModeColorspaceRec709)
@@ -174,7 +175,7 @@ void DeckLinkDeviceInstance::SetupVideoFormat(DeckLinkDeviceMode *mode_)
 		activeColorSpace = colorSpace;
 	}
 
-	colorRange = decklink->GetColorRange();
+	colorRange = static_cast<DeckLinkInput*>(decklink)->GetColorRange();
 	currentFrame.full_range = colorRange == VIDEO_RANGE_FULL;
 
 	video_format_get_parameters(activeColorSpace, colorRange,
@@ -210,7 +211,7 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
 		flags = bmdVideoInputEnableFormatDetection;
 	} else {
 		displayMode = mode_->GetDisplayMode();
-		pixelFormat = decklink->GetPixelFormat();
+		pixelFormat = static_cast<DeckLinkInput*>(decklink)->GetPixelFormat();
 		flags = bmdVideoInputFlagDefault;
 	}
 
@@ -223,7 +224,7 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
 
 	SetupVideoFormat(mode_);
 
-	channelFormat = decklink->GetChannelFormat();
+	channelFormat = static_cast<DeckLinkInput*>(decklink)->GetChannelFormat();
 	currentPacket.speakers = channelFormat;
 
 	int maxdevicechannel = device->GetMaxChannel();
@@ -279,6 +280,101 @@ bool DeckLinkDeviceInstance::StopCapture(void)
 	return true;
 }
 
+bool DeckLinkDeviceInstance::StartOutput(DeckLinkDeviceMode *mode_)
+{
+	if (mode != nullptr)
+		return false;
+	if (mode_ == nullptr)
+		return false;
+
+	LOG(LOG_INFO, "Starting output...");
+
+	if (!device->GetOutput(&output))
+		return false;
+
+	const HRESULT videoResult = output->EnableVideoOutput(
+			mode_->GetDisplayMode(),
+			bmdVideoOutputFlagDefault);
+	if (videoResult != S_OK) {
+		LOG(LOG_ERROR, "Failed to enable video output");
+		return false;
+	}
+
+	const HRESULT audioResult = output->EnableAudioOutput(
+			bmdAudioSampleRate48kHz,
+			bmdAudioSampleType16bitInteger,
+			2,
+			bmdAudioOutputStreamTimestamped);
+	if (audioResult != S_OK) {
+		LOG(LOG_ERROR, "Failed to enable audio output");
+		return false;
+	}
+
+	mode = mode_;
+
+	auto decklinkOutput = dynamic_cast<DeckLinkOutput*>(decklink);
+	if (decklinkOutput == nullptr)
+		return false;
+
+	HRESULT result;
+	result = output->CreateVideoFrame(decklinkOutput->GetWidth(),
+			decklinkOutput->GetHeight(),
+			decklinkOutput->GetWidth() * 2,
+			bmdFormat8BitYUV,
+			bmdFrameFlagDefault,
+			&decklinkOutputFrame);
+	if (result != S_OK) {
+		blog(LOG_ERROR ,"failed to make frame 0x%X", result);
+		return false;
+	}
+
+	return true;
+}
+
+bool DeckLinkDeviceInstance::StopOutput()
+{
+	if (mode == nullptr || output == nullptr)
+		return false;
+
+	LOG(LOG_INFO, "Stopping output of '%s'...",
+			GetDevice()->GetDisplayName().c_str());
+
+	output->DisableVideoOutput();
+	output->DisableAudioOutput();
+
+	if (decklinkOutputFrame != nullptr) {
+		decklinkOutputFrame->Release();
+		decklinkOutputFrame = nullptr;
+	}
+
+	return true;
+}
+
+void DeckLinkDeviceInstance::DisplayVideoFrame(video_data *frame)
+{
+	auto decklinkOutput = dynamic_cast<DeckLinkOutput*>(decklink);
+	if (decklinkOutput == nullptr)
+		return;
+
+	uint8_t *destData;
+	decklinkOutputFrame->GetBytes((void**)&destData);
+
+	uint8_t *outData = frame->data[0];
+
+	std::copy(outData, outData + (decklinkOutput->GetWidth() *
+			decklinkOutput->GetHeight() * 2), destData);
+
+	output->DisplayVideoFrameSync(decklinkOutputFrame);
+}
+
+void DeckLinkDeviceInstance::WriteAudio(audio_data *frames)
+{
+	uint32_t sampleFramesWritten;
+	output->WriteAudioSamplesSync(frames->data[0],
+			frames->frames,
+			&sampleFramesWritten);
+}
+
 #define TIME_BASE 1000000000
 
 HRESULT STDMETHODCALLTYPE DeckLinkDeviceInstance::VideoInputFrameArrived(

+ 16 - 2
plugins/decklink/decklink-device-instance.hpp

@@ -1,14 +1,19 @@
 #pragma once
 
+#define LOG(level, message, ...) blog(level, "%s: " message, "decklink", ##__VA_ARGS__)
+
+#include <obs-module.h>
 #include "decklink-device.hpp"
+#include "../../libobs/media-io/video-scaler.h"
 
 class AudioRepacker;
+class DecklinkBase;
 
 class DeckLinkDeviceInstance : public IDeckLinkInputCallback {
 protected:
 	struct obs_source_frame currentFrame;
 	struct obs_source_audio currentPacket;
-	DeckLink                *decklink = nullptr;
+	DecklinkBase            *decklink = nullptr;
 	DeckLinkDevice          *device = nullptr;
 	DeckLinkDeviceMode      *mode = nullptr;
 	BMDDisplayMode          displayMode = bmdModeNTSC;
@@ -17,6 +22,7 @@ protected:
 	video_colorspace        activeColorSpace = VIDEO_CS_DEFAULT;
 	video_range_type        colorRange = VIDEO_RANGE_DEFAULT;
 	ComPtr<IDeckLinkInput>  input;
+	ComPtr<IDeckLinkOutput> output;
 	volatile long           refCount = 1;
 	int64_t                 audioOffset = 0;
 	uint64_t                nextAudioTS = 0;
@@ -24,6 +30,8 @@ protected:
 	AudioRepacker           *audioRepacker = nullptr;
 	speaker_layout          channelFormat = SPEAKERS_STEREO;
 
+	IDeckLinkMutableVideoFrame *decklinkOutputFrame;
+
 	void FinalizeStream();
 	void SetupVideoFormat(DeckLinkDeviceMode *mode_);
 
@@ -33,7 +41,7 @@ protected:
 			const uint64_t timestamp);
 
 public:
-	DeckLinkDeviceInstance(DeckLink *decklink, DeckLinkDevice *device);
+	DeckLinkDeviceInstance(DecklinkBase *decklink, DeckLinkDevice *device);
 	virtual ~DeckLinkDeviceInstance();
 
 	inline DeckLinkDevice *GetDevice() const {return device;}
@@ -52,6 +60,9 @@ public:
 	bool StartCapture(DeckLinkDeviceMode *mode);
 	bool StopCapture(void);
 
+	bool StartOutput(DeckLinkDeviceMode *mode_);
+	bool StopOutput(void);
+
 	HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(
 			IDeckLinkVideoInputFrame *videoFrame,
 			IDeckLinkAudioInputPacket *audioPacket);
@@ -63,4 +74,7 @@ public:
 	ULONG STDMETHODCALLTYPE AddRef(void);
 	HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv);
 	ULONG STDMETHODCALLTYPE Release(void);
+
+	void DisplayVideoFrame(video_data *frame);
+	void WriteAudio(audio_data *frames);
 };

+ 16 - 0
plugins/decklink/decklink-device-mode.cpp

@@ -32,6 +32,22 @@ BMDDisplayMode DeckLinkDeviceMode::GetDisplayMode(void) const
 	return bmdModeUnknown;
 }
 
+int DeckLinkDeviceMode::GetWidth()
+{
+	if (mode != nullptr)
+		return mode->GetWidth();
+
+	return 0;
+}
+
+int DeckLinkDeviceMode::GetHeight()
+{
+	if (mode != nullptr)
+		return mode->GetHeight();
+
+	return 0;
+}
+
 BMDDisplayModeFlags DeckLinkDeviceMode::GetDisplayModeFlags(void) const
 {
 	if (mode != nullptr)

+ 3 - 0
plugins/decklink/decklink-device-mode.hpp

@@ -23,4 +23,7 @@ public:
 	const std::string& GetName(void) const;
 
 	void SetMode(IDeckLinkDisplayMode *mode);
+
+	int GetWidth();
+	int GetHeight();
 };

+ 75 - 28
plugins/decklink/decklink-device.cpp

@@ -10,7 +10,10 @@ DeckLinkDevice::DeckLinkDevice(IDeckLink *device_) : device(device_)
 
 DeckLinkDevice::~DeckLinkDevice(void)
 {
-	for (DeckLinkDeviceMode *mode : modes)
+	for (DeckLinkDeviceMode *mode : inputModes)
+		delete mode;
+
+	for (DeckLinkDeviceMode *mode : outputModes)
 		delete mode;
 }
 
@@ -37,35 +40,61 @@ bool DeckLinkDevice::Init()
 		decklink_bool_t detectable = false;
 		if (attributes->GetFlag(BMDDeckLinkSupportsInputFormatDetection,
 				&detectable) == S_OK && !!detectable) {
-			DeckLinkDeviceMode *mode =
-				new DeckLinkDeviceMode("Auto", MODE_ID_AUTO);
-			modes.push_back(mode);
-			modeIdMap[MODE_ID_AUTO] = mode;
+			DeckLinkDeviceMode *mode = new DeckLinkDeviceMode(
+					"Auto",
+					MODE_ID_AUTO);
+			inputModes.push_back(mode);
+			inputModeIdMap[MODE_ID_AUTO] = mode;
 		}
 	}
 
+	// Find input modes
 	ComPtr<IDeckLinkInput> input;
-	if (device->QueryInterface(IID_IDeckLinkInput, (void**)&input) != S_OK)
-		return false;
-
-	IDeckLinkDisplayModeIterator *modeIterator;
-	if (input->GetDisplayModeIterator(&modeIterator) == S_OK) {
-		IDeckLinkDisplayMode *displayMode;
-		long long modeId = 1;
-
-		while (modeIterator->Next(&displayMode) == S_OK) {
-			if (displayMode == nullptr)
-				continue;
-
-			DeckLinkDeviceMode *mode =
-				new DeckLinkDeviceMode(displayMode, modeId);
-			modes.push_back(mode);
-			modeIdMap[modeId] = mode;
-			displayMode->Release();
-			++modeId;
+	if (device->QueryInterface(IID_IDeckLinkInput, (void **) &input) == S_OK) {
+		IDeckLinkDisplayModeIterator *modeIterator;
+		if (input->GetDisplayModeIterator(&modeIterator) == S_OK) {
+			IDeckLinkDisplayMode *displayMode;
+			long long modeId = 1;
+
+			while (modeIterator->Next(&displayMode) == S_OK) {
+				if (displayMode == nullptr)
+					continue;
+
+				DeckLinkDeviceMode *mode =
+						new DeckLinkDeviceMode(displayMode, modeId);
+				inputModes.push_back(mode);
+				inputModeIdMap[modeId] = mode;
+				displayMode->Release();
+				++modeId;
+			}
+
+			modeIterator->Release();
 		}
+	}
+
+	// find output modes
+	ComPtr<IDeckLinkOutput> output;
+	if (device->QueryInterface(IID_IDeckLinkOutput, (void **) &output) == S_OK) {
 
-		modeIterator->Release();
+		IDeckLinkDisplayModeIterator *modeIterator;
+		if (output->GetDisplayModeIterator(&modeIterator) == S_OK) {
+			IDeckLinkDisplayMode *displayMode;
+			long long modeId = 1;
+
+			while (modeIterator->Next(&displayMode) == S_OK) {
+				if (displayMode == nullptr)
+					continue;
+
+				DeckLinkDeviceMode *mode =
+						new DeckLinkDeviceMode(displayMode, modeId);
+				outputModes.push_back(mode);
+				outputModeIdMap[modeId] = mode;
+				displayMode->Release();
+				++modeId;
+			}
+
+			modeIterator->Release();
+		}
 	}
 
 	decklink_string_t decklinkModelName;
@@ -115,9 +144,22 @@ bool DeckLinkDevice::GetInput(IDeckLinkInput **input)
 	return true;
 }
 
-DeckLinkDeviceMode *DeckLinkDevice::FindMode(long long id)
+bool DeckLinkDevice::GetOutput(IDeckLinkOutput **output)
+{
+	if (device->QueryInterface(IID_IDeckLinkOutput, (void**)output) != S_OK)
+		return false;
+
+	return true;
+}
+
+DeckLinkDeviceMode *DeckLinkDevice::FindInputMode(long long id)
 {
-	return modeIdMap[id];
+	return inputModeIdMap[id];
+}
+
+DeckLinkDeviceMode *DeckLinkDevice::FindOutputMode(long long id)
+{
+	return outputModeIdMap[id];
 }
 
 const std::string& DeckLinkDevice::GetDisplayName(void)
@@ -130,9 +172,14 @@ const std::string& DeckLinkDevice::GetHash(void) const
 	return hash;
 }
 
-const std::vector<DeckLinkDeviceMode *>& DeckLinkDevice::GetModes(void) const
+const std::vector<DeckLinkDeviceMode *>& DeckLinkDevice::GetInputModes(void) const
+{
+	return inputModes;
+}
+
+const std::vector<DeckLinkDeviceMode *>& DeckLinkDevice::GetOutputModes(void) const
 {
-	return modes;
+	return outputModes;
 }
 
 const std::string& DeckLinkDevice::GetName(void) const

+ 9 - 5
plugins/decklink/decklink-device.hpp

@@ -1,6 +1,5 @@
 #pragma once
 
-#include "decklink.hpp"
 #include "decklink-device-mode.hpp"
 
 #include <map>
@@ -9,8 +8,10 @@
 
 class DeckLinkDevice {
 	ComPtr<IDeckLink>                         device;
-	std::map<long long, DeckLinkDeviceMode *> modeIdMap;
-	std::vector<DeckLinkDeviceMode *>         modes;
+	std::map<long long, DeckLinkDeviceMode *> inputModeIdMap;
+	std::vector<DeckLinkDeviceMode *>         inputModes;
+	std::map<long long, DeckLinkDeviceMode *> outputModeIdMap;
+	std::vector<DeckLinkDeviceMode *>         outputModes;
 	std::string                               name;
 	std::string                               displayName;
 	std::string                               hash;
@@ -26,14 +27,17 @@ public:
 
 	bool Init();
 
-	DeckLinkDeviceMode *FindMode(long long id);
+	DeckLinkDeviceMode *FindInputMode(long long id);
+	DeckLinkDeviceMode *FindOutputMode(long long id);
 	const std::string& GetDisplayName(void);
 	const std::string& GetHash(void) const;
-	const std::vector<DeckLinkDeviceMode *>& GetModes(void) const;
+	const std::vector<DeckLinkDeviceMode *>& GetInputModes(void) const;
+	const std::vector<DeckLinkDeviceMode *>& GetOutputModes(void) const;
 	const std::string& GetName(void) const;
 	int32_t GetMaxChannel(void) const;
 
 	bool GetInput(IDeckLinkInput **input);
+	bool GetOutput(IDeckLinkOutput **output);
 
 	inline bool IsDevice(IDeckLink *device_)
 	{

+ 17 - 0
plugins/decklink/decklink-devices.cpp

@@ -0,0 +1,17 @@
+#include "decklink-devices.hpp"
+
+DeckLinkDeviceDiscovery *deviceEnum = nullptr;
+
+void fill_out_devices(obs_property_t *list)
+{
+	deviceEnum->Lock();
+
+	const std::vector<DeckLinkDevice*> &devices = deviceEnum->GetDevices();
+	for (DeckLinkDevice *device : devices) {
+		obs_property_list_add_string(list,
+				device->GetDisplayName().c_str(),
+				device->GetHash().c_str());
+	}
+
+	deviceEnum->Unlock();
+}

+ 8 - 0
plugins/decklink/decklink-devices.hpp

@@ -0,0 +1,8 @@
+#pragma once
+
+#include "decklink-device.hpp"
+#include "decklink-device-discovery.hpp"
+
+extern DeckLinkDeviceDiscovery *deviceEnum;
+
+void fill_out_devices(obs_property_t *list);

+ 239 - 0
plugins/decklink/decklink-output.cpp

@@ -0,0 +1,239 @@
+#include <obs-module.h>
+#include <obs-avc.h>
+
+#include "const.h"
+
+#include "DecklinkOutput.hpp"
+#include "decklink-device.hpp"
+#include "decklink-device-discovery.hpp"
+#include "decklink-devices.hpp"
+
+#include "../../libobs/media-io/video-scaler.h"
+
+static void decklink_output_destroy(void *data)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+	delete decklink;
+}
+
+static void *decklink_output_create(obs_data_t *settings, obs_output_t *output)
+{
+	auto *decklinkOutput = new DeckLinkOutput(output, deviceEnum);
+
+	decklinkOutput->deviceHash = obs_data_get_string(settings, DEVICE_HASH);
+	decklinkOutput->modeID = obs_data_get_int(settings, MODE_ID);
+
+	return decklinkOutput;
+}
+
+static void decklink_output_update(void *data, obs_data_t *settings)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+
+	decklink->deviceHash = obs_data_get_string(settings, DEVICE_HASH);
+	decklink->modeID = obs_data_get_int(settings, MODE_ID);
+}
+
+static bool decklink_output_start(void *data)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+	struct obs_audio_info aoi;
+
+	if (!obs_get_audio_info(&aoi)) {
+		blog(LOG_WARNING, "No active audio");
+		return false;
+	}
+
+	decklink->audio_samplerate = aoi.samples_per_sec;
+	decklink->audio_planes = 2;
+	decklink->audio_size = get_audio_size(AUDIO_FORMAT_16BIT, aoi.speakers, 1);
+
+	decklink->start_timestamp = 0;
+
+	ComPtr<DeckLinkDevice> device;
+
+	device.Set(deviceEnum->FindByHash(decklink->deviceHash));
+
+	DeckLinkDeviceMode *mode = device->FindOutputMode(decklink->modeID);
+
+	decklink->SetSize(mode->GetWidth(), mode->GetHeight());
+
+	struct video_scale_info to = {};
+	to.format = VIDEO_FORMAT_UYVY;
+	to.width = mode->GetWidth();
+	to.height =  mode->GetHeight();
+
+	obs_output_set_video_conversion(decklink->GetOutput(), &to);
+
+	decklink->Activate(device, decklink->modeID);
+
+	struct audio_convert_info conversion = {};
+	conversion.format = AUDIO_FORMAT_16BIT;
+	conversion.speakers = SPEAKERS_STEREO;
+	conversion.samples_per_sec = 48000;  // Only format the decklink supports
+
+	obs_output_set_audio_conversion(decklink->GetOutput(), &conversion);
+
+	if (!obs_output_begin_data_capture(decklink->GetOutput(), 0))
+		return false;
+
+	return true;
+}
+
+static void decklink_output_stop(void *data, uint64_t)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+
+	obs_output_end_data_capture(decklink->GetOutput());
+
+	ComPtr<DeckLinkDevice> device;
+
+	device.Set(deviceEnum->FindByHash(decklink->deviceHash));
+
+	decklink->Deactivate();
+}
+
+static void decklink_output_raw_video(void *data, struct video_data *frame)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+
+	if (!decklink->start_timestamp)
+		decklink->start_timestamp = frame->timestamp;
+
+	decklink->DisplayVideoFrame(frame);
+}
+
+static bool prepare_audio(DeckLinkOutput *decklink,
+		const struct audio_data *frame,
+		struct audio_data *output)
+{
+	*output = *frame;
+
+	if (frame->timestamp < decklink->start_timestamp) {
+		uint64_t duration = (uint64_t)frame->frames * 1000000000 /
+				(uint64_t)decklink->audio_samplerate;
+		uint64_t end_ts = frame->timestamp + duration;
+		uint64_t cutoff;
+
+		if (end_ts <= decklink->start_timestamp)
+			return false;
+
+		cutoff = decklink->start_timestamp - frame->timestamp;
+		output->timestamp += cutoff;
+
+		cutoff *= (uint64_t)decklink->audio_samplerate / 1000000000;
+
+		for (size_t i = 0; i < decklink->audio_planes; i++)
+			output->data[i] += decklink->audio_size *
+					(uint32_t)cutoff;
+
+		output->frames -= (uint32_t)cutoff;
+	}
+
+	return true;
+}
+
+static void decklink_output_raw_audio(void *data, struct audio_data *frames)
+{
+	auto *decklink = (DeckLinkOutput *)data;
+	struct audio_data in;
+
+	if (!decklink->start_timestamp)
+		return;
+
+	if (!prepare_audio(decklink, frames, &in))
+		return;
+
+	decklink->WriteAudio(&in);
+}
+
+static bool decklink_output_device_changed(obs_properties_t *props,
+		obs_property_t *list, obs_data_t *settings)
+{
+	const char *name = obs_data_get_string(settings, DEVICE_NAME);
+	const char *hash = obs_data_get_string(settings, DEVICE_HASH);
+	const char *mode = obs_data_get_string(settings, MODE_NAME);
+	long long modeId = obs_data_get_int(settings, MODE_ID);
+
+	size_t itemCount = obs_property_list_item_count(list);
+	bool itemFound = false;
+
+	for (size_t i = 0; i < itemCount; i++) {
+		const char *curHash = obs_property_list_item_string(list, i);
+		if (strcmp(hash, curHash) == 0) {
+			itemFound = true;
+			break;
+		}
+	}
+
+	if (!itemFound) {
+		obs_property_list_insert_string(list, 0, name, hash);
+		obs_property_list_item_disable(list, 0, true);
+	}
+
+	obs_property_t *modeList = obs_properties_get(props, MODE_ID);
+
+	obs_property_list_clear(modeList);
+
+	ComPtr<DeckLinkDevice> device;
+	device.Set(deviceEnum->FindByHash(hash));
+
+	if (!device) {
+		obs_property_list_add_int(modeList, mode, modeId);
+		obs_property_list_item_disable(modeList, 0, true);
+	} else {
+		const std::vector<DeckLinkDeviceMode*> &modes =
+				device->GetOutputModes();
+
+		for (DeckLinkDeviceMode *mode : modes) {
+			obs_property_list_add_int(modeList,
+					mode->GetName().c_str(),
+					mode->GetId());
+		}
+	}
+
+	return true;
+}
+
+static obs_properties_t *decklink_output_properties(void *unused)
+{
+	UNUSED_PARAMETER(unused);
+	obs_properties_t *props = obs_properties_create();
+
+	obs_property_t *list = obs_properties_add_list(props, DEVICE_HASH,
+			TEXT_DEVICE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
+	obs_property_set_modified_callback(list, decklink_output_device_changed);
+
+	fill_out_devices(list);
+
+	obs_properties_add_list(props,
+			MODE_ID, TEXT_MODE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
+
+	obs_properties_add_bool(props, AUTO_START, TEXT_AUTO_START);
+
+	return props;
+}
+
+static const char *decklink_output_get_name(void*)
+{
+	return obs_module_text("BlackmagicDevice");
+}
+
+struct obs_output_info create_decklink_output_info()
+{
+	struct obs_output_info decklink_output_info = {};
+
+	decklink_output_info.id             = "decklink_output";
+	decklink_output_info.flags          = OBS_OUTPUT_AV;
+	decklink_output_info.get_name       = decklink_output_get_name;
+	decklink_output_info.create         = decklink_output_create;
+	decklink_output_info.destroy        = decklink_output_destroy;
+	decklink_output_info.start          = decklink_output_start;
+	decklink_output_info.stop           = decklink_output_stop;
+	decklink_output_info.get_properties = decklink_output_properties;
+	decklink_output_info.raw_video      = decklink_output_raw_video;
+	decklink_output_info.raw_audio      = decklink_output_raw_audio;
+	decklink_output_info.update         = decklink_output_update;
+
+	return decklink_output_info;
+}

+ 288 - 0
plugins/decklink/decklink-source.cpp

@@ -0,0 +1,288 @@
+#include <obs-module.h>
+
+#include "const.h"
+
+#include "DecklinkInput.hpp"
+#include "decklink-device.hpp"
+#include "decklink-device-discovery.hpp"
+#include "decklink-devices.hpp"
+
+static void decklink_enable_buffering(DeckLinkInput *decklink, bool enabled)
+{
+	obs_source_t *source = decklink->GetSource();
+	obs_source_set_async_unbuffered(source, !enabled);
+	decklink->buffering = enabled;
+}
+
+static void decklink_deactivate_when_not_showing(DeckLinkInput *decklink, bool dwns)
+{
+	decklink->dwns = dwns;
+}
+
+static void *decklink_create(obs_data_t *settings, obs_source_t *source)
+{
+	DeckLinkInput *decklink = new DeckLinkInput(source, deviceEnum);
+
+	obs_source_set_async_decoupled(source, true);
+	decklink_enable_buffering(decklink,
+			obs_data_get_bool(settings, BUFFERING));
+
+	obs_source_update(source, settings);
+	return decklink;
+}
+
+static void decklink_destroy(void *data)
+{
+	DeckLinkInput *decklink = (DeckLinkInput *)data;
+	delete decklink;
+}
+
+static void decklink_update(void *data, obs_data_t *settings)
+{
+	DeckLinkInput *decklink = (DeckLinkInput *)data;
+	const char *hash = obs_data_get_string(settings, DEVICE_HASH);
+	long long id = obs_data_get_int(settings, MODE_ID);
+	BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
+			PIXEL_FORMAT);
+	video_colorspace colorSpace = (video_colorspace)obs_data_get_int(settings,
+			COLOR_SPACE);
+	video_range_type colorRange = (video_range_type)obs_data_get_int(settings,
+			COLOR_RANGE);
+	int chFmtInt = (int)obs_data_get_int(settings, CHANNEL_FORMAT);
+
+	if (chFmtInt == 7)
+		chFmtInt = SPEAKERS_5POINT1;
+	else if (chFmtInt < SPEAKERS_UNKNOWN || chFmtInt > SPEAKERS_7POINT1)
+		chFmtInt = 2;
+
+	speaker_layout channelFormat = (speaker_layout)chFmtInt;
+
+	decklink_enable_buffering(decklink,
+			obs_data_get_bool(settings, BUFFERING));
+
+	decklink_deactivate_when_not_showing(decklink,
+			obs_data_get_bool(settings, DEACTIVATE_WNS));
+
+	ComPtr<DeckLinkDevice> device;
+	device.Set(deviceEnum->FindByHash(hash));
+
+	decklink->SetPixelFormat(pixelFormat);
+	decklink->SetColorSpace(colorSpace);
+	decklink->SetColorRange(colorRange);
+	decklink->SetChannelFormat(channelFormat);
+	decklink->Activate(device, id);
+	decklink->hash = std::string(hash);
+}
+
+static void decklink_show(void *data)
+{
+	DeckLinkInput *decklink = (DeckLinkInput *)data;
+	obs_source_t *source = decklink->GetSource();
+	bool showing = obs_source_showing(source);
+	if (decklink->dwns && showing && !decklink->Capturing()) {
+		ComPtr<DeckLinkDevice> device;
+		device.Set(deviceEnum->FindByHash(decklink->hash.c_str()));
+		decklink->Activate(device, decklink->id);
+	}
+}
+static void decklink_hide(void *data)
+{
+	DeckLinkInput *decklink = (DeckLinkInput *)data;
+	obs_source_t *source = decklink->GetSource();
+	bool showing = obs_source_showing(source);
+	if (decklink->dwns && showing)
+		decklink->Deactivate();
+}
+
+static void decklink_get_defaults(obs_data_t *settings)
+{
+	obs_data_set_default_bool(settings, BUFFERING, false);
+	obs_data_set_default_int(settings, PIXEL_FORMAT, bmdFormat8BitYUV);
+	obs_data_set_default_int(settings, COLOR_SPACE, VIDEO_CS_DEFAULT);
+	obs_data_set_default_int(settings, COLOR_RANGE, VIDEO_RANGE_DEFAULT);
+	obs_data_set_default_int(settings, CHANNEL_FORMAT, SPEAKERS_STEREO);
+}
+
+static const char *decklink_get_name(void*)
+{
+	return obs_module_text("BlackmagicDevice");
+}
+
+static bool decklink_device_changed(obs_properties_t *props,
+		obs_property_t *list, obs_data_t *settings)
+{
+	const char *name = obs_data_get_string(settings, DEVICE_NAME);
+	const char *hash = obs_data_get_string(settings, DEVICE_HASH);
+	const char *mode = obs_data_get_string(settings, MODE_NAME);
+	long long modeId = obs_data_get_int(settings, MODE_ID);
+
+	size_t itemCount = obs_property_list_item_count(list);
+	bool itemFound = false;
+
+	for (size_t i = 0; i < itemCount; i++) {
+		const char *curHash = obs_property_list_item_string(list, i);
+		if (strcmp(hash, curHash) == 0) {
+			itemFound = true;
+			break;
+		}
+	}
+
+	if (!itemFound) {
+		obs_property_list_insert_string(list, 0, name, hash);
+		obs_property_list_item_disable(list, 0, true);
+	}
+
+	obs_property_t *modeList = obs_properties_get(props, MODE_ID);
+	obs_property_t *channelList = obs_properties_get(props, CHANNEL_FORMAT);
+
+	obs_property_list_clear(modeList);
+
+	obs_property_list_clear(channelList);
+	obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_NONE,
+			SPEAKERS_UNKNOWN);
+	obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_0CH,
+			SPEAKERS_STEREO);
+
+	ComPtr<DeckLinkDevice> device;
+	device.Set(deviceEnum->FindByHash(hash));
+
+	if (!device) {
+		obs_property_list_add_int(modeList, mode, modeId);
+		obs_property_list_item_disable(modeList, 0, true);
+	} else {
+		const std::vector<DeckLinkDeviceMode*> &modes =
+				device->GetInputModes();
+
+		for (DeckLinkDeviceMode *mode : modes) {
+			obs_property_list_add_int(modeList,
+					mode->GetName().c_str(),
+					mode->GetId());
+		}
+
+		if (device->GetMaxChannel() >= 8) {
+			obs_property_list_add_int(channelList,
+					TEXT_CHANNEL_FORMAT_2_1CH, SPEAKERS_2POINT1);
+			obs_property_list_add_int(channelList,
+					TEXT_CHANNEL_FORMAT_4_0CH, SPEAKERS_4POINT0);
+			obs_property_list_add_int(channelList,
+					TEXT_CHANNEL_FORMAT_4_1CH, SPEAKERS_4POINT1);
+			obs_property_list_add_int(channelList,
+					TEXT_CHANNEL_FORMAT_5_1CH, SPEAKERS_5POINT1);
+			obs_property_list_add_int(channelList,
+					TEXT_CHANNEL_FORMAT_7_1CH, SPEAKERS_7POINT1);
+		}
+	}
+
+	return true;
+}
+
+static bool color_format_changed(obs_properties_t *props,
+		obs_property_t *list, obs_data_t *settings);
+
+static bool mode_id_changed(obs_properties_t *props,
+		obs_property_t *list, obs_data_t *settings)
+{
+	long long id = obs_data_get_int(settings, MODE_ID);
+
+	list = obs_properties_get(props, PIXEL_FORMAT);
+	obs_property_set_visible(list, id != MODE_ID_AUTO);
+
+	return color_format_changed(props, nullptr, settings);
+}
+
+static bool color_format_changed(obs_properties_t *props,
+		obs_property_t *list, obs_data_t *settings)
+{
+	long long id = obs_data_get_int(settings, MODE_ID);
+	BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
+		PIXEL_FORMAT);
+
+	list = obs_properties_get(props, COLOR_SPACE);
+	obs_property_set_visible(list,
+			id != MODE_ID_AUTO && pixelFormat == bmdFormat8BitYUV);
+
+	list = obs_properties_get(props, COLOR_RANGE);
+	obs_property_set_visible(list,
+			id == MODE_ID_AUTO || pixelFormat == bmdFormat8BitYUV);
+
+	return true;
+}
+
+static obs_properties_t *decklink_get_properties(void *data)
+{
+	obs_properties_t *props = obs_properties_create();
+
+	obs_property_t *list = obs_properties_add_list(props, DEVICE_HASH,
+			TEXT_DEVICE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
+	obs_property_set_modified_callback(list, decklink_device_changed);
+
+	fill_out_devices(list);
+
+	list = obs_properties_add_list(props, MODE_ID, TEXT_MODE,
+			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
+	obs_property_set_modified_callback(list, mode_id_changed);
+
+	list = obs_properties_add_list(props, PIXEL_FORMAT,
+			TEXT_PIXEL_FORMAT, OBS_COMBO_TYPE_LIST,
+			OBS_COMBO_FORMAT_INT);
+	obs_property_set_modified_callback(list, color_format_changed);
+
+	obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
+	obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
+
+	list = obs_properties_add_list(props, COLOR_SPACE, TEXT_COLOR_SPACE,
+			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
+	obs_property_list_add_int(list, TEXT_COLOR_SPACE_DEFAULT, VIDEO_CS_DEFAULT);
+	obs_property_list_add_int(list, "BT.601", VIDEO_CS_601);
+	obs_property_list_add_int(list, "BT.709", VIDEO_CS_709);
+
+	list = obs_properties_add_list(props, COLOR_RANGE, TEXT_COLOR_RANGE,
+			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
+	obs_property_list_add_int(list, TEXT_COLOR_RANGE_DEFAULT, VIDEO_RANGE_DEFAULT);
+	obs_property_list_add_int(list, TEXT_COLOR_RANGE_PARTIAL, VIDEO_RANGE_PARTIAL);
+	obs_property_list_add_int(list, TEXT_COLOR_RANGE_FULL, VIDEO_RANGE_FULL);
+
+	list = obs_properties_add_list(props, CHANNEL_FORMAT,
+			TEXT_CHANNEL_FORMAT, OBS_COMBO_TYPE_LIST,
+			OBS_COMBO_FORMAT_INT);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_NONE,
+			SPEAKERS_UNKNOWN);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_0CH,
+			SPEAKERS_STEREO);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_1CH,
+			SPEAKERS_2POINT1);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_0CH,
+			SPEAKERS_4POINT0);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_1CH,
+			SPEAKERS_4POINT1);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_5_1CH,
+			SPEAKERS_5POINT1);
+	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_7_1CH,
+			SPEAKERS_7POINT1);
+
+	obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING);
+
+	obs_properties_add_bool(props, DEACTIVATE_WNS, TEXT_DWNS);
+
+	UNUSED_PARAMETER(data);
+	return props;
+}
+
+
+struct obs_source_info create_decklink_source_info()
+{
+	struct obs_source_info decklink_source_info = {};
+	decklink_source_info.id             = "decklink-input";
+	decklink_source_info.type           = OBS_SOURCE_TYPE_INPUT;
+	decklink_source_info.output_flags   = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO | OBS_SOURCE_DO_NOT_DUPLICATE;
+	decklink_source_info.create         = decklink_create;
+	decklink_source_info.destroy        = decklink_destroy;
+	decklink_source_info.get_defaults   = decklink_get_defaults;
+	decklink_source_info.get_name       = decklink_get_name;
+	decklink_source_info.get_properties = decklink_get_properties;
+	decklink_source_info.update         = decklink_update;
+	decklink_source_info.show           = decklink_show;
+	decklink_source_info.hide           = decklink_hide;
+
+	return decklink_source_info;
+}

+ 17 - 5
plugins/decklink/linux/CMakeLists.txt

@@ -21,8 +21,12 @@ set(linux-decklink-sdk_SOURCES
 	)
 
 set(linux-decklink_HEADERS
+	../decklink-devices.hpp
+	../const.h
+	../DecklinkOutput.hpp
 	../platform.hpp
-	../decklink.hpp
+	../DecklinkInput.hpp
+	../DecklinkBase.h
 	../decklink-device-instance.hpp
 	../decklink-device-discovery.hpp
 	../decklink-device.hpp
@@ -33,21 +37,29 @@ set(linux-decklink_HEADERS
 
 set(linux-decklink_SOURCES
 	../plugin-main.cpp
-	../decklink.cpp
+	../decklink-devices.cpp
+	../decklink-source.cpp
+	../decklink-output.cpp
+	../DecklinkOutput.cpp
+	../DecklinkInput.cpp
+	../DecklinkBase.cpp
 	../decklink-device-instance.cpp
 	../decklink-device-discovery.cpp
 	../decklink-device.cpp
 	../decklink-device-mode.cpp
 	../audio-repack.c
-	platform.cpp)
+	platform.cpp
+	)
 
 add_library(linux-decklink MODULE
 	${linux-decklink_SOURCES}
 	${linux-decklink_HEADERS}
 	${linux-decklink-sdk_HEADERS}
-	${linux-decklink-sdk_SOURCES})
+	${linux-decklink-sdk_SOURCES}
+	)
 
 target_link_libraries(linux-decklink
-	libobs)
+	libobs
+	)
 
 install_obs_plugin_with_data(linux-decklink ../data)

+ 175 - 59
plugins/decklink/linux/decklink-sdk/DeckLinkAPI.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 /* DeckLink API */
 
 #include <stdint.h>
@@ -70,6 +74,9 @@ BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame                   = /* 69E2639F-
 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_IDeckLinkAncillaryPacket                     = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ {0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70};
+BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator             = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ {0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7};
+BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets          = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ {0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68};
 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};
@@ -113,9 +120,11 @@ enum _BMDFrameFlags {
     bmdFrameFlagDefault                                          = 0,
     bmdFrameFlagFlipVertical                                     = 1 << 0,
     bmdFrameContainsHDRMetadata                                  = 1 << 1,
+    bmdFrameContainsCintelMetadata                               = 1 << 2,
 
     /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
 
+    bmdFrameCapturedAsPsF                                        = 1 << 30,
     bmdFrameHasNoInputSource                                     = 1 << 31
 };
 
@@ -159,10 +168,10 @@ enum _BMDDeckLinkCapturePassthroughMode {
 
 typedef uint32_t BMDOutputFrameCompletionResult;
 enum _BMDOutputFrameCompletionResult {
-    bmdOutputFrameCompleted,
-    bmdOutputFrameDisplayedLate,
-    bmdOutputFrameDropped,
-    bmdOutputFrameFlushed
+    bmdOutputFrameCompleted,                                    
+    bmdOutputFrameDisplayedLate,                                
+    bmdOutputFrameDropped,                                      
+    bmdOutputFrameFlushed                                       
 };
 
 /* Enum BMDReferenceStatus - GenLock input status */
@@ -199,9 +208,9 @@ enum _BMDAudioSampleType {
 
 typedef uint32_t BMDAudioOutputStreamType;
 enum _BMDAudioOutputStreamType {
-    bmdAudioOutputStreamContinuous,
-    bmdAudioOutputStreamContinuousDontResample,
-    bmdAudioOutputStreamTimestamped
+    bmdAudioOutputStreamContinuous,                             
+    bmdAudioOutputStreamContinuousDontResample,                 
+    bmdAudioOutputStreamTimestamped                             
 };
 
 /* Enum BMDDisplayModeSupport - Output mode supported flags */
@@ -209,8 +218,17 @@ enum _BMDAudioOutputStreamType {
 typedef uint32_t BMDDisplayModeSupport;
 enum _BMDDisplayModeSupport {
     bmdDisplayModeNotSupported                                   = 0,
-    bmdDisplayModeSupported,
-    bmdDisplayModeSupportedWithConversion
+    bmdDisplayModeSupported,                                    
+    bmdDisplayModeSupportedWithConversion                       
+};
+
+/* Enum BMDAncillaryPacketFormat - Ancillary packet format */
+
+typedef uint32_t BMDAncillaryPacketFormat;
+enum _BMDAncillaryPacketFormat {
+    bmdAncillaryPacketFormatUInt8                                = /* 'ui08' */ 0x75693038,
+    bmdAncillaryPacketFormatUInt16                               = /* 'ui16' */ 0x75693136,
+    bmdAncillaryPacketFormatYCbCr10                              = /* 'v210' */ 0x76323130
 };
 
 /* Enum BMDTimecodeFormat - Timecode formats for frame metadata */
@@ -337,6 +355,37 @@ enum _BMDDeviceInterface {
 typedef uint32_t BMDDeckLinkFrameMetadataID;
 enum _BMDDeckLinkFrameMetadataID {
     bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc        = /* 'eotf' */ 0x656F7466,	// EOTF in range 0-7 as per CEA 861.3
+    bmdDeckLinkFrameMetadataCintelFilmType                       = /* 'cfty' */ 0x63667479,	// Current film type
+    bmdDeckLinkFrameMetadataCintelFilmGauge                      = /* 'cfga' */ 0x63666761,	// Current film gauge
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedHorizontal       = /* 'odfh' */ 0x6F646668,	// Horizontal offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedVertical         = /* 'odfv' */ 0x6F646676,	// Vertical offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelKeykodeLow                     = /* 'ckkl' */ 0x636B6B6C,	// Raw keykode value - low 64 bits
+    bmdDeckLinkFrameMetadataCintelKeykodeHigh                    = /* 'ckkh' */ 0x636B6B68,	// Raw keykode value - high 64 bits
+    bmdDeckLinkFrameMetadataCintelTile1Size                      = /* 'ct1s' */ 0x63743173,	// Size in bytes of compressed raw tile 1
+    bmdDeckLinkFrameMetadataCintelTile2Size                      = /* 'ct2s' */ 0x63743273,	// Size in bytes of compressed raw tile 2
+    bmdDeckLinkFrameMetadataCintelTile3Size                      = /* 'ct3s' */ 0x63743373,	// Size in bytes of compressed raw tile 3
+    bmdDeckLinkFrameMetadataCintelTile4Size                      = /* 'ct4s' */ 0x63743473,	// Size in bytes of compressed raw tile 4
+    bmdDeckLinkFrameMetadataCintelImageWidth                     = /* 'IWPx' */ 0x49575078,	// Width in pixels of image
+    bmdDeckLinkFrameMetadataCintelImageHeight                    = /* 'IHPx' */ 0x49485078,	// Height in pixels of image
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed          = /* 'mrir' */ 0x6D726972,	// Red in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed        = /* 'mgir' */ 0x6D676972,	// Green in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed         = /* 'mbir' */ 0x6D626972,	// Blue in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen        = /* 'mrig' */ 0x6D726967,	// Red in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen      = /* 'mgig' */ 0x6D676967,	// Green in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen       = /* 'mbig' */ 0x6D626967,	// Blue in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue         = /* 'mrib' */ 0x6D726962,	// Red in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue       = /* 'mgib' */ 0x6D676962,	// Green in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue        = /* 'mbib' */ 0x6D626962,	// Blue in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed             = /* 'mlrr' */ 0x6D6C7272,	// Red in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed           = /* 'mlgr' */ 0x6D6C6772,	// Green in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed            = /* 'mlbr' */ 0x6D6C6272,	// Blue in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen           = /* 'mlrg' */ 0x6D6C7267,	// Red in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen         = /* 'mlgg' */ 0x6D6C6767,	// Green in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen          = /* 'mlbg' */ 0x6D6C6267,	// Blue in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue            = /* 'mlrb' */ 0x6D6C7262,	// Red in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue          = /* 'mlgb' */ 0x6D6C6762,	// Green in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue           = /* 'mlbb' */ 0x6D6C6262,	// Blue in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelFilmFrameRate                  = /* 'cffr' */ 0x63666672,	// Film frame rate
     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
@@ -348,7 +397,15 @@ enum _BMDDeckLinkFrameMetadataID {
     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
+    bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel     = /* 'fall' */ 0x66616C6C,	// Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal        = /* 'otah' */ 0x6F746168,	// Horizontal offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical          = /* 'otav' */ 0x6F746176,	// Vertical offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelGainRed                        = /* 'LfRd' */ 0x4C665264,	// Red gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainGreen                      = /* 'LfGr' */ 0x4C664772,	// Green gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainBlue                       = /* 'LfBl' */ 0x4C66426C,	// Blue gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelLiftRed                        = /* 'GnRd' */ 0x476E5264,	// Red lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftGreen                      = /* 'GnGr' */ 0x476E4772,	// Green lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftBlue                       = /* 'GnBl' */ 0x476E426C	// Blue lift parameter to apply after log and gain
 };
 
 /* Enum BMDDuplexMode - Duplex for configurable ports */
@@ -390,18 +447,19 @@ enum _BMDDeckLinkAttributeID {
     /* Integers */
 
     BMDDeckLinkMaximumAudioChannels                              = /* 'mach' */ 0x6D616368,
-    BMDDeckLinkMaximumAnalogAudioChannels                        = /* 'aach' */ 0x61616368,
+    BMDDeckLinkMaximumAnalogAudioInputChannels                   = /* 'iach' */ 0x69616368,
+    BMDDeckLinkMaximumAnalogAudioOutputChannels                  = /* 'aach' */ 0x61616368,
     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,
+    BMDDeckLinkVideoOutputConnections                            = /* 'vocn' */ 0x766F636E,	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkVideoInputConnections                             = /* 'vicn' */ 0x7669636E,	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkAudioOutputConnections                            = /* 'aocn' */ 0x616F636E,	// Returns a BMDAudioConnection bit field
+    BMDDeckLinkAudioInputConnections                             = /* 'aicn' */ 0x6169636E,	// Returns a BMDAudioConnection bit field
     BMDDeckLinkVideoIOSupport                                    = /* 'vios' */ 0x76696F73,	// Returns a BMDVideoIOSupport bit field
-    BMDDeckLinkDeckControlConnections                            = /* 'dccn' */ 0x6463636E,
+    BMDDeckLinkDeckControlConnections                            = /* 'dccn' */ 0x6463636E,	// Returns a BMDDeckControlConnection bit field
     BMDDeckLinkDeviceInterface                                   = /* 'dbus' */ 0x64627573,	// Returns a BMDDeviceInterface
     BMDDeckLinkAudioInputRCAChannelCount                         = /* 'airc' */ 0x61697263,
     BMDDeckLinkAudioInputXLRChannelCount                         = /* 'aixc' */ 0x61697863,
@@ -455,11 +513,14 @@ enum _BMDDeckLinkStatusID {
     bmdDeckLinkStatusReferenceSignalFlags                        = /* 'reff' */ 0x72656666,
     bmdDeckLinkStatusDuplexMode                                  = /* 'dupx' */ 0x64757078,
     bmdDeckLinkStatusBusy                                        = /* 'busy' */ 0x62757379,
+    bmdDeckLinkStatusInterchangeablePanelType                    = /* 'icpt' */ 0x69637074,
+    bmdDeckLinkStatusDeviceTemperature                           = /* 'dtmp' */ 0x64746D70,
 
     /* Flags */
 
     bmdDeckLinkStatusVideoInputSignalLocked                      = /* 'visl' */ 0x7669736C,
-    bmdDeckLinkStatusReferenceSignalLocked                       = /* 'refl' */ 0x7265666C
+    bmdDeckLinkStatusReferenceSignalLocked                       = /* 'refl' */ 0x7265666C,
+    bmdDeckLinkStatusReceivedEDID                                = /* 'edid' */ 0x65646964
 };
 
 /* Enum BMDDeckLinkVideoStatusFlags -  */
@@ -480,6 +541,14 @@ enum _BMDDuplexStatus {
     bmdDuplexStatusInactive                                      = /* 'inac' */ 0x696E6163
 };
 
+/* Enum BMDPanelType - The type of interchangeable panel */
+
+typedef uint32_t BMDPanelType;
+enum _BMDPanelType {
+    bmdPanelNotDetected                                          = /* 'npnl' */ 0x6E706E6C,
+    bmdPanelTeranexMiniSmartPanel                                = /* 'tmsm' */ 0x746D736D
+};
+
 /* Enum BMDDeviceBusyState - Current device busy state */
 
 typedef uint32_t BMDDeviceBusyState;
@@ -535,6 +604,9 @@ class IDeckLinkMutableVideoFrame;
 class IDeckLinkVideoFrame3DExtensions;
 class IDeckLinkVideoFrameMetadataExtensions;
 class IDeckLinkVideoInputFrame;
+class IDeckLinkAncillaryPacket;
+class IDeckLinkAncillaryPacketIterator;
+class IDeckLinkVideoFrameAncillaryPackets;
 class IDeckLinkVideoFrameAncillary;
 class IDeckLinkEncoderPacket;
 class IDeckLinkEncoderVideoPacket;
@@ -554,7 +626,7 @@ class IDeckLinkDiscovery;
 
 /* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */
 
-class IDeckLinkVideoOutputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoOutputCallback : public IUnknown
 {
 public:
     virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0;
@@ -566,7 +638,7 @@ protected:
 
 /* Interface IDeckLinkInputCallback - Frame arrival callback. */
 
-class IDeckLinkInputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkInputCallback : public IUnknown
 {
 public:
     virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -578,7 +650,7 @@ protected:
 
 /* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */
 
-class IDeckLinkEncoderInputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderInputCallback : public IUnknown
 {
 public:
     virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -591,7 +663,7 @@ protected:
 
 /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */
 
-class IDeckLinkMemoryAllocator : public IUnknown
+class BMD_PUBLIC IDeckLinkMemoryAllocator : public IUnknown
 {
 public:
     virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0;
@@ -603,7 +675,7 @@ public:
 
 /* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */
 
-class IDeckLinkAudioOutputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkAudioOutputCallback : public IUnknown
 {
 public:
     virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0;
@@ -611,7 +683,7 @@ public:
 
 /* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */
 
-class IDeckLinkIterator : public IUnknown
+class BMD_PUBLIC IDeckLinkIterator : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0;
@@ -619,7 +691,7 @@ public:
 
 /* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */
 
-class IDeckLinkAPIInformation : public IUnknown
+class BMD_PUBLIC IDeckLinkAPIInformation : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0;
@@ -633,7 +705,7 @@ protected:
 
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkOutput : public IUnknown
+class BMD_PUBLIC IDeckLinkOutput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -648,7 +720,7 @@ public:
 
     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 CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 
     virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
     virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0;
@@ -690,7 +762,7 @@ protected:
 
 /* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkInput : public IUnknown
+class BMD_PUBLIC IDeckLinkInput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -729,7 +801,7 @@ protected:
 
 /* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkEncoderInput : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderInput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -766,7 +838,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
 
-class IDeckLinkVideoFrame : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame : public IUnknown
 {
 public:
     virtual long GetWidth (void) = 0;
@@ -777,7 +849,7 @@ public:
     virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
 
     virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0;
-    virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0;
+    virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 
 protected:
     virtual ~IDeckLinkVideoFrame () {} // call Release method to drop reference count
@@ -785,7 +857,7 @@ protected:
 
 /* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
 
-class IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame
+class BMD_PUBLIC IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame
 {
 public:
     virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0;
@@ -801,7 +873,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */
 
-class IDeckLinkVideoFrame3DExtensions : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame3DExtensions : public IUnknown
 {
 public:
     virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0;
@@ -813,7 +885,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */
 
-class IDeckLinkVideoFrameMetadataExtensions : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrameMetadataExtensions : public IUnknown
 {
 public:
     virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0;
@@ -827,7 +899,7 @@ protected:
 
 /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
 
-class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
+class BMD_PUBLIC IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
 {
 public:
     virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0;
@@ -837,13 +909,56 @@ protected:
     virtual ~IDeckLinkVideoInputFrame () {} // call Release method to drop reference count
 };
 
-/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+/* Interface IDeckLinkAncillaryPacket - On output, user needs to implement this interface */
+
+class BMD_PUBLIC IDeckLinkAncillaryPacket : public IUnknown
+{
+public:
+
+    virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void **data /* Optional */, /* out */ uint32_t *size /* Optional */) = 0;
+    virtual uint8_t GetDID (void) = 0;
+    virtual uint8_t GetSDID (void) = 0;
+    virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto
+    virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full
+
+protected:
+    virtual ~IDeckLinkAncillaryPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkAncillaryPacketIterator - Enumerates ancillary packets */
+
+class BMD_PUBLIC IDeckLinkAncillaryPacketIterator : public IUnknown
+{
+public:
+    virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket **packet) = 0;
+
+protected:
+    virtual ~IDeckLinkAncillaryPacketIterator () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+
+class BMD_PUBLIC IDeckLinkVideoFrameAncillaryPackets : public IUnknown
+{
+public:
+
+    virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator **iterator) = 0;
+    virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket **packet) = 0;
+    virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own
+    virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0;
+    virtual HRESULT DetachAllPackets (void) = 0;
+
+protected:
+    virtual ~IDeckLinkVideoFrameAncillaryPackets () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
 
-class IDeckLinkVideoFrameAncillary : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrameAncillary : public IUnknown
 {
 public:
 
-    virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0;
+    virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes
     virtual BMDPixelFormat GetPixelFormat (void) = 0;
     virtual BMDDisplayMode GetDisplayMode (void) = 0;
 
@@ -853,7 +968,7 @@ protected:
 
 /* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */
 
-class IDeckLinkEncoderPacket : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderPacket : public IUnknown
 {
 public:
     virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
@@ -867,7 +982,7 @@ protected:
 
 /* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */
 
-class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
+class BMD_PUBLIC IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
 {
 public:
     virtual BMDPixelFormat GetPixelFormat (void) = 0;
@@ -881,7 +996,7 @@ protected:
 
 /* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */
 
-class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
+class BMD_PUBLIC IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
 {
 public:
     virtual BMDAudioFormat GetAudioFormat (void) = 0;
@@ -892,7 +1007,7 @@ protected:
 
 /* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */
 
-class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
+class BMD_PUBLIC IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
 {
 public:
     virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0;
@@ -905,7 +1020,7 @@ protected:
 
 /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */
 
-class IDeckLinkAudioInputPacket : public IUnknown
+class BMD_PUBLIC IDeckLinkAudioInputPacket : public IUnknown
 {
 public:
     virtual long GetSampleFrameCount (void) = 0;
@@ -918,7 +1033,7 @@ protected:
 
 /* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */
 
-class IDeckLinkScreenPreviewCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkScreenPreviewCallback : public IUnknown
 {
 public:
     virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
@@ -929,7 +1044,7 @@ protected:
 
 /* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */
 
-class IDeckLinkGLScreenPreviewHelper : public IUnknown
+class BMD_PUBLIC IDeckLinkGLScreenPreviewHelper : public IUnknown
 {
 public:
 
@@ -946,7 +1061,7 @@ protected:
 
 /* Interface IDeckLinkNotificationCallback - DeckLink Notification Callback Interface */
 
-class IDeckLinkNotificationCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkNotificationCallback : public IUnknown
 {
 public:
     virtual HRESULT Notify (/* in */ BMDNotifications topic, /* in */ uint64_t param1, /* in */ uint64_t param2) = 0;
@@ -954,7 +1069,7 @@ public:
 
 /* Interface IDeckLinkNotification - DeckLink Notification interface */
 
-class IDeckLinkNotification : public IUnknown
+class BMD_PUBLIC IDeckLinkNotification : public IUnknown
 {
 public:
     virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0;
@@ -963,7 +1078,7 @@ public:
 
 /* Interface IDeckLinkAttributes - DeckLink Attribute interface */
 
-class IDeckLinkAttributes : public IUnknown
+class BMD_PUBLIC IDeckLinkAttributes : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0;
@@ -977,7 +1092,7 @@ protected:
 
 /* Interface IDeckLinkStatus - DeckLink Status interface */
 
-class IDeckLinkStatus : public IUnknown
+class BMD_PUBLIC IDeckLinkStatus : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0;
@@ -992,7 +1107,7 @@ protected:
 
 /* Interface IDeckLinkKeyer - DeckLink Keyer interface */
 
-class IDeckLinkKeyer : public IUnknown
+class BMD_PUBLIC IDeckLinkKeyer : public IUnknown
 {
 public:
     virtual HRESULT Enable (/* in */ bool isExternal) = 0;
@@ -1007,7 +1122,7 @@ protected:
 
 /* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */
 
-class IDeckLinkVideoConversion : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoConversion : public IUnknown
 {
 public:
     virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame* srcFrame, /* in */ IDeckLinkVideoFrame* dstFrame) = 0;
@@ -1018,7 +1133,7 @@ protected:
 
 /* Interface IDeckLinkDeviceNotificationCallback - DeckLink device arrival/removal notification callbacks */
 
-class IDeckLinkDeviceNotificationCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkDeviceNotificationCallback : public IUnknown
 {
 public:
     virtual HRESULT DeckLinkDeviceArrived (/* in */ IDeckLink* deckLinkDevice) = 0;
@@ -1030,7 +1145,7 @@ protected:
 
 /* Interface IDeckLinkDiscovery - DeckLink device discovery */
 
-class IDeckLinkDiscovery : public IUnknown
+class BMD_PUBLIC IDeckLinkDiscovery : public IUnknown
 {
 public:
     virtual HRESULT InstallDeviceNotifications (/* in */ IDeckLinkDeviceNotificationCallback* deviceNotificationCallback) = 0;
@@ -1044,11 +1159,12 @@ protected:
 
 extern "C" {
 
-    IDeckLinkIterator* CreateDeckLinkIteratorInstance (void);
-    IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void);
-    IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void);
-    IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void);
-    IDeckLinkVideoConversion* CreateVideoConversionInstance (void);
+    IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance (void);
+    IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance (void);
+    IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance (void);
+    IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper (void);
+    IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance (void);
+    IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance (void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame
 
 }
 

+ 19 - 9
plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,12 +37,16 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
 // Interface ID Declarations
 
-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_IDeckLinkConfiguration                       = /* EF90380B-4AE5-4346-9077-E288E149F129 */ {0xEF,0x90,0x38,0x0B,0x4A,0xE5,0x43,0x46,0x90,0x77,0xE2,0x88,0xE1,0x49,0xF1,0x29};
 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 */
@@ -54,10 +58,6 @@ enum _BMDDeckLinkConfigurationID {
 
     bmdDeckLinkConfigSwapSerialRxTx                              = /* 'ssrt' */ 0x73737274,
 
-    /* Video Input/Output Flags */
-
-    bmdDeckLinkConfigUse1080pNotPsF                              = /* 'fpro' */ 0x6670726F,
-
     /* Video Input/Output Integers */
 
     bmdDeckLinkConfigHDMI3DPackingFormat                         = /* '3dpf' */ 0x33647066,
@@ -78,6 +78,12 @@ enum _BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigLowLatencyVideoOutput                       = /* 'llvo' */ 0x6C6C766F,
     bmdDeckLinkConfigDownConversionOnAllAnalogOutput             = /* 'caao' */ 0x6361616F,
     bmdDeckLinkConfigSMPTELevelAOutput                           = /* 'smta' */ 0x736D7461,
+    bmdDeckLinkConfigRec2020Output                               = /* 'rec2' */ 0x72656332,	// Ensure output is Rec.2020 colorspace
+    bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit   = /* 'SDQS' */ 0x53445153,
+
+    /* Video Output Flags */
+
+    bmdDeckLinkConfigOutput1080pAsPsF                            = /* 'pfpr' */ 0x70667072,
 
     /* Video Output Integers */
 
@@ -106,6 +112,10 @@ enum _BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigUseDedicatedLTCInput                        = /* 'dltc' */ 0x646C7463,	// Use timecode from LTC input instead of SDI stream
     bmdDeckLinkConfigSDIInput3DPayloadOverride                   = /* '3dds' */ 0x33646473,
 
+    /* Video Input Flags */
+
+    bmdDeckLinkConfigCapture1080pAsPsF                           = /* 'cfpr' */ 0x63667072,
+
     /* Video Input Integers */
 
     bmdDeckLinkConfigVideoInputConnection                        = /* 'vicn' */ 0x7669636E,
@@ -206,7 +216,7 @@ class IDeckLinkEncoderConfiguration;
 
 /* Interface IDeckLinkConfiguration - DeckLink Configuration interface */
 
-class IDeckLinkConfiguration : public IUnknown
+class BMD_PUBLIC IDeckLinkConfiguration : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0;
@@ -225,7 +235,7 @@ protected:
 
 /* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */
 
-class IDeckLinkEncoderConfiguration : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderConfiguration : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0;

+ 3 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h

@@ -7,14 +7,14 @@
 ** 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
@@ -40,7 +40,7 @@ class IDeckLinkConfiguration_v10_2;
 
 /* Interface IDeckLinkConfiguration_v10_2 - DeckLink Configuration interface */
 
-class IDeckLinkConfiguration_v10_2 : public IUnknown
+class BMD_PUBLIC IDeckLinkConfiguration_v10_2 : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0;

+ 1 - 1
plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_4.h

@@ -42,7 +42,7 @@ class IDeckLinkConfiguration_v10_4;
 
 /* Interface IDeckLinkConfiguration_v10_4 - DeckLink Configuration interface */
 
-class IDeckLinkConfiguration_v10_4 : public IUnknown
+class BMD_PUBLIC IDeckLinkConfiguration_v10_4 : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0;

+ 3 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h

@@ -7,14 +7,14 @@
 ** 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
@@ -40,7 +40,7 @@ class IDeckLinkEncoderConfiguration_v10_5;
 
 /* Interface IDeckLinkEncoderConfiguration_v10_5 - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */
 
-class IDeckLinkEncoderConfiguration_v10_5 : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderConfiguration_v10_5 : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0;

+ 62 - 0
plugins/decklink/linux/decklink-sdk/DeckLinkAPIConfiguration_v10_9.h

@@ -0,0 +1,62 @@
+/* -LICENSE-START-
+** Copyright (c) 2017 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_9_H
+#define BMD_DECKLINKAPICONFIGURATION_v10_9_H
+
+#include "DeckLinkAPIConfiguration.h"
+
+// Interface ID Declarations
+
+BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_9                       = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2};
+
+//
+// Forward Declarations
+
+class IDeckLinkConfiguration_v10_9;
+
+/* Interface IDeckLinkConfiguration_v10_9 - DeckLink Configuration interface */
+
+class BMD_PUBLIC IDeckLinkConfiguration_v10_9 : 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_9 () {} // call Release method to drop reference count
+};
+
+
+#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_9_H) */

+ 8 - 4
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDeckControl.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -149,7 +153,7 @@ class IDeckLinkDeckControl;
 
 /* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */
 
-class IDeckLinkDeckControlStatusCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkDeckControlStatusCallback : public IUnknown
 {
 public:
     virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0;
@@ -163,7 +167,7 @@ protected:
 
 /* Interface IDeckLinkDeckControl - Deck Control main interface */
 
-class IDeckLinkDeckControl : public IUnknown
+class BMD_PUBLIC IDeckLinkDeckControl : public IUnknown
 {
 public:
     virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0;

+ 7 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDiscovery.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -50,7 +54,7 @@ class IDeckLink;
 
 /* Interface IDeckLink - represents a DeckLink device */
 
-class IDeckLink : public IUnknown
+class BMD_PUBLIC IDeckLink : public IUnknown
 {
 public:
     virtual HRESULT GetModelName (/* out */ const char **modelName) = 0;

+ 27 - 13
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -39,6 +39,7 @@ typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void);
 typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void);
 typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
 typedef IDeckLinkDiscovery* (*CreateDeckLinkDiscoveryInstanceFunc)(void);
+typedef IDeckLinkVideoFrameAncillaryPackets* (*CreateVideoFrameAncillaryPacketsInstanceFunc)(void);
 
 static pthread_once_t					gDeckLinkOnceControl = PTHREAD_ONCE_INIT;
 static pthread_once_t					gPreviewOnceControl = PTHREAD_ONCE_INIT;
@@ -50,21 +51,22 @@ static CreateAPIInformationFunc				gCreateAPIInformationFunc = NULL;
 static CreateOpenGLScreenPreviewHelperFunc	gCreateOpenGLPreviewFunc = NULL;
 static CreateVideoConversionInstanceFunc	gCreateVideoConversionFunc	= NULL;
 static CreateDeckLinkDiscoveryInstanceFunc	gCreateDeckLinkDiscoveryFunc = NULL;
+static CreateVideoFrameAncillaryPacketsInstanceFunc	gCreateVideoFrameAncillaryPacketsFunc = 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_0002");
+	
+	gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0003");
 	if (!gCreateIteratorFunc)
 		fprintf(stderr, "%s\n", dlerror());
 	gCreateAPIInformationFunc = (CreateAPIInformationFunc)dlsym(libraryHandle, "CreateDeckLinkAPIInformationInstance_0001");
@@ -73,15 +75,18 @@ void	InitDeckLinkAPI (void)
 	gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)dlsym(libraryHandle, "CreateVideoConversionInstance_0001");
 	if (!gCreateVideoConversionFunc)
 		fprintf(stderr, "%s\n", dlerror());
-	gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0001");
+	gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0002");
 	if (!gCreateDeckLinkDiscoveryFunc)
 		fprintf(stderr, "%s\n", dlerror());
+	gCreateVideoFrameAncillaryPacketsFunc = (CreateVideoFrameAncillaryPacketsInstanceFunc)dlsym(libraryHandle, "CreateVideoFrameAncillaryPacketsInstance_0001");
+	if (!gCreateVideoFrameAncillaryPacketsFunc)
+		fprintf(stderr, "%s\n", dlerror());
 }
 
 void	InitDeckLinkPreviewAPI (void)
 {
 	void *libraryHandle;
-
+	
 	libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL);
 	if (!libraryHandle)
 	{
@@ -102,7 +107,7 @@ bool		IsDeckLinkAPIPresent (void)
 IDeckLinkIterator*		CreateDeckLinkIteratorInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateIteratorFunc == NULL)
 		return NULL;
 	return gCreateIteratorFunc();
@@ -111,7 +116,7 @@ IDeckLinkIterator*		CreateDeckLinkIteratorInstance (void)
 IDeckLinkAPIInformation*	CreateDeckLinkAPIInformationInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateAPIInformationFunc == NULL)
 		return NULL;
 	return gCreateAPIInformationFunc();
@@ -121,7 +126,7 @@ IDeckLinkGLScreenPreviewHelper*		CreateOpenGLScreenPreviewHelper (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
 	pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI);
-
+	
 	if (gCreateOpenGLPreviewFunc == NULL)
 		return NULL;
 	return gCreateOpenGLPreviewFunc();
@@ -130,7 +135,7 @@ IDeckLinkGLScreenPreviewHelper*		CreateOpenGLScreenPreviewHelper (void)
 IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateVideoConversionFunc == NULL)
 		return NULL;
 	return gCreateVideoConversionFunc();
@@ -139,8 +144,17 @@ IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
 IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateDeckLinkDiscoveryFunc == NULL)
 		return NULL;
 	return gCreateDeckLinkDiscoveryFunc();
 }
+
+IDeckLinkVideoFrameAncillaryPackets* CreateVideoFrameAncillaryPacketsInstance (void)
+{
+	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+	
+	if (gCreateVideoFrameAncillaryPacketsFunc == NULL)
+		return NULL;
+	return gCreateVideoFrameAncillaryPacketsFunc();
+}

+ 146 - 0
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v10_8.cpp

@@ -0,0 +1,146 @@
+/* -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 <stdio.h>
+#include <pthread.h>
+#include <dlfcn.h>
+
+#include "DeckLinkAPI.h"
+
+#define kDeckLinkAPI_Name "libDeckLinkAPI.so"
+#define KDeckLinkPreviewAPI_Name "libDeckLinkPreviewAPI.so"
+
+typedef IDeckLinkIterator* (*CreateIteratorFunc)(void);
+typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void);
+typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void);
+typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
+typedef IDeckLinkDiscovery* (*CreateDeckLinkDiscoveryInstanceFunc)(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;
+static CreateDeckLinkDiscoveryInstanceFunc	gCreateDeckLinkDiscoveryFunc = 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_0002");
+	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());
+	gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0001");
+	if (!gCreateDeckLinkDiscoveryFunc)
+		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*		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();
+}
+
+IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance(void)
+{
+	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+	if (gCreateDeckLinkDiscoveryFunc == NULL)
+		return NULL;
+	return gCreateDeckLinkDiscoveryFunc();
+}

+ 8 - 8
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -48,14 +48,14 @@ 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());
@@ -67,7 +67,7 @@ void	InitDeckLinkAPI_v7_6 (void)
 void	InitDeckLinkPreviewAPI_v7_6 (void)
 {
 	void *libraryHandle;
-
+	
 	libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL);
 	if (!libraryHandle)
 	{
@@ -82,7 +82,7 @@ void	InitDeckLinkPreviewAPI_v7_6 (void)
 IDeckLinkIterator*		CreateDeckLinkIteratorInstance_v7_6 (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6);
-
+	
 	if (gCreateIteratorFunc == NULL)
 		return NULL;
 	return gCreateIteratorFunc();
@@ -92,7 +92,7 @@ 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();
@@ -101,7 +101,7 @@ IDeckLinkGLScreenPreviewHelper_v7_6*		CreateOpenGLScreenPreviewHelper_v7_6 (void
 IDeckLinkVideoConversion_v7_6* CreateVideoConversionInstance_v7_6 (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI_v7_6);
-
+	
 	if (gCreateVideoConversionFunc == NULL)
 		return NULL;
 	return gCreateVideoConversionFunc();

+ 10 - 10
plugins/decklink/linux/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -52,16 +52,16 @@ 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());
@@ -76,7 +76,7 @@ void	InitDeckLinkAPI (void)
 void	InitDeckLinkPreviewAPI (void)
 {
 	void *libraryHandle;
-
+	
 	libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL);
 	if (!libraryHandle)
 	{
@@ -97,7 +97,7 @@ bool		IsDeckLinkAPIPresent (void)
 IDeckLinkIterator_v8_0*		CreateDeckLinkIteratorInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateIteratorFunc == NULL)
 		return NULL;
 	return gCreateIteratorFunc();
@@ -106,7 +106,7 @@ IDeckLinkIterator_v8_0*		CreateDeckLinkIteratorInstance (void)
 IDeckLinkAPIInformation*	CreateDeckLinkAPIInformationInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateAPIInformationFunc == NULL)
 		return NULL;
 	return gCreateAPIInformationFunc();
@@ -116,7 +116,7 @@ IDeckLinkGLScreenPreviewHelper*		CreateOpenGLScreenPreviewHelper (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
 	pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI);
-
+	
 	if (gCreateOpenGLPreviewFunc == NULL)
 		return NULL;
 	return gCreateOpenGLPreviewFunc();
@@ -125,7 +125,7 @@ IDeckLinkGLScreenPreviewHelper*		CreateOpenGLScreenPreviewHelper (void)
 IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateVideoConversionFunc == NULL)
 		return NULL;
 	return gCreateVideoConversionFunc();

+ 58 - 12
plugins/decklink/linux/decklink-sdk/DeckLinkAPIModes.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -65,12 +69,12 @@ enum _BMDDisplayMode {
     bmdModeHD1080p25                                             = /* 'Hp25' */ 0x48703235,
     bmdModeHD1080p2997                                           = /* 'Hp29' */ 0x48703239,
     bmdModeHD1080p30                                             = /* 'Hp30' */ 0x48703330,
-    bmdModeHD1080i50                                             = /* 'Hi50' */ 0x48693530,
-    bmdModeHD1080i5994                                           = /* 'Hi59' */ 0x48693539,
-    bmdModeHD1080i6000                                           = /* 'Hi60' */ 0x48693630,	// N.B. This _really_ is 60.00 Hz.
     bmdModeHD1080p50                                             = /* 'Hp50' */ 0x48703530,
     bmdModeHD1080p5994                                           = /* 'Hp59' */ 0x48703539,
     bmdModeHD1080p6000                                           = /* 'Hp60' */ 0x48703630,	// N.B. This _really_ is 60.00 Hz.
+    bmdModeHD1080i50                                             = /* 'Hi50' */ 0x48693530,
+    bmdModeHD1080i5994                                           = /* 'Hi59' */ 0x48693539,
+    bmdModeHD1080i6000                                           = /* 'Hi60' */ 0x48693630,	// N.B. This _really_ is 60.00 Hz.
 
     /* HD 720 Modes */
 
@@ -78,19 +82,24 @@ enum _BMDDisplayMode {
     bmdModeHD720p5994                                            = /* 'hp59' */ 0x68703539,
     bmdModeHD720p60                                              = /* 'hp60' */ 0x68703630,
 
-    /* 2k Modes */
+    /* 2K Modes */
 
     bmdMode2k2398                                                = /* '2k23' */ 0x326B3233,
     bmdMode2k24                                                  = /* '2k24' */ 0x326B3234,
     bmdMode2k25                                                  = /* '2k25' */ 0x326B3235,
 
-    /* DCI Modes (output only) */
+    /* 2K DCI Modes */
 
     bmdMode2kDCI2398                                             = /* '2d23' */ 0x32643233,
     bmdMode2kDCI24                                               = /* '2d24' */ 0x32643234,
     bmdMode2kDCI25                                               = /* '2d25' */ 0x32643235,
+    bmdMode2kDCI2997                                             = /* '2d29' */ 0x32643239,
+    bmdMode2kDCI30                                               = /* '2d30' */ 0x32643330,
+    bmdMode2kDCI50                                               = /* '2d50' */ 0x32643530,
+    bmdMode2kDCI5994                                             = /* '2d59' */ 0x32643539,
+    bmdMode2kDCI60                                               = /* '2d60' */ 0x32643630,
 
-    /* 4k Modes */
+    /* 4K UHD Modes */
 
     bmdMode4K2160p2398                                           = /* '4k23' */ 0x346B3233,
     bmdMode4K2160p24                                             = /* '4k24' */ 0x346B3234,
@@ -101,11 +110,43 @@ enum _BMDDisplayMode {
     bmdMode4K2160p5994                                           = /* '4k59' */ 0x346B3539,
     bmdMode4K2160p60                                             = /* '4k60' */ 0x346B3630,
 
-    /* DCI Modes (output only) */
+    /* 4K DCI Modes */
 
     bmdMode4kDCI2398                                             = /* '4d23' */ 0x34643233,
     bmdMode4kDCI24                                               = /* '4d24' */ 0x34643234,
     bmdMode4kDCI25                                               = /* '4d25' */ 0x34643235,
+    bmdMode4kDCI2997                                             = /* '4d29' */ 0x34643239,
+    bmdMode4kDCI30                                               = /* '4d30' */ 0x34643330,
+    bmdMode4kDCI50                                               = /* '4d50' */ 0x34643530,
+    bmdMode4kDCI5994                                             = /* '4d59' */ 0x34643539,
+    bmdMode4kDCI60                                               = /* '4d60' */ 0x34643630,
+
+    /* 8K UHD Modes */
+
+    bmdMode8K4320p2398                                           = /* '8k23' */ 0x386B3233,
+    bmdMode8K4320p24                                             = /* '8k24' */ 0x386B3234,
+    bmdMode8K4320p25                                             = /* '8k25' */ 0x386B3235,
+    bmdMode8K4320p2997                                           = /* '8k29' */ 0x386B3239,
+    bmdMode8K4320p30                                             = /* '8k30' */ 0x386B3330,
+    bmdMode8K4320p50                                             = /* '8k50' */ 0x386B3530,
+    bmdMode8K4320p5994                                           = /* '8k59' */ 0x386B3539,
+    bmdMode8K4320p60                                             = /* '8k60' */ 0x386B3630,
+
+    /* 8K DCI Modes */
+
+    bmdMode8kDCI2398                                             = /* '8d23' */ 0x38643233,
+    bmdMode8kDCI24                                               = /* '8d24' */ 0x38643234,
+    bmdMode8kDCI25                                               = /* '8d25' */ 0x38643235,
+    bmdMode8kDCI2997                                             = /* '8d29' */ 0x38643239,
+    bmdMode8kDCI30                                               = /* '8d30' */ 0x38643330,
+    bmdMode8kDCI50                                               = /* '8d50' */ 0x38643530,
+    bmdMode8kDCI5994                                             = /* '8d59' */ 0x38643539,
+    bmdMode8kDCI60                                               = /* '8d60' */ 0x38643630,
+
+    /* RAW Modes for Cintel (input only) */
+
+    bmdModeCintelRAW                                             = /* 'rwci' */ 0x72776369,	// Frame size up to 4096x3072, variable frame rate
+    bmdModeCintelCompressedRAW                                   = /* 'rwcc' */ 0x72776363,	// Frame size up to 4096x3072, variable frame rate
 
     /* Special Modes */
 
@@ -140,7 +181,12 @@ enum _BMDPixelFormat {
 
     /* AVID DNxHR */
 
-    bmdFormatDNxHR                                               = /* 'AVdh' */ 0x41566468
+    bmdFormatDNxHR                                               = /* 'AVdh' */ 0x41566468,
+
+    /* Cintel formats */
+
+    bmdFormat12BitRAWGRBG                                        = /* 'r12p' */ 0x72313270,	// 12-bit RAW data for bayer pattern GRBG
+    bmdFormat12BitRAWJPEG                                        = /* 'r16p' */ 0x72313670	// 12-bit RAW data arranged in tiles and JPEG compressed
 };
 
 /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */
@@ -159,7 +205,7 @@ class IDeckLinkDisplayMode;
 
 /* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */
 
-class IDeckLinkDisplayModeIterator : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayModeIterator : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0;
@@ -170,7 +216,7 @@ protected:
 
 /* Interface IDeckLinkDisplayMode - represents a display mode */
 
-class IDeckLinkDisplayMode : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayMode : public IUnknown
 {
 public:
     virtual HRESULT GetName (/* out */ const char **name) = 0;

+ 9 - 4
plugins/decklink/linux/decklink-sdk/DeckLinkAPITypes.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 typedef int64_t BMDTimeValue;
@@ -54,7 +58,8 @@ typedef uint32_t BMDTimecodeFlags;
 enum _BMDTimecodeFlags {
     bmdTimecodeFlagDefault                                       = 0,
     bmdTimecodeIsDropFrame                                       = 1 << 0,
-    bmdTimecodeFieldMark                                         = 1 << 1
+    bmdTimecodeFieldMark                                         = 1 << 1,
+    bmdTimecodeColorFrame                                        = 1 << 2
 };
 
 /* Enum BMDVideoConnection - Video connection types */
@@ -96,7 +101,7 @@ class IDeckLinkTimecode;
 
 /* Interface IDeckLinkTimecode - Used for video frame timecode representation. */
 
-class IDeckLinkTimecode : public IUnknown
+class BMD_PUBLIC IDeckLinkTimecode : public IUnknown
 {
 public:
     virtual BMDTimecodeBCD GetBCD (void) = 0;

+ 4 - 4
plugins/decklink/linux/decklink-sdk/DeckLinkAPIVersion.h

@@ -7,14 +7,14 @@
  * ** 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
@@ -30,8 +30,8 @@
 #ifndef __DeckLink_API_Version_h__
 #define __DeckLink_API_Version_h__
 
-#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a080000
-#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.8"
+#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a0b0000
+#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.11"
 
 #endif	// __DeckLink_API_Version_h__
 

+ 3 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_2.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,7 +37,7 @@
 typedef uint32_t BMDDeckLinkConfigurationID_v10_2;
 enum  _BMDDeckLinkConfigurationID_v10_2 {
     /* Video output flags */
-
+	
     bmdDeckLinkConfig3GBpsVideoOutput_v10_2                      = '3gbs',
 };
 

+ 45 - 0
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v10_9.h

@@ -0,0 +1,45 @@
+/* -LICENSE-START-
+** Copyright (c) 2017 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_9_H
+#define BMD_DECKLINKAPI_v10_9_H
+
+#include "DeckLinkAPI.h"
+
+// Type Declarations
+
+/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
+
+typedef uint32_t BMDDeckLinkConfigurationID_v10_9;
+enum _BMDDeckLinkConfigurationID_v10_9 {
+
+    /* Flags */
+
+    bmdDeckLinkConfig1080pNotPsF_v10_9                      = 'fpro',
+};
+
+#endif /* defined(BMD_DECKLINKAPI_v10_9_H) */

+ 27 - 27
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_1.h

@@ -7,14 +7,14 @@
 ** 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
@@ -66,14 +66,14 @@ class IDeckLinkVideoFrame_v7_1;
 class IDeckLinkVideoInputFrame_v7_1;
 class IDeckLinkAudioInputPacket_v7_1;
 
-class IDeckLinkDisplayModeIterator_v7_1 : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayModeIterator_v7_1 : public IUnknown
 {
 public:
 	virtual	HRESULT	STDMETHODCALLTYPE	Next (IDeckLinkDisplayMode_v7_1* *deckLinkDisplayMode) = 0;
 };
 
 
-class IDeckLinkDisplayMode_v7_1 : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayMode_v7_1 : public IUnknown
 {
 public:
 	virtual	HRESULT			STDMETHODCALLTYPE	GetName (const char **name) = 0;
@@ -83,56 +83,56 @@ public:
 	virtual	HRESULT			STDMETHODCALLTYPE	GetFrameRate (BMDTimeValue *frameDuration, BMDTimeScale *timeScale) = 0;
 };
 
-class IDeckLinkVideoOutputCallback_v7_1 : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoOutputCallback_v7_1 : public IUnknown
 {
 public:
 	virtual HRESULT STDMETHODCALLTYPE	ScheduledFrameCompleted (IDeckLinkVideoFrame_v7_1* completedFrame, BMDOutputFrameCompletionResult result) = 0;
 };
 
-class IDeckLinkInputCallback_v7_1 : public IUnknown
+class BMD_PUBLIC 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
+class BMD_PUBLIC 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;
@@ -140,23 +140,23 @@ public:
 };
 
 // IDeckLinkInput_v7_1.  Created by QueryInterface from IDeckLink.
-class IDeckLinkInput_v7_1 : public IUnknown
+class BMD_PUBLIC 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;
@@ -164,7 +164,7 @@ public:
 };
 
 // IDeckLinkVideoFrame_v7_1.  Created by IDeckLinkOutput::CreateVideoFrame.
-class IDeckLinkVideoFrame_v7_1 : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame_v7_1 : public IUnknown
 {
 public:
 	virtual long STDMETHODCALLTYPE					GetWidth () = 0;
@@ -176,19 +176,19 @@ public:
 };
 
 // IDeckLinkVideoInputFrame_v7_1.  Provided by the IDeckLinkInput_v7_1 frame arrival callback.
-class IDeckLinkVideoInputFrame_v7_1 : public IDeckLinkVideoFrame_v7_1
+class BMD_PUBLIC 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
+class BMD_PUBLIC 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;
 };
 

+ 6 - 6
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_3.h

@@ -7,14 +7,14 @@
 ** 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
@@ -53,7 +53,7 @@ class IDeckLinkVideoInputFrame_v7_3;
 
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkOutput_v7_3 : public IUnknown
+class BMD_PUBLIC IDeckLinkOutput_v7_3 : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0;
@@ -107,7 +107,7 @@ protected:
 
 /* Interface IDeckLinkInputCallback - Frame arrival callback. */
 
-class IDeckLinkInputCallback_v7_3 : public IUnknown
+class BMD_PUBLIC IDeckLinkInputCallback_v7_3 : public IUnknown
 {
 public:
     virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -122,7 +122,7 @@ protected:
 
 /* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkInput_v7_3 : public IUnknown
+class BMD_PUBLIC IDeckLinkInput_v7_3 : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0;
@@ -158,7 +158,7 @@ protected:
 
 /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
 
-class IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame_v7_6
+class BMD_PUBLIC IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame_v7_6
 {
 public:
     virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0;

+ 35 - 35
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_6.h

@@ -7,14 +7,14 @@
 ** 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
@@ -83,7 +83,7 @@ class IDeckLinkVideoConversion_v7_6;
 
 /* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */
 
-class IDeckLinkVideoOutputCallback_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoOutputCallback_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame_v7_6 *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0;
@@ -96,7 +96,7 @@ protected:
 
 /* Interface IDeckLinkInputCallback - Frame arrival callback. */
 
-class IDeckLinkInputCallback_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkInputCallback_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode_v7_6 *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -109,7 +109,7 @@ protected:
 
 /* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */
 
-class IDeckLinkDisplayModeIterator_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayModeIterator_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLinkDisplayMode_v7_6 **deckLinkDisplayMode) = 0;
@@ -121,7 +121,7 @@ protected:
 
 /* Interface IDeckLinkDisplayMode - represents a display mode */
 
-class IDeckLinkDisplayMode_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayMode_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT GetName (/* out */ const char **name) = 0;
@@ -138,7 +138,7 @@ protected:
 
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkOutput_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkOutput_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0;
@@ -194,7 +194,7 @@ protected:
 
 /* Interface IDeckLinkInput_v7_6 - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkInput_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkInput_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* out */ BMDDisplayModeSupport *result) = 0;
@@ -233,7 +233,7 @@ protected:
 
 /* Interface IDeckLinkTimecode - Used for video frame timecode representation. */
 
-class IDeckLinkTimecode_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkTimecode_v7_6 : public IUnknown
 {
 public:
     virtual BMDTimecodeBCD GetBCD (void) = 0;
@@ -248,7 +248,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
 
-class IDeckLinkVideoFrame_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame_v7_6 : public IUnknown
 {
 public:
     virtual long GetWidth (void) = 0;
@@ -268,7 +268,7 @@ protected:
 
 /* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
 
-class IDeckLinkMutableVideoFrame_v7_6 : public IDeckLinkVideoFrame_v7_6
+class BMD_PUBLIC IDeckLinkMutableVideoFrame_v7_6 : public IDeckLinkVideoFrame_v7_6
 {
 public:
     virtual HRESULT SetFlags (BMDFrameFlags newFlags) = 0;
@@ -284,7 +284,7 @@ protected:
 
 /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
 
-class IDeckLinkVideoInputFrame_v7_6 : public IDeckLinkVideoFrame_v7_6
+class BMD_PUBLIC IDeckLinkVideoInputFrame_v7_6 : public IDeckLinkVideoFrame_v7_6
 {
 public:
     virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, BMDTimeScale timeScale) = 0;
@@ -297,7 +297,7 @@ protected:
 
 /* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */
 
-class IDeckLinkScreenPreviewCallback_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkScreenPreviewCallback_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame_v7_6 *theFrame) = 0;
@@ -309,7 +309,7 @@ protected:
 
 /* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */
 
-class IDeckLinkGLScreenPreviewHelper_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkGLScreenPreviewHelper_v7_6 : public IUnknown
 {
 public:
 
@@ -326,7 +326,7 @@ protected:
 
 /* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */
 
-class IDeckLinkVideoConversion_v7_6 : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoConversion_v7_6 : public IUnknown
 {
 public:
     virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame_v7_6* srcFrame, /* in */ IDeckLinkVideoFrame_v7_6* dstFrame) = 0;
@@ -337,54 +337,54 @@ protected:
 
 /* Interface IDeckLinkConfiguration - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkConfiguration_v7_6 : public IUnknown
+class BMD_PUBLIC 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;
 };
@@ -393,9 +393,9 @@ public:
 
 extern "C" {
 
-	IDeckLinkIterator*							CreateDeckLinkIteratorInstance_v7_6 (void);
-	IDeckLinkGLScreenPreviewHelper_v7_6*		CreateOpenGLScreenPreviewHelper_v7_6 (void);
-    IDeckLinkVideoConversion_v7_6*				CreateVideoConversionInstance_v7_6 (void);
+	IDeckLinkIterator*							BMD_PUBLIC CreateDeckLinkIteratorInstance_v7_6 (void);
+	IDeckLinkGLScreenPreviewHelper_v7_6*		BMD_PUBLIC CreateOpenGLScreenPreviewHelper_v7_6 (void);
+    IDeckLinkVideoConversion_v7_6*				BMD_PUBLIC CreateVideoConversionInstance_v7_6 (void);
 
 };
 

+ 4 - 4
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v7_9.h

@@ -7,14 +7,14 @@
 ** 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
@@ -42,7 +42,7 @@
 class IDeckLinkDeckControl_v7_9;
 
 /* Interface IDeckLinkDeckControl_v7_9 - Deck Control main interface */
-class IDeckLinkDeckControl_v7_9 : public IUnknown
+class BMD_PUBLIC IDeckLinkDeckControl_v7_9 : public IUnknown
 {
 public:
     virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0;
@@ -77,7 +77,7 @@ public:
     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
 };

+ 5 - 5
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_0.h

@@ -7,14 +7,14 @@
 ** 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
@@ -39,7 +39,7 @@
 
 /* Interface IDeckLink_v8_0 - represents a DeckLink device */
 
-class IDeckLink_v8_0 : public IUnknown
+class BMD_PUBLIC IDeckLink_v8_0 : public IUnknown
 {
 public:
     virtual HRESULT GetModelName (/* out */ const char **modelName) = 0;
@@ -47,14 +47,14 @@ public:
 
 /* Interface IDeckLinkIterator_v8_0 - enumerates installed DeckLink hardware */
 
-class IDeckLinkIterator_v8_0 : public IUnknown
+class BMD_PUBLIC IDeckLinkIterator_v8_0 : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLink_v8_0 **deckLinkInstance) = 0;
 };
 
 extern "C" {
-    IDeckLinkIterator_v8_0*                     CreateDeckLinkIteratorInstance_v8_0 (void);
+    IDeckLinkIterator_v8_0*                     BMD_PUBLIC CreateDeckLinkIteratorInstance_v8_0 (void);
 };
 
 #endif	// defined __cplusplus

+ 6 - 6
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v8_1.h

@@ -7,14 +7,14 @@
  ** 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
@@ -52,21 +52,21 @@ enum _BMDDeckControlVTRControlState_v8_1 {
 
 /* Interface IDeckLinkDeckControlStatusCallback_v8_1 - Deck control state change callback. */
 
-class IDeckLinkDeckControlStatusCallback_v8_1 : public IUnknown
+class BMD_PUBLIC 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
+class BMD_PUBLIC IDeckLinkDeckControl_v8_1 : public IUnknown
 {
 public:
     virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0;
@@ -102,7 +102,7 @@ public:
     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
 };

+ 3 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_2.h

@@ -7,14 +7,14 @@
 ** 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
@@ -40,7 +40,7 @@
 
 /* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkInput_v9_2 : public IUnknown
+class BMD_PUBLIC 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;

+ 3 - 3
plugins/decklink/linux/decklink-sdk/DeckLinkAPI_v9_9.h

@@ -7,14 +7,14 @@
 ** 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
@@ -40,7 +40,7 @@
 
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkOutput_v9_9 : public IUnknown
+class BMD_PUBLIC 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;

+ 13 - 8
plugins/decklink/linux/decklink-sdk/LinuxCOM.h

@@ -7,14 +7,14 @@
 ** 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
@@ -29,7 +29,7 @@
 #define __LINUX_COM_H_
 
 struct REFIID
-{
+{	
 	unsigned char byte0;
 	unsigned char byte1;
 	unsigned char byte2;
@@ -85,14 +85,19 @@ typedef void *LPVOID;
 #define IID_IUnknown		(REFIID){0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}
 #define IUnknownUUID		IID_IUnknown
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 #ifdef __cplusplus
-class IUnknown
+class BMD_PUBLIC IUnknown
 {
     public:
-	virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) = 0;
-	virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
-	virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
+    	virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) = 0;
+    	virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
+    	virtual ULONG STDMETHODCALLTYPE Release(void) = 0;
 };
 #endif
 
-#endif
+#endif 
+

+ 26 - 8
plugins/decklink/mac/CMakeLists.txt

@@ -5,9 +5,9 @@ if(DISABLE_DECKLINK)
 	return()
 endif()
 
-find_library(COREFOUNDATION CoreFoundation)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}")
 
-include_directories(${COREFOUNDATION})
+find_library(COREFOUNDATION CoreFoundation)
 
 set(mac-decklink-sdk_HEADERS
 	decklink-sdk/DeckLinkAPI.h
@@ -17,16 +17,19 @@ set(mac-decklink-sdk_HEADERS
 	decklink-sdk/DeckLinkAPIModes.h
 	decklink-sdk/DeckLinkAPIStreaming.h
 	decklink-sdk/DeckLinkAPITypes.h
-	decklink-sdk/DeckLinkAPIVersion.h
-	)
+	decklink-sdk/DeckLinkAPIVersion.h)
 
 set(mac-decklink-sdk_SOURCES
 	decklink-sdk/DeckLinkAPIDispatch.cpp
 	)
 
 set(mac-decklink_HEADERS
+	../decklink-devices.hpp
+	../const.h
+	../DecklinkOutput.hpp
 	../platform.hpp
-	../decklink.hpp
+	../DecklinkInput.hpp
+	../DecklinkBase.h
 	../decklink-device-instance.hpp
 	../decklink-device-discovery.hpp
 	../decklink-device.hpp
@@ -37,19 +40,34 @@ set(mac-decklink_HEADERS
 
 set(mac-decklink_SOURCES
 	../plugin-main.cpp
-	../decklink.cpp
+	../decklink-devices.cpp
+	../decklink-output.cpp
+	../decklink-source.cpp
+	../DecklinkOutput.cpp
+	../DecklinkInput.cpp
+	../DecklinkBase.cpp
 	../decklink-device-instance.cpp
 	../decklink-device-discovery.cpp
 	../decklink-device.cpp
 	../decklink-device-mode.cpp
 	../audio-repack.c
-	platform.cpp)
+	platform.cpp
+	)
+
+list(APPEND decklink_HEADERS ${decklink_UI_HEADERS})
+
+include_directories(
+	${COREFOUNDATION}
+	"${CMAKE_SOURCE_DIR}/UI/obs-frontend-api")
+
+list(APPEND mac-decklink_HEADERS ${decklink_UI_HEADERS})
 
 add_library(mac-decklink MODULE
 	${mac-decklink_SOURCES}
 	${mac-decklink_HEADERS}
 	${mac-decklink-sdk_HEADERS}
-	${mac-decklink-sdk_SOURCES})
+	${mac-decklink-sdk_SOURCES}
+	)
 
 target_link_libraries(mac-decklink
 	libobs

+ 177 - 61
plugins/decklink/mac/decklink-sdk/DeckLinkAPI.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 /* DeckLink API */
 
 #include <CoreFoundation/CoreFoundation.h>
@@ -73,6 +77,9 @@ BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame                   = /* 69E2639F-
 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_IDeckLinkAncillaryPacket                     = /* CC5BBF7E-029C-4D3B-9158-6000EF5E3670 */ {0xCC,0x5B,0xBF,0x7E,0x02,0x9C,0x4D,0x3B,0x91,0x58,0x60,0x00,0xEF,0x5E,0x36,0x70};
+BMD_CONST REFIID IID_IDeckLinkAncillaryPacketIterator             = /* 3FC8994B-88FB-4C17-968F-9AAB69D964A7 */ {0x3F,0xC8,0x99,0x4B,0x88,0xFB,0x4C,0x17,0x96,0x8F,0x9A,0xAB,0x69,0xD9,0x64,0xA7};
+BMD_CONST REFIID IID_IDeckLinkVideoFrameAncillaryPackets          = /* 6C186C0F-459E-41D8-AEE2-4812D81AEE68 */ {0x6C,0x18,0x6C,0x0F,0x45,0x9E,0x41,0xD8,0xAE,0xE2,0x48,0x12,0xD8,0x1A,0xEE,0x68};
 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};
@@ -117,9 +124,11 @@ enum _BMDFrameFlags {
     bmdFrameFlagDefault                                          = 0,
     bmdFrameFlagFlipVertical                                     = 1 << 0,
     bmdFrameContainsHDRMetadata                                  = 1 << 1,
+    bmdFrameContainsCintelMetadata                               = 1 << 2,
 
     /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
 
+    bmdFrameCapturedAsPsF                                        = 1 << 30,
     bmdFrameHasNoInputSource                                     = 1 << 31
 };
 
@@ -163,10 +172,10 @@ enum _BMDDeckLinkCapturePassthroughMode {
 
 typedef uint32_t BMDOutputFrameCompletionResult;
 enum _BMDOutputFrameCompletionResult {
-    bmdOutputFrameCompleted,
-    bmdOutputFrameDisplayedLate,
-    bmdOutputFrameDropped,
-    bmdOutputFrameFlushed
+    bmdOutputFrameCompleted,                                    
+    bmdOutputFrameDisplayedLate,                                
+    bmdOutputFrameDropped,                                      
+    bmdOutputFrameFlushed                                       
 };
 
 /* Enum BMDReferenceStatus - GenLock input status */
@@ -203,9 +212,9 @@ enum _BMDAudioSampleType {
 
 typedef uint32_t BMDAudioOutputStreamType;
 enum _BMDAudioOutputStreamType {
-    bmdAudioOutputStreamContinuous,
-    bmdAudioOutputStreamContinuousDontResample,
-    bmdAudioOutputStreamTimestamped
+    bmdAudioOutputStreamContinuous,                             
+    bmdAudioOutputStreamContinuousDontResample,                 
+    bmdAudioOutputStreamTimestamped                             
 };
 
 /* Enum BMDDisplayModeSupport - Output mode supported flags */
@@ -213,8 +222,17 @@ enum _BMDAudioOutputStreamType {
 typedef uint32_t BMDDisplayModeSupport;
 enum _BMDDisplayModeSupport {
     bmdDisplayModeNotSupported                                   = 0,
-    bmdDisplayModeSupported,
-    bmdDisplayModeSupportedWithConversion
+    bmdDisplayModeSupported,                                    
+    bmdDisplayModeSupportedWithConversion                       
+};
+
+/* Enum BMDAncillaryPacketFormat - Ancillary packet format */
+
+typedef uint32_t BMDAncillaryPacketFormat;
+enum _BMDAncillaryPacketFormat {
+    bmdAncillaryPacketFormatUInt8                                = 'ui08',
+    bmdAncillaryPacketFormatUInt16                               = 'ui16',
+    bmdAncillaryPacketFormatYCbCr10                              = 'v210'
 };
 
 /* Enum BMDTimecodeFormat - Timecode formats for frame metadata */
@@ -341,6 +359,37 @@ enum _BMDDeviceInterface {
 typedef uint32_t BMDDeckLinkFrameMetadataID;
 enum _BMDDeckLinkFrameMetadataID {
     bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc        = 'eotf',	// EOTF in range 0-7 as per CEA 861.3
+    bmdDeckLinkFrameMetadataCintelFilmType                       = 'cfty',	// Current film type
+    bmdDeckLinkFrameMetadataCintelFilmGauge                      = 'cfga',	// Current film gauge
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedHorizontal       = 'odfh',	// Horizontal offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedVertical         = 'odfv',	// Vertical offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelKeykodeLow                     = 'ckkl',	// Raw keykode value - low 64 bits
+    bmdDeckLinkFrameMetadataCintelKeykodeHigh                    = 'ckkh',	// Raw keykode value - high 64 bits
+    bmdDeckLinkFrameMetadataCintelTile1Size                      = 'ct1s',	// Size in bytes of compressed raw tile 1
+    bmdDeckLinkFrameMetadataCintelTile2Size                      = 'ct2s',	// Size in bytes of compressed raw tile 2
+    bmdDeckLinkFrameMetadataCintelTile3Size                      = 'ct3s',	// Size in bytes of compressed raw tile 3
+    bmdDeckLinkFrameMetadataCintelTile4Size                      = 'ct4s',	// Size in bytes of compressed raw tile 4
+    bmdDeckLinkFrameMetadataCintelImageWidth                     = 'IWPx',	// Width in pixels of image
+    bmdDeckLinkFrameMetadataCintelImageHeight                    = 'IHPx',	// Height in pixels of image
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed          = 'mrir',	// Red in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed        = 'mgir',	// Green in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed         = 'mbir',	// Blue in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen        = 'mrig',	// Red in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen      = 'mgig',	// Green in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen       = 'mbig',	// Blue in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue         = 'mrib',	// Red in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue       = 'mgib',	// Green in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue        = 'mbib',	// Blue in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed             = 'mlrr',	// Red in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed           = 'mlgr',	// Green in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed            = 'mlbr',	// Blue in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen           = 'mlrg',	// Red in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen         = 'mlgg',	// Green in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen          = 'mlbg',	// Blue in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue            = 'mlrb',	// Red in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue          = 'mlgb',	// Green in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue           = 'mlbb',	// Blue in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelFilmFrameRate                  = 'cffr',	// Film frame rate
     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
@@ -352,7 +401,15 @@ enum _BMDDeckLinkFrameMetadataID {
     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
+    bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel     = 'fall',	// Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal        = 'otah',	// Horizontal offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical          = 'otav',	// Vertical offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelGainRed                        = 'LfRd',	// Red gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainGreen                      = 'LfGr',	// Green gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainBlue                       = 'LfBl',	// Blue gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelLiftRed                        = 'GnRd',	// Red lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftGreen                      = 'GnGr',	// Green lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftBlue                       = 'GnBl'	// Blue lift parameter to apply after log and gain
 };
 
 /* Enum BMDDuplexMode - Duplex for configurable ports */
@@ -394,18 +451,19 @@ enum _BMDDeckLinkAttributeID {
     /* Integers */
 
     BMDDeckLinkMaximumAudioChannels                              = 'mach',
-    BMDDeckLinkMaximumAnalogAudioChannels                        = 'aach',
+    BMDDeckLinkMaximumAnalogAudioInputChannels                   = 'iach',
+    BMDDeckLinkMaximumAnalogAudioOutputChannels                  = 'aach',
     BMDDeckLinkNumberOfSubDevices                                = 'nsbd',
     BMDDeckLinkSubDeviceIndex                                    = 'subi',
     BMDDeckLinkPersistentID                                      = 'peid',
     BMDDeckLinkDeviceGroupID                                     = 'dgid',
     BMDDeckLinkTopologicalID                                     = 'toid',
-    BMDDeckLinkVideoOutputConnections                            = 'vocn',
-    BMDDeckLinkVideoInputConnections                             = 'vicn',
-    BMDDeckLinkAudioOutputConnections                            = 'aocn',
-    BMDDeckLinkAudioInputConnections                             = 'aicn',
+    BMDDeckLinkVideoOutputConnections                            = 'vocn',	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkVideoInputConnections                             = 'vicn',	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkAudioOutputConnections                            = 'aocn',	// Returns a BMDAudioConnection bit field
+    BMDDeckLinkAudioInputConnections                             = 'aicn',	// Returns a BMDAudioConnection bit field
     BMDDeckLinkVideoIOSupport                                    = 'vios',	// Returns a BMDVideoIOSupport bit field
-    BMDDeckLinkDeckControlConnections                            = 'dccn',
+    BMDDeckLinkDeckControlConnections                            = 'dccn',	// Returns a BMDDeckControlConnection bit field
     BMDDeckLinkDeviceInterface                                   = 'dbus',	// Returns a BMDDeviceInterface
     BMDDeckLinkAudioInputRCAChannelCount                         = 'airc',
     BMDDeckLinkAudioInputXLRChannelCount                         = 'aixc',
@@ -459,11 +517,14 @@ enum _BMDDeckLinkStatusID {
     bmdDeckLinkStatusReferenceSignalFlags                        = 'reff',
     bmdDeckLinkStatusDuplexMode                                  = 'dupx',
     bmdDeckLinkStatusBusy                                        = 'busy',
+    bmdDeckLinkStatusInterchangeablePanelType                    = 'icpt',
+    bmdDeckLinkStatusDeviceTemperature                           = 'dtmp',
 
     /* Flags */
 
     bmdDeckLinkStatusVideoInputSignalLocked                      = 'visl',
-    bmdDeckLinkStatusReferenceSignalLocked                       = 'refl'
+    bmdDeckLinkStatusReferenceSignalLocked                       = 'refl',
+    bmdDeckLinkStatusReceivedEDID                                = 'edid'
 };
 
 /* Enum BMDDeckLinkVideoStatusFlags -  */
@@ -484,6 +545,14 @@ enum _BMDDuplexStatus {
     bmdDuplexStatusInactive                                      = 'inac'
 };
 
+/* Enum BMDPanelType - The type of interchangeable panel */
+
+typedef uint32_t BMDPanelType;
+enum _BMDPanelType {
+    bmdPanelNotDetected                                          = 'npnl',
+    bmdPanelTeranexMiniSmartPanel                                = 'tmsm'
+};
+
 /* Enum BMDDeviceBusyState - Current device busy state */
 
 typedef uint32_t BMDDeviceBusyState;
@@ -539,6 +608,9 @@ class IDeckLinkMutableVideoFrame;
 class IDeckLinkVideoFrame3DExtensions;
 class IDeckLinkVideoFrameMetadataExtensions;
 class IDeckLinkVideoInputFrame;
+class IDeckLinkAncillaryPacket;
+class IDeckLinkAncillaryPacketIterator;
+class IDeckLinkVideoFrameAncillaryPackets;
 class IDeckLinkVideoFrameAncillary;
 class IDeckLinkEncoderPacket;
 class IDeckLinkEncoderVideoPacket;
@@ -559,7 +631,7 @@ class IDeckLinkDiscovery;
 
 /* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */
 
-class IDeckLinkVideoOutputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoOutputCallback : public IUnknown
 {
 public:
     virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0;
@@ -571,7 +643,7 @@ protected:
 
 /* Interface IDeckLinkInputCallback - Frame arrival callback. */
 
-class IDeckLinkInputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkInputCallback : public IUnknown
 {
 public:
     virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -583,7 +655,7 @@ protected:
 
 /* Interface IDeckLinkEncoderInputCallback - Frame arrival callback. */
 
-class IDeckLinkEncoderInputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderInputCallback : public IUnknown
 {
 public:
     virtual HRESULT VideoInputSignalChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;
@@ -596,7 +668,7 @@ protected:
 
 /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */
 
-class IDeckLinkMemoryAllocator : public IUnknown
+class BMD_PUBLIC IDeckLinkMemoryAllocator : public IUnknown
 {
 public:
     virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0;
@@ -608,7 +680,7 @@ public:
 
 /* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */
 
-class IDeckLinkAudioOutputCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkAudioOutputCallback : public IUnknown
 {
 public:
     virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0;
@@ -616,7 +688,7 @@ public:
 
 /* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */
 
-class IDeckLinkIterator : public IUnknown
+class BMD_PUBLIC IDeckLinkIterator : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0;
@@ -624,7 +696,7 @@ public:
 
 /* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */
 
-class IDeckLinkAPIInformation : public IUnknown
+class BMD_PUBLIC IDeckLinkAPIInformation : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0;
@@ -638,7 +710,7 @@ protected:
 
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkOutput : public IUnknown
+class BMD_PUBLIC IDeckLinkOutput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -653,7 +725,7 @@ public:
 
     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 CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 
     virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
     virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0;
@@ -695,7 +767,7 @@ protected:
 
 /* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkInput : public IUnknown
+class BMD_PUBLIC IDeckLinkInput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -734,7 +806,7 @@ protected:
 
 /* Interface IDeckLinkEncoderInput - Created by QueryInterface from IDeckLink. */
 
-class IDeckLinkEncoderInput : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderInput : public IUnknown
 {
 public:
     virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
@@ -771,7 +843,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */
 
-class IDeckLinkVideoFrame : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame : public IUnknown
 {
 public:
     virtual long GetWidth (void) = 0;
@@ -782,7 +854,7 @@ public:
     virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
 
     virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0;
-    virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0;
+    virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 
 protected:
     virtual ~IDeckLinkVideoFrame () {} // call Release method to drop reference count
@@ -790,7 +862,7 @@ protected:
 
 /* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
 
-class IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame
+class BMD_PUBLIC IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame
 {
 public:
     virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0;
@@ -806,7 +878,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */
 
-class IDeckLinkVideoFrame3DExtensions : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrame3DExtensions : public IUnknown
 {
 public:
     virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0;
@@ -818,7 +890,7 @@ protected:
 
 /* Interface IDeckLinkVideoFrameMetadataExtensions - Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information */
 
-class IDeckLinkVideoFrameMetadataExtensions : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrameMetadataExtensions : public IUnknown
 {
 public:
     virtual HRESULT GetInt (/* in */ BMDDeckLinkFrameMetadataID metadataID, /* out */ int64_t *value) = 0;
@@ -832,7 +904,7 @@ protected:
 
 /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
 
-class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
+class BMD_PUBLIC IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame
 {
 public:
     virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0;
@@ -842,13 +914,56 @@ protected:
     virtual ~IDeckLinkVideoInputFrame () {} // call Release method to drop reference count
 };
 
-/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+/* Interface IDeckLinkAncillaryPacket - On output, user needs to implement this interface */
+
+class BMD_PUBLIC IDeckLinkAncillaryPacket : public IUnknown
+{
+public:
+
+    virtual HRESULT GetBytes (/* in */ BMDAncillaryPacketFormat format /* For output, only one format need be offered */, /* out */ const void **data /* Optional */, /* out */ uint32_t *size /* Optional */) = 0;
+    virtual uint8_t GetDID (void) = 0;
+    virtual uint8_t GetSDID (void) = 0;
+    virtual uint32_t GetLineNumber (void) = 0; // On output, zero is auto
+    virtual uint8_t GetDataStreamIndex (void) = 0; // Usually zero. Can only be 1 if non-SD and the first data stream is completely full
+
+protected:
+    virtual ~IDeckLinkAncillaryPacket () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkAncillaryPacketIterator - Enumerates ancillary packets */
+
+class BMD_PUBLIC IDeckLinkAncillaryPacketIterator : public IUnknown
+{
+public:
+    virtual HRESULT Next (/* out */ IDeckLinkAncillaryPacket **packet) = 0;
+
+protected:
+    virtual ~IDeckLinkAncillaryPacketIterator () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+
+class BMD_PUBLIC IDeckLinkVideoFrameAncillaryPackets : public IUnknown
+{
+public:
+
+    virtual HRESULT GetPacketIterator (/* out */ IDeckLinkAncillaryPacketIterator **iterator) = 0;
+    virtual HRESULT GetFirstPacketByID (/* in */ uint8_t DID, /* in */ uint8_t SDID, /* out */ IDeckLinkAncillaryPacket **packet) = 0;
+    virtual HRESULT AttachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0; // Implement IDeckLinkAncillaryPacket to output your own
+    virtual HRESULT DetachPacket (/* in */ IDeckLinkAncillaryPacket *packet) = 0;
+    virtual HRESULT DetachAllPackets (void) = 0;
+
+protected:
+    virtual ~IDeckLinkVideoFrameAncillaryPackets () {} // call Release method to drop reference count
+};
+
+/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
 
-class IDeckLinkVideoFrameAncillary : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoFrameAncillary : public IUnknown
 {
 public:
 
-    virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0;
+    virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0; // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes
     virtual BMDPixelFormat GetPixelFormat (void) = 0;
     virtual BMDDisplayMode GetDisplayMode (void) = 0;
 
@@ -858,7 +973,7 @@ protected:
 
 /* Interface IDeckLinkEncoderPacket - Interface to encapsulate an encoded packet. */
 
-class IDeckLinkEncoderPacket : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderPacket : public IUnknown
 {
 public:
     virtual HRESULT GetBytes (/* out */ void **buffer) = 0;
@@ -872,7 +987,7 @@ protected:
 
 /* Interface IDeckLinkEncoderVideoPacket - Provided by the IDeckLinkEncoderInput video packet arrival callback. */
 
-class IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
+class BMD_PUBLIC IDeckLinkEncoderVideoPacket : public IDeckLinkEncoderPacket
 {
 public:
     virtual BMDPixelFormat GetPixelFormat (void) = 0;
@@ -886,7 +1001,7 @@ protected:
 
 /* Interface IDeckLinkEncoderAudioPacket - Provided by the IDeckLinkEncoderInput audio packet arrival callback. */
 
-class IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
+class BMD_PUBLIC IDeckLinkEncoderAudioPacket : public IDeckLinkEncoderPacket
 {
 public:
     virtual BMDAudioFormat GetAudioFormat (void) = 0;
@@ -897,7 +1012,7 @@ protected:
 
 /* Interface IDeckLinkH265NALPacket - Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object */
 
-class IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
+class BMD_PUBLIC IDeckLinkH265NALPacket : public IDeckLinkEncoderVideoPacket
 {
 public:
     virtual HRESULT GetUnitType (/* out */ uint8_t *unitType) = 0;
@@ -910,7 +1025,7 @@ protected:
 
 /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */
 
-class IDeckLinkAudioInputPacket : public IUnknown
+class BMD_PUBLIC IDeckLinkAudioInputPacket : public IUnknown
 {
 public:
     virtual long GetSampleFrameCount (void) = 0;
@@ -923,7 +1038,7 @@ protected:
 
 /* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */
 
-class IDeckLinkScreenPreviewCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkScreenPreviewCallback : public IUnknown
 {
 public:
     virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0;
@@ -934,7 +1049,7 @@ protected:
 
 /* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications */
 
-class IDeckLinkCocoaScreenPreviewCallback : public IDeckLinkScreenPreviewCallback
+class BMD_PUBLIC IDeckLinkCocoaScreenPreviewCallback : public IDeckLinkScreenPreviewCallback
 {
 public:
 
@@ -944,7 +1059,7 @@ protected:
 
 /* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */
 
-class IDeckLinkGLScreenPreviewHelper : public IUnknown
+class BMD_PUBLIC IDeckLinkGLScreenPreviewHelper : public IUnknown
 {
 public:
 
@@ -961,7 +1076,7 @@ protected:
 
 /* Interface IDeckLinkNotificationCallback - DeckLink Notification Callback Interface */
 
-class IDeckLinkNotificationCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkNotificationCallback : public IUnknown
 {
 public:
     virtual HRESULT Notify (/* in */ BMDNotifications topic, /* in */ uint64_t param1, /* in */ uint64_t param2) = 0;
@@ -969,7 +1084,7 @@ public:
 
 /* Interface IDeckLinkNotification - DeckLink Notification interface */
 
-class IDeckLinkNotification : public IUnknown
+class BMD_PUBLIC IDeckLinkNotification : public IUnknown
 {
 public:
     virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0;
@@ -978,7 +1093,7 @@ public:
 
 /* Interface IDeckLinkAttributes - DeckLink Attribute interface */
 
-class IDeckLinkAttributes : public IUnknown
+class BMD_PUBLIC IDeckLinkAttributes : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0;
@@ -992,7 +1107,7 @@ protected:
 
 /* Interface IDeckLinkStatus - DeckLink Status interface */
 
-class IDeckLinkStatus : public IUnknown
+class BMD_PUBLIC IDeckLinkStatus : public IUnknown
 {
 public:
     virtual HRESULT GetFlag (/* in */ BMDDeckLinkStatusID statusID, /* out */ bool *value) = 0;
@@ -1007,7 +1122,7 @@ protected:
 
 /* Interface IDeckLinkKeyer - DeckLink Keyer interface */
 
-class IDeckLinkKeyer : public IUnknown
+class BMD_PUBLIC IDeckLinkKeyer : public IUnknown
 {
 public:
     virtual HRESULT Enable (/* in */ bool isExternal) = 0;
@@ -1022,7 +1137,7 @@ protected:
 
 /* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */
 
-class IDeckLinkVideoConversion : public IUnknown
+class BMD_PUBLIC IDeckLinkVideoConversion : public IUnknown
 {
 public:
     virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame* srcFrame, /* in */ IDeckLinkVideoFrame* dstFrame) = 0;
@@ -1033,7 +1148,7 @@ protected:
 
 /* Interface IDeckLinkDeviceNotificationCallback - DeckLink device arrival/removal notification callbacks */
 
-class IDeckLinkDeviceNotificationCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkDeviceNotificationCallback : public IUnknown
 {
 public:
     virtual HRESULT DeckLinkDeviceArrived (/* in */ IDeckLink* deckLinkDevice) = 0;
@@ -1045,7 +1160,7 @@ protected:
 
 /* Interface IDeckLinkDiscovery - DeckLink device discovery */
 
-class IDeckLinkDiscovery : public IUnknown
+class BMD_PUBLIC IDeckLinkDiscovery : public IUnknown
 {
 public:
     virtual HRESULT InstallDeviceNotifications (/* in */ IDeckLinkDeviceNotificationCallback* deviceNotificationCallback) = 0;
@@ -1059,12 +1174,13 @@ protected:
 
 extern "C" {
 
-    IDeckLinkIterator* CreateDeckLinkIteratorInstance (void);
-    IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void);
-    IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void);
-    IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void);
-    IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* /* (NSView*) */ parentView);
-    IDeckLinkVideoConversion* CreateVideoConversionInstance (void);
+    IDeckLinkIterator* BMD_PUBLIC CreateDeckLinkIteratorInstance (void);
+    IDeckLinkDiscovery* BMD_PUBLIC CreateDeckLinkDiscoveryInstance (void);
+    IDeckLinkAPIInformation* BMD_PUBLIC CreateDeckLinkAPIInformationInstance (void);
+    IDeckLinkGLScreenPreviewHelper* BMD_PUBLIC CreateOpenGLScreenPreviewHelper (void);
+    IDeckLinkCocoaScreenPreviewCallback* BMD_PUBLIC CreateCocoaScreenPreview (void* /* (NSView*) */ parentView);
+    IDeckLinkVideoConversion* BMD_PUBLIC CreateVideoConversionInstance (void);
+    IDeckLinkVideoFrameAncillaryPackets* BMD_PUBLIC CreateVideoFrameAncillaryPacketsInstance (void); // For use when creating a custom IDeckLinkVideoFrame without wrapping IDeckLinkOutput::CreateVideoFrame
 
 }
 

+ 19 - 9
plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,12 +37,16 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
 // Interface ID Declarations
 
-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_IDeckLinkConfiguration                       = /* EF90380B-4AE5-4346-9077-E288E149F129 */ {0xEF,0x90,0x38,0x0B,0x4A,0xE5,0x43,0x46,0x90,0x77,0xE2,0x88,0xE1,0x49,0xF1,0x29};
 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 */
@@ -54,10 +58,6 @@ enum _BMDDeckLinkConfigurationID {
 
     bmdDeckLinkConfigSwapSerialRxTx                              = 'ssrt',
 
-    /* Video Input/Output Flags */
-
-    bmdDeckLinkConfigUse1080pNotPsF                              = 'fpro',
-
     /* Video Input/Output Integers */
 
     bmdDeckLinkConfigHDMI3DPackingFormat                         = '3dpf',
@@ -78,6 +78,12 @@ enum _BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigLowLatencyVideoOutput                       = 'llvo',
     bmdDeckLinkConfigDownConversionOnAllAnalogOutput             = 'caao',
     bmdDeckLinkConfigSMPTELevelAOutput                           = 'smta',
+    bmdDeckLinkConfigRec2020Output                               = 'rec2',	// Ensure output is Rec.2020 colorspace
+    bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit   = 'SDQS',
+
+    /* Video Output Flags */
+
+    bmdDeckLinkConfigOutput1080pAsPsF                            = 'pfpr',
 
     /* Video Output Integers */
 
@@ -106,6 +112,10 @@ enum _BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigUseDedicatedLTCInput                        = 'dltc',	// Use timecode from LTC input instead of SDI stream
     bmdDeckLinkConfigSDIInput3DPayloadOverride                   = '3dds',
 
+    /* Video Input Flags */
+
+    bmdDeckLinkConfigCapture1080pAsPsF                           = 'cfpr',
+
     /* Video Input Integers */
 
     bmdDeckLinkConfigVideoInputConnection                        = 'vicn',
@@ -206,7 +216,7 @@ class IDeckLinkEncoderConfiguration;
 
 /* Interface IDeckLinkConfiguration - DeckLink Configuration interface */
 
-class IDeckLinkConfiguration : public IUnknown
+class BMD_PUBLIC IDeckLinkConfiguration : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0;
@@ -225,7 +235,7 @@ protected:
 
 /* Interface IDeckLinkEncoderConfiguration - DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput */
 
-class IDeckLinkEncoderConfiguration : public IUnknown
+class BMD_PUBLIC IDeckLinkEncoderConfiguration : public IUnknown
 {
 public:
     virtual HRESULT SetFlag (/* in */ BMDDeckLinkEncoderConfigurationID cfgID, /* in */ bool value) = 0;

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_2.h

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_5.h

@@ -7,14 +7,14 @@
 ** 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

+ 62 - 0
plugins/decklink/mac/decklink-sdk/DeckLinkAPIConfiguration_v10_9.h

@@ -0,0 +1,62 @@
+/* -LICENSE-START-
+** Copyright (c) 2017 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_9_H
+#define BMD_DECKLINKAPICONFIGURATION_v10_9_H
+
+#include "DeckLinkAPIConfiguration.h"
+
+// Interface ID Declarations
+
+BMD_CONST REFIID IID_IDeckLinkConfiguration_v10_9                       = /* CB71734A-FE37-4E8D-8E13-802133A1C3F2 */ {0xCB,0x71,0x73,0x4A,0xFE,0x37,0x4E,0x8D,0x8E,0x13,0x80,0x21,0x33,0xA1,0xC3,0xF2};
+
+//
+// Forward Declarations
+
+class IDeckLinkConfiguration_v10_9;
+
+/* Interface IDeckLinkConfiguration_v10_9 - DeckLink Configuration interface */
+
+class IDeckLinkConfiguration_v10_9 : 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_9 () {} // call Release method to drop reference count
+};
+
+
+#endif /* defined(BMD_DECKLINKAPICONFIGURATION_v10_9_H) */

+ 8 - 4
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDeckControl.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -149,7 +153,7 @@ class IDeckLinkDeckControl;
 
 /* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */
 
-class IDeckLinkDeckControlStatusCallback : public IUnknown
+class BMD_PUBLIC IDeckLinkDeckControlStatusCallback : public IUnknown
 {
 public:
     virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0;
@@ -163,7 +167,7 @@ protected:
 
 /* Interface IDeckLinkDeckControl - Deck Control main interface */
 
-class IDeckLinkDeckControl : public IUnknown
+class BMD_PUBLIC IDeckLinkDeckControl : public IUnknown
 {
 public:
     virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0;

+ 7 - 3
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDiscovery.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -50,7 +54,7 @@ class IDeckLink;
 
 /* Interface IDeckLink - represents a DeckLink device */
 
-class IDeckLink : public IUnknown
+class BMD_PUBLIC IDeckLink : public IUnknown
 {
 public:
     virtual HRESULT GetModelName (/* out */ CFStringRef *modelName) = 0;

+ 31 - 18
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -42,6 +42,7 @@ typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(v
 typedef IDeckLinkCocoaScreenPreviewCallback* (*CreateCocoaScreenPreviewFunc)(void*);
 typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
 typedef IDeckLinkDiscovery* (*CreateDeckLinkDiscoveryInstanceFunc)(void);
+typedef IDeckLinkVideoFrameAncillaryPackets* (*CreateVideoFrameAncillaryPacketsInstanceFunc)(void);
 
 static pthread_once_t						gDeckLinkOnceControl		= PTHREAD_ONCE_INIT;
 static CFBundleRef							gDeckLinkAPIBundleRef		= NULL;
@@ -51,6 +52,7 @@ static CreateOpenGLScreenPreviewHelperFunc	gCreateOpenGLPreviewFunc	= NULL;
 static CreateCocoaScreenPreviewFunc			gCreateCocoaPreviewFunc		= NULL;
 static CreateVideoConversionInstanceFunc	gCreateVideoConversionFunc	= NULL;
 static CreateDeckLinkDiscoveryInstanceFunc  gCreateDeckLinkDiscoveryFunc= NULL;
+static CreateVideoFrameAncillaryPacketsInstanceFunc	gCreateVideoFrameAncillaryPacketsFunc = NULL;
 
 
 void	InitDeckLinkAPI (void)
@@ -63,12 +65,13 @@ void	InitDeckLinkAPI (void)
 		gDeckLinkAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL);
 		if (gDeckLinkAPIBundleRef != NULL)
 		{
-			gCreateIteratorFunc = (CreateIteratorFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkIteratorInstance_0002"));
+			gCreateIteratorFunc = (CreateIteratorFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkIteratorInstance_0003"));
 			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"));
-            gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkDiscoveryInstance_0001"));
+            gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkDiscoveryInstance_0002"));
+            gCreateVideoFrameAncillaryPacketsFunc = (CreateVideoFrameAncillaryPacketsInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateVideoFrameAncillaryPacketsInstance_0001"));
 		}
 		CFRelease(bundleURL);
 	}
@@ -79,70 +82,80 @@ 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*		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();
 }
 
 IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void)
 {
 	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
-
+	
 	if (gCreateDeckLinkDiscoveryFunc == NULL)
 		return NULL;
-
+	
 	return gCreateDeckLinkDiscoveryFunc();
 }
 
+IDeckLinkVideoFrameAncillaryPackets* CreateVideoFrameAncillaryPacketsInstance (void)
+{
+	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+	
+	if (gCreateVideoFrameAncillaryPacketsFunc == NULL)
+		return NULL;
+	
+	return gCreateVideoFrameAncillaryPacketsFunc();
+}
+
 
 #define kBMDStreamingAPI_BundlePath "/Library/Application Support/Blackmagic Design/Streaming/BMDStreamingAPI.bundle"
 
@@ -164,7 +177,7 @@ void InitBMDStreamingAPI(void)
 		gBMDStreamingAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL);
 		if (gBMDStreamingAPIBundleRef != NULL)
 		{
-			gCreateDiscoveryFunc = (CreateDiscoveryFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingDiscoveryInstance_0001"));
+			gCreateDiscoveryFunc = (CreateDiscoveryFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingDiscoveryInstance_0002"));
 			gCreateNALParserFunc = (CreateNALParserFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingH264NALParser_0001"));
 		}
 

+ 193 - 0
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v10_8.cpp

@@ -0,0 +1,193 @@
+/* -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.cpp */
+
+#include "DeckLinkAPI.h"
+#include <pthread.h>
+
+#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* (*CreateIteratorFunc)(void);
+typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void);
+typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void);
+typedef IDeckLinkCocoaScreenPreviewCallback* (*CreateCocoaScreenPreviewFunc)(void*);
+typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void);
+typedef IDeckLinkDiscovery* (*CreateDeckLinkDiscoveryInstanceFunc)(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;
+static CreateDeckLinkDiscoveryInstanceFunc  gCreateDeckLinkDiscoveryFunc = 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_0002"));
+			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"));
+			gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkDiscoveryInstance_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*		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();
+}
+
+IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance(void)
+{
+	pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
+
+	if (gCreateDeckLinkDiscoveryFunc == NULL)
+		return NULL;
+
+	return gCreateDeckLinkDiscoveryFunc();
+}
+
+
+#define kBMDStreamingAPI_BundlePath "/Library/Application Support/Blackmagic Design/Streaming/BMDStreamingAPI.bundle"
+
+typedef IBMDStreamingDiscovery* (*CreateDiscoveryFunc)(void);
+typedef IBMDStreamingH264NALParser* (*CreateNALParserFunc)(void);
+
+static pthread_once_t      gBMDStreamingOnceControl = PTHREAD_ONCE_INIT;
+static CFBundleRef         gBMDStreamingAPIBundleRef = NULL;
+static CreateDiscoveryFunc gCreateDiscoveryFunc = NULL;
+static CreateNALParserFunc gCreateNALParserFunc = NULL;
+
+void InitBMDStreamingAPI(void)
+{
+	CFURLRef bundleURL;
+
+	bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kBMDStreamingAPI_BundlePath), kCFURLPOSIXPathStyle, true);
+	if (bundleURL != NULL)
+	{
+		gBMDStreamingAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL);
+		if (gBMDStreamingAPIBundleRef != NULL)
+		{
+			gCreateDiscoveryFunc = (CreateDiscoveryFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingDiscoveryInstance_0001"));
+			gCreateNALParserFunc = (CreateNALParserFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingH264NALParser_0001"));
+		}
+
+		CFRelease(bundleURL);
+	}
+}
+
+IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance()
+{
+	pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI);
+
+	if (gCreateDiscoveryFunc == NULL)
+		return NULL;
+
+	return gCreateDiscoveryFunc();
+}
+
+IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser()
+{
+	pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI);
+
+	if (gCreateNALParserFunc == NULL)
+		return NULL;
+
+	return gCreateNALParserFunc();
+}

+ 10 - 10
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v7_6.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -66,40 +66,40 @@ void	InitDeckLinkAPI_v7_6 (void)
 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();
 }
 

+ 13 - 13
plugins/decklink/mac/decklink-sdk/DeckLinkAPIDispatch_v8_0.cpp

@@ -7,14 +7,14 @@
 ** 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
@@ -75,57 +75,57 @@ 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();
 }
 

+ 58 - 12
plugins/decklink/mac/decklink-sdk/DeckLinkAPIModes.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -65,12 +69,12 @@ enum _BMDDisplayMode {
     bmdModeHD1080p25                                             = 'Hp25',
     bmdModeHD1080p2997                                           = 'Hp29',
     bmdModeHD1080p30                                             = 'Hp30',
-    bmdModeHD1080i50                                             = 'Hi50',
-    bmdModeHD1080i5994                                           = 'Hi59',
-    bmdModeHD1080i6000                                           = 'Hi60',	// N.B. This _really_ is 60.00 Hz.
     bmdModeHD1080p50                                             = 'Hp50',
     bmdModeHD1080p5994                                           = 'Hp59',
     bmdModeHD1080p6000                                           = 'Hp60',	// N.B. This _really_ is 60.00 Hz.
+    bmdModeHD1080i50                                             = 'Hi50',
+    bmdModeHD1080i5994                                           = 'Hi59',
+    bmdModeHD1080i6000                                           = 'Hi60',	// N.B. This _really_ is 60.00 Hz.
 
     /* HD 720 Modes */
 
@@ -78,19 +82,24 @@ enum _BMDDisplayMode {
     bmdModeHD720p5994                                            = 'hp59',
     bmdModeHD720p60                                              = 'hp60',
 
-    /* 2k Modes */
+    /* 2K Modes */
 
     bmdMode2k2398                                                = '2k23',
     bmdMode2k24                                                  = '2k24',
     bmdMode2k25                                                  = '2k25',
 
-    /* DCI Modes (output only) */
+    /* 2K DCI Modes */
 
     bmdMode2kDCI2398                                             = '2d23',
     bmdMode2kDCI24                                               = '2d24',
     bmdMode2kDCI25                                               = '2d25',
+    bmdMode2kDCI2997                                             = '2d29',
+    bmdMode2kDCI30                                               = '2d30',
+    bmdMode2kDCI50                                               = '2d50',
+    bmdMode2kDCI5994                                             = '2d59',
+    bmdMode2kDCI60                                               = '2d60',
 
-    /* 4k Modes */
+    /* 4K UHD Modes */
 
     bmdMode4K2160p2398                                           = '4k23',
     bmdMode4K2160p24                                             = '4k24',
@@ -101,11 +110,43 @@ enum _BMDDisplayMode {
     bmdMode4K2160p5994                                           = '4k59',
     bmdMode4K2160p60                                             = '4k60',
 
-    /* DCI Modes (output only) */
+    /* 4K DCI Modes */
 
     bmdMode4kDCI2398                                             = '4d23',
     bmdMode4kDCI24                                               = '4d24',
     bmdMode4kDCI25                                               = '4d25',
+    bmdMode4kDCI2997                                             = '4d29',
+    bmdMode4kDCI30                                               = '4d30',
+    bmdMode4kDCI50                                               = '4d50',
+    bmdMode4kDCI5994                                             = '4d59',
+    bmdMode4kDCI60                                               = '4d60',
+
+    /* 8K UHD Modes */
+
+    bmdMode8K4320p2398                                           = '8k23',
+    bmdMode8K4320p24                                             = '8k24',
+    bmdMode8K4320p25                                             = '8k25',
+    bmdMode8K4320p2997                                           = '8k29',
+    bmdMode8K4320p30                                             = '8k30',
+    bmdMode8K4320p50                                             = '8k50',
+    bmdMode8K4320p5994                                           = '8k59',
+    bmdMode8K4320p60                                             = '8k60',
+
+    /* 8K DCI Modes */
+
+    bmdMode8kDCI2398                                             = '8d23',
+    bmdMode8kDCI24                                               = '8d24',
+    bmdMode8kDCI25                                               = '8d25',
+    bmdMode8kDCI2997                                             = '8d29',
+    bmdMode8kDCI30                                               = '8d30',
+    bmdMode8kDCI50                                               = '8d50',
+    bmdMode8kDCI5994                                             = '8d59',
+    bmdMode8kDCI60                                               = '8d60',
+
+    /* RAW Modes for Cintel (input only) */
+
+    bmdModeCintelRAW                                             = 'rwci',	// Frame size up to 4096x3072, variable frame rate
+    bmdModeCintelCompressedRAW                                   = 'rwcc',	// Frame size up to 4096x3072, variable frame rate
 
     /* Special Modes */
 
@@ -140,7 +181,12 @@ enum _BMDPixelFormat {
 
     /* AVID DNxHR */
 
-    bmdFormatDNxHR                                               = 'AVdh'
+    bmdFormatDNxHR                                               = 'AVdh',
+
+    /* Cintel formats */
+
+    bmdFormat12BitRAWGRBG                                        = 'r12p',	// 12-bit RAW data for bayer pattern GRBG
+    bmdFormat12BitRAWJPEG                                        = 'r16p'	// 12-bit RAW data arranged in tiles and JPEG compressed
 };
 
 /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */
@@ -159,7 +205,7 @@ class IDeckLinkDisplayMode;
 
 /* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */
 
-class IDeckLinkDisplayModeIterator : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayModeIterator : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0;
@@ -170,7 +216,7 @@ protected:
 
 /* Interface IDeckLinkDisplayMode - represents a display mode */
 
-class IDeckLinkDisplayMode : public IUnknown
+class BMD_PUBLIC IDeckLinkDisplayMode : public IUnknown
 {
 public:
     virtual HRESULT GetName (/* out */ CFStringRef *name) = 0;

+ 21 - 17
plugins/decklink/mac/decklink-sdk/DeckLinkAPIStreaming.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 
@@ -92,8 +96,8 @@ enum _BMDStreamingEncodingFrameRate {
 typedef uint32_t BMDStreamingEncodingSupport;
 enum _BMDStreamingEncodingSupport {
     bmdStreamingEncodingModeNotSupported                         = 0,
-    bmdStreamingEncodingModeSupported,
-    bmdStreamingEncodingModeSupportedWithChanges
+    bmdStreamingEncodingModeSupported,                          
+    bmdStreamingEncodingModeSupportedWithChanges                
 };
 
 /* Enum BMDStreamingVideoCodec - Video codecs */
@@ -188,7 +192,7 @@ class IBMDStreamingH264NALParser;
 
 /* Interface IBMDStreamingDeviceNotificationCallback - Device notification callbacks. */
 
-class IBMDStreamingDeviceNotificationCallback : public IUnknown
+class BMD_PUBLIC IBMDStreamingDeviceNotificationCallback : public IUnknown
 {
 public:
     virtual HRESULT StreamingDeviceArrived (/* in */ IDeckLink* device) = 0;
@@ -201,7 +205,7 @@ protected:
 
 /* Interface IBMDStreamingH264InputCallback - H264 input callbacks. */
 
-class IBMDStreamingH264InputCallback : public IUnknown
+class BMD_PUBLIC IBMDStreamingH264InputCallback : public IUnknown
 {
 public:
     virtual HRESULT H264NALPacketArrived (/* in */ IBMDStreamingH264NALPacket* nalPacket) = 0;
@@ -217,7 +221,7 @@ protected:
 
 /* Interface IBMDStreamingDiscovery - Installs device notifications */
 
-class IBMDStreamingDiscovery : public IUnknown
+class BMD_PUBLIC IBMDStreamingDiscovery : public IUnknown
 {
 public:
     virtual HRESULT InstallDeviceNotifications (/* in */ IBMDStreamingDeviceNotificationCallback* theCallback) = 0;
@@ -229,7 +233,7 @@ protected:
 
 /* Interface IBMDStreamingVideoEncodingMode - Represents an encoded video mode. */
 
-class IBMDStreamingVideoEncodingMode : public IUnknown
+class BMD_PUBLIC IBMDStreamingVideoEncodingMode : public IUnknown
 {
 public:
     virtual HRESULT GetName (/* out */ CFStringRef *name) = 0;
@@ -252,7 +256,7 @@ protected:
 
 /* Interface IBMDStreamingMutableVideoEncodingMode - Represents a mutable encoded video mode. */
 
-class IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode
+class BMD_PUBLIC IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode
 {
 public:
     virtual HRESULT SetSourceRect (/* in */ uint32_t posX, /* in */ uint32_t posY, /* in */ uint32_t width, /* in */ uint32_t height) = 0;
@@ -268,7 +272,7 @@ protected:
 
 /* Interface IBMDStreamingVideoEncodingModePresetIterator - Enumerates encoding mode presets */
 
-class IBMDStreamingVideoEncodingModePresetIterator : public IUnknown
+class BMD_PUBLIC IBMDStreamingVideoEncodingModePresetIterator : public IUnknown
 {
 public:
     virtual HRESULT Next (/* out */ IBMDStreamingVideoEncodingMode** videoEncodingMode) = 0;
@@ -279,7 +283,7 @@ protected:
 
 /* Interface IBMDStreamingDeviceInput - Created by QueryInterface from IDeckLink */
 
-class IBMDStreamingDeviceInput : public IUnknown
+class BMD_PUBLIC IBMDStreamingDeviceInput : public IUnknown
 {
 public:
 
@@ -309,7 +313,7 @@ protected:
 
 /* Interface IBMDStreamingH264NALPacket - Represent an H.264 NAL packet */
 
-class IBMDStreamingH264NALPacket : public IUnknown
+class BMD_PUBLIC IBMDStreamingH264NALPacket : public IUnknown
 {
 public:
     virtual long GetPayloadSize (void) = 0;
@@ -324,7 +328,7 @@ protected:
 
 /* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */
 
-class IBMDStreamingAudioPacket : public IUnknown
+class BMD_PUBLIC IBMDStreamingAudioPacket : public IUnknown
 {
 public:
     virtual BMDStreamingAudioCodec GetCodec (void) = 0;
@@ -339,7 +343,7 @@ protected:
 
 /* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */
 
-class IBMDStreamingMPEG2TSPacket : public IUnknown
+class BMD_PUBLIC IBMDStreamingMPEG2TSPacket : public IUnknown
 {
 public:
     virtual long GetPayloadSize (void) = 0;
@@ -351,7 +355,7 @@ protected:
 
 /* Interface IBMDStreamingH264NALParser - For basic NAL parsing */
 
-class IBMDStreamingH264NALParser : public IUnknown
+class BMD_PUBLIC IBMDStreamingH264NALParser : public IUnknown
 {
 public:
     virtual HRESULT IsNALSequenceParameterSet (/* in */ IBMDStreamingH264NALPacket* nal) = 0;
@@ -366,8 +370,8 @@ protected:
 
 extern "C" {
 
-    IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance (void);
-    IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser (void);
+    IBMDStreamingDiscovery* BMD_PUBLIC CreateBMDStreamingDiscoveryInstance (void);
+    IBMDStreamingH264NALParser* BMD_PUBLIC CreateBMDStreamingH264NALParser (void);
 
 }
 

+ 9 - 4
plugins/decklink/mac/decklink-sdk/DeckLinkAPITypes.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,6 +37,10 @@
     #endif
 #endif
 
+#ifndef BMD_PUBLIC
+	#define BMD_PUBLIC
+#endif
+
 // Type Declarations
 
 typedef int64_t BMDTimeValue;
@@ -54,7 +58,8 @@ typedef uint32_t BMDTimecodeFlags;
 enum _BMDTimecodeFlags {
     bmdTimecodeFlagDefault                                       = 0,
     bmdTimecodeIsDropFrame                                       = 1 << 0,
-    bmdTimecodeFieldMark                                         = 1 << 1
+    bmdTimecodeFieldMark                                         = 1 << 1,
+    bmdTimecodeColorFrame                                        = 1 << 2
 };
 
 /* Enum BMDVideoConnection - Video connection types */
@@ -96,7 +101,7 @@ class IDeckLinkTimecode;
 
 /* Interface IDeckLinkTimecode - Used for video frame timecode representation. */
 
-class IDeckLinkTimecode : public IUnknown
+class BMD_PUBLIC IDeckLinkTimecode : public IUnknown
 {
 public:
     virtual BMDTimecodeBCD GetBCD (void) = 0;

+ 5 - 4
plugins/decklink/mac/decklink-sdk/DeckLinkAPIVersion.h

@@ -7,14 +7,14 @@
  * ** 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
@@ -30,7 +30,8 @@
 #ifndef __DeckLink_API_Version_h__
 #define __DeckLink_API_Version_h__
 
-#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a080000
-#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.8"
+#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a0b0000
+#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.11"
 
 #endif	// __DeckLink_API_Version_h__
+

+ 3 - 3
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_2.h

@@ -7,14 +7,14 @@
 ** 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
@@ -37,7 +37,7 @@
 typedef uint32_t BMDDeckLinkConfigurationID_v10_2;
 enum  _BMDDeckLinkConfigurationID_v10_2 {
     /* Video output flags */
-
+	
     bmdDeckLinkConfig3GBpsVideoOutput_v10_2                      = '3gbs',
 };
 

+ 45 - 0
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v10_9.h

@@ -0,0 +1,45 @@
+/* -LICENSE-START-
+** Copyright (c) 2017 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_9_H
+#define BMD_DECKLINKAPI_v10_9_H
+
+#include "DeckLinkAPI.h"
+
+// Type Declarations
+
+/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
+
+typedef uint32_t BMDDeckLinkConfigurationID_v10_9;
+enum _BMDDeckLinkConfigurationID_v10_9 {
+
+    /* Flags */
+
+    bmdDeckLinkConfig1080pNotPsF_v10_9                      = 'fpro',
+};
+
+#endif /* defined(BMD_DECKLINKAPI_v10_9_H) */

+ 18 - 18
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_1.h

@@ -7,14 +7,14 @@
 ** 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
@@ -102,37 +102,37 @@ 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;
@@ -145,17 +145,17 @@ 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;
@@ -188,7 +188,7 @@ 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;
 };
 

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_3.h

@@ -7,14 +7,14 @@
 ** 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

+ 18 - 18
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_6.h

@@ -7,14 +7,14 @@
 ** 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
@@ -356,49 +356,49 @@ 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;
 };

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v7_9.h

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_0.h

@@ -7,14 +7,14 @@
 ** 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

+ 4 - 4
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v8_1.h

@@ -7,14 +7,14 @@
  ** 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
@@ -59,7 +59,7 @@ public:
     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
 };
@@ -102,7 +102,7 @@ public:
     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
 };

+ 2 - 2
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_2.h

@@ -7,14 +7,14 @@
 ** 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

+ 18 - 18
plugins/decklink/mac/decklink-sdk/DeckLinkAPI_v9_9.h

@@ -7,14 +7,14 @@
 ** 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
@@ -47,51 +47,51 @@ 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
 };

+ 9 - 328
plugins/decklink/plugin-main.cpp

@@ -1,8 +1,5 @@
-#include "decklink.hpp"
-#include "decklink-device.hpp"
-#include "decklink-device-discovery.hpp"
-
 #include <obs-module.h>
+#include "decklink-devices.hpp"
 
 OBS_DECLARE_MODULE()
 OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US")
@@ -11,317 +8,11 @@ MODULE_EXPORT const char *obs_module_description(void)
 	return "Blackmagic DeckLink source";
 }
 
-#define DEVICE_HASH     "device_hash"
-#define DEVICE_NAME     "device_name"
-#define MODE_ID         "mode_id"
-#define MODE_NAME       "mode_name"
-#define CHANNEL_FORMAT  "channel_format"
-#define PIXEL_FORMAT    "pixel_format"
-#define COLOR_SPACE     "color_space"
-#define COLOR_RANGE     "color_range"
-#define BUFFERING       "buffering"
-#define DEACTIVATE_WNS  "deactivate_when_not_showing"
-
-#define TEXT_DEVICE                     obs_module_text("Device")
-#define TEXT_MODE                       obs_module_text("Mode")
-#define TEXT_PIXEL_FORMAT               obs_module_text("PixelFormat")
-#define TEXT_COLOR_SPACE                obs_module_text("ColorSpace")
-#define TEXT_COLOR_SPACE_DEFAULT        obs_module_text("ColorSpace.Default")
-#define TEXT_COLOR_RANGE                obs_module_text("ColorRange")
-#define TEXT_COLOR_RANGE_DEFAULT        obs_module_text("ColorRange.Default")
-#define TEXT_COLOR_RANGE_PARTIAL        obs_module_text("ColorRange.Partial")
-#define TEXT_COLOR_RANGE_FULL           obs_module_text("ColorRange.Full")
-#define TEXT_CHANNEL_FORMAT             obs_module_text("ChannelFormat")
-#define TEXT_CHANNEL_FORMAT_NONE        obs_module_text("ChannelFormat.None")
-#define TEXT_CHANNEL_FORMAT_2_0CH       obs_module_text("ChannelFormat.2_0ch")
-#define TEXT_CHANNEL_FORMAT_2_1CH       obs_module_text("ChannelFormat.2_1ch")
-#define TEXT_CHANNEL_FORMAT_4_0CH       obs_module_text("ChannelFormat.4_0ch")
-#define TEXT_CHANNEL_FORMAT_4_1CH       obs_module_text("ChannelFormat.4_1ch")
-#define TEXT_CHANNEL_FORMAT_5_1CH       obs_module_text("ChannelFormat.5_1ch")
-#define TEXT_CHANNEL_FORMAT_7_1CH       obs_module_text("ChannelFormat.7_1ch")
-#define TEXT_BUFFERING                  obs_module_text("Buffering")
-#define TEXT_DWNS                       obs_module_text("DeactivateWhenNotShowing")
-
-static DeckLinkDeviceDiscovery *deviceEnum = nullptr;
-
-static void decklink_enable_buffering(DeckLink *decklink, bool enabled)
-{
-	obs_source_t *source = decklink->GetSource();
-	obs_source_set_async_unbuffered(source, !enabled);
-	decklink->buffering = enabled;
-}
-
-static void decklink_deactivate_when_not_showing(DeckLink *decklink, bool dwns)
-{
-	decklink->dwns = dwns;
-}
-
-static void *decklink_create(obs_data_t *settings, obs_source_t *source)
-{
-	DeckLink *decklink = new DeckLink(source, deviceEnum);
-
-	obs_source_set_async_decoupled(source, true);
-	decklink_enable_buffering(decklink,
-			obs_data_get_bool(settings, BUFFERING));
-
-	obs_source_update(source, settings);
-	return decklink;
-}
-
-static void decklink_destroy(void *data)
-{
-	DeckLink *decklink = (DeckLink *)data;
-	delete decklink;
-}
-
-static void decklink_update(void *data, obs_data_t *settings)
-{
-	DeckLink *decklink = (DeckLink *)data;
-	const char *hash = obs_data_get_string(settings, DEVICE_HASH);
-	long long id = obs_data_get_int(settings, MODE_ID);
-	BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
-			PIXEL_FORMAT);
-	video_colorspace colorSpace = (video_colorspace)obs_data_get_int(settings,
-			COLOR_SPACE);
-	video_range_type colorRange = (video_range_type)obs_data_get_int(settings,
-			COLOR_RANGE);
-	int chFmtInt = (int)obs_data_get_int(settings, CHANNEL_FORMAT);
-
-	if (chFmtInt == 7) {
-		chFmtInt = SPEAKERS_5POINT1;
-	} else if (chFmtInt < SPEAKERS_UNKNOWN || chFmtInt > SPEAKERS_7POINT1) {
-		chFmtInt = 2;
-	}
-
-	speaker_layout channelFormat = (speaker_layout)chFmtInt;
-
-	decklink_enable_buffering(decklink,
-			obs_data_get_bool(settings, BUFFERING));
-
-	decklink_deactivate_when_not_showing(decklink,
-			obs_data_get_bool(settings, DEACTIVATE_WNS));
-
-	ComPtr<DeckLinkDevice> device;
-	device.Set(deviceEnum->FindByHash(hash));
-
-	decklink->SetPixelFormat(pixelFormat);
-	decklink->SetColorSpace(colorSpace);
-	decklink->SetColorRange(colorRange);
-	decklink->SetChannelFormat(channelFormat);
-	decklink->Activate(device, id);
-	decklink->hash = std::string(hash);
-}
-
-static void decklink_show(void *data)
-{
-	DeckLink *decklink = (DeckLink *)data;
-	obs_source_t *source = decklink->GetSource();
-	bool showing = obs_source_showing(source);
-	if (decklink->dwns && showing && !decklink->Capturing()) {
-		ComPtr<DeckLinkDevice> device;
-		device.Set(deviceEnum->FindByHash(decklink->hash.c_str()));
-
-		decklink->Activate(device, decklink->id);
-	}
-}
-
-static void decklink_hide(void *data)
-{
-	DeckLink *decklink = (DeckLink *)data;
-	obs_source_t *source = decklink->GetSource();
-	bool showing = obs_source_showing(source);
-	if (decklink->dwns && showing)
-		decklink->Deactivate();
-
-}
-
-static void decklink_get_defaults(obs_data_t *settings)
-{
-	obs_data_set_default_bool(settings, BUFFERING, false);
-	obs_data_set_default_int(settings, PIXEL_FORMAT, bmdFormat8BitYUV);
-	obs_data_set_default_int(settings, COLOR_SPACE, VIDEO_CS_DEFAULT);
-	obs_data_set_default_int(settings, COLOR_RANGE, VIDEO_RANGE_DEFAULT);
-	obs_data_set_default_int(settings, CHANNEL_FORMAT, SPEAKERS_STEREO);
-}
-
-static const char *decklink_get_name(void*)
-{
-	return obs_module_text("BlackmagicDevice");
-}
-
-static bool decklink_device_changed(obs_properties_t *props,
-		obs_property_t *list, obs_data_t *settings)
-{
-	const char *name = obs_data_get_string(settings, DEVICE_NAME);
-	const char *hash = obs_data_get_string(settings, DEVICE_HASH);
-	const char *mode = obs_data_get_string(settings, MODE_NAME);
-	long long modeId = obs_data_get_int(settings, MODE_ID);
-
-	size_t itemCount = obs_property_list_item_count(list);
-	bool itemFound = false;
-
-	for (size_t i = 0; i < itemCount; i++) {
-		const char *curHash = obs_property_list_item_string(list, i);
-		if (strcmp(hash, curHash) == 0) {
-			itemFound = true;
-			break;
-		}
-	}
-
-	if (!itemFound) {
-		obs_property_list_insert_string(list, 0, name, hash);
-		obs_property_list_item_disable(list, 0, true);
-	}
-
-	obs_property_t *modeList = obs_properties_get(props, MODE_ID);
-	obs_property_t *channelList = obs_properties_get(props, CHANNEL_FORMAT);
-
-	obs_property_list_clear(modeList);
-
-	obs_property_list_clear(channelList);
-	obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_NONE,
-			SPEAKERS_UNKNOWN);
-	obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_0CH,
-			SPEAKERS_STEREO);
-
-	ComPtr<DeckLinkDevice> device;
-	device.Set(deviceEnum->FindByHash(hash));
-
-	if (!device) {
-		obs_property_list_add_int(modeList, mode, modeId);
-		obs_property_list_item_disable(modeList, 0, true);
-	} else {
-		const std::vector<DeckLinkDeviceMode*> &modes =
-			device->GetModes();
-
-		for (DeckLinkDeviceMode *mode : modes) {
-			obs_property_list_add_int(modeList,
-					mode->GetName().c_str(),
-					mode->GetId());
-		}
-
-		if (device->GetMaxChannel() >= 8) {
-			obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_1CH,
-				SPEAKERS_2POINT1);
-			obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_4_0CH,
-					SPEAKERS_4POINT0);
-			obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_4_1CH,
-				SPEAKERS_4POINT1);
-			obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_5_1CH,
-					SPEAKERS_5POINT1);
-			obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_7_1CH,
-					SPEAKERS_7POINT1);
-		}
-	}
-
-	return true;
-}
-
-static void fill_out_devices(obs_property_t *list)
-{
-	deviceEnum->Lock();
-
-	const std::vector<DeckLinkDevice*> &devices = deviceEnum->GetDevices();
-	for (DeckLinkDevice *device : devices) {
-		obs_property_list_add_string(list,
-				device->GetDisplayName().c_str(),
-				device->GetHash().c_str());
-	}
-
-	deviceEnum->Unlock();
-}
+extern struct obs_source_info create_decklink_source_info();
+struct obs_source_info decklink_source_info;
 
-static bool color_format_changed(obs_properties_t *props,
-		obs_property_t *list, obs_data_t *settings);
-
-static bool mode_id_changed(obs_properties_t *props,
-		obs_property_t *list, obs_data_t *settings)
-{
-	long long id = obs_data_get_int(settings, MODE_ID);
-
-	list = obs_properties_get(props, PIXEL_FORMAT);
-	obs_property_set_visible(list, id != MODE_ID_AUTO);
-
-	return color_format_changed(props, nullptr, settings);
-}
-
-static bool color_format_changed(obs_properties_t *props,
-		obs_property_t *list, obs_data_t *settings)
-{
-	long long id = obs_data_get_int(settings, MODE_ID);
-	BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
-			PIXEL_FORMAT);
-
-	list = obs_properties_get(props, COLOR_SPACE);
-	obs_property_set_visible(list,
-			id != MODE_ID_AUTO && pixelFormat == bmdFormat8BitYUV);
-
-	list = obs_properties_get(props, COLOR_RANGE);
-	obs_property_set_visible(list,
-			id == MODE_ID_AUTO || pixelFormat == bmdFormat8BitYUV);
-
-	return true;
-}
-
-static obs_properties_t *decklink_get_properties(void *data)
-{
-	obs_properties_t *props = obs_properties_create();
-
-	obs_property_t *list = obs_properties_add_list(props, DEVICE_HASH,
-			TEXT_DEVICE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
-	obs_property_set_modified_callback(list, decklink_device_changed);
-
-	fill_out_devices(list);
-
-	list = obs_properties_add_list(props, MODE_ID, TEXT_MODE,
-			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
-	obs_property_set_modified_callback(list, mode_id_changed);
-
-	list = obs_properties_add_list(props, PIXEL_FORMAT,
-			TEXT_PIXEL_FORMAT, OBS_COMBO_TYPE_LIST,
-			OBS_COMBO_FORMAT_INT);
-	obs_property_set_modified_callback(list, color_format_changed);
-
-	obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
-	obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
-
-	list = obs_properties_add_list(props, COLOR_SPACE, TEXT_COLOR_SPACE,
-			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
-	obs_property_list_add_int(list, TEXT_COLOR_SPACE_DEFAULT, VIDEO_CS_DEFAULT);
-	obs_property_list_add_int(list, "BT.601", VIDEO_CS_601);
-	obs_property_list_add_int(list, "BT.709", VIDEO_CS_709);
-
-	list = obs_properties_add_list(props, COLOR_RANGE, TEXT_COLOR_RANGE,
-			OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
-	obs_property_list_add_int(list, TEXT_COLOR_RANGE_DEFAULT, VIDEO_RANGE_DEFAULT);
-	obs_property_list_add_int(list, TEXT_COLOR_RANGE_PARTIAL, VIDEO_RANGE_PARTIAL);
-	obs_property_list_add_int(list, TEXT_COLOR_RANGE_FULL, VIDEO_RANGE_FULL);
-
-	list = obs_properties_add_list(props, CHANNEL_FORMAT,
-			TEXT_CHANNEL_FORMAT, OBS_COMBO_TYPE_LIST,
-			OBS_COMBO_FORMAT_INT);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_NONE,
-			SPEAKERS_UNKNOWN);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_0CH,
-			SPEAKERS_STEREO);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_1CH,
-			SPEAKERS_2POINT1);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_0CH,
-			SPEAKERS_4POINT0);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_4_1CH,
-			SPEAKERS_4POINT1);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_5_1CH,
-			SPEAKERS_5POINT1);
-	obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_7_1CH,
-			SPEAKERS_7POINT1);
-
-	obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING);
-
-	obs_properties_add_bool(props, DEACTIVATE_WNS, TEXT_DWNS);
-
-	UNUSED_PARAMETER(data);
-	return props;
-}
+extern struct obs_output_info create_decklink_output_info();
+struct obs_output_info decklink_output_info;
 
 bool obs_module_load(void)
 {
@@ -329,21 +20,11 @@ bool obs_module_load(void)
 	if (!deviceEnum->Init())
 		return true;
 
-	struct obs_source_info info = {};
-	info.id             = "decklink-input";
-	info.type           = OBS_SOURCE_TYPE_INPUT;
-	info.output_flags   = OBS_SOURCE_ASYNC_VIDEO | OBS_SOURCE_AUDIO |
-	                      OBS_SOURCE_DO_NOT_DUPLICATE;
-	info.create         = decklink_create;
-	info.destroy        = decklink_destroy;
-	info.get_defaults   = decklink_get_defaults;
-	info.get_name       = decklink_get_name;
-	info.get_properties = decklink_get_properties;
-	info.update         = decklink_update;
-	info.show           = decklink_show;
-	info.hide           = decklink_hide;
+	decklink_source_info = create_decklink_source_info();
+	obs_register_source(&decklink_source_info);
 
-	obs_register_source(&info);
+	decklink_output_info = create_decklink_output_info();
+	obs_register_output(&decklink_output_info);
 
 	return true;
 }

+ 19 - 6
plugins/decklink/win/CMakeLists.txt

@@ -16,8 +16,12 @@ set(win-decklink-sdk_HEADERS
 	)
 
 set(win-decklink_HEADERS
+	../decklink-devices.hpp
+	../DecklinkOutput.hpp
+	../const.h
 	../platform.hpp
-	../decklink.hpp
+	../DecklinkInput.hpp
+	../DecklinkBase.h
 	../decklink-device-instance.hpp
 	../decklink-device-discovery.hpp
 	../decklink-device.hpp
@@ -28,25 +32,34 @@ set(win-decklink_HEADERS
 
 set(win-decklink_SOURCES
 	../plugin-main.cpp
-	../decklink.cpp
+	../decklink-devices.cpp
+	../DecklinkOutput.cpp
+	../decklink-source.cpp
+	../decklink-output.cpp
+	../DecklinkInput.cpp
+	../DecklinkBase.cpp
 	../decklink-device-instance.cpp
 	../decklink-device-discovery.cpp
 	../decklink-device.cpp
 	../decklink-device-mode.cpp
 	../audio-repack.c
-	platform.cpp)
+	platform.cpp
+	)
 
 add_idl_files(win-decklink-sdk_GENERATED_FILES
-	${win-decklink-sdk_IDLS})
+	${win-decklink-sdk_IDLS}
+	)
 
 include_directories(
-	${CMAKE_CURRENT_BINARY_DIR})
+	${CMAKE_CURRENT_BINARY_DIR}
+)
 
 add_library(win-decklink MODULE
 	${win-decklink_SOURCES}
 	${win-decklink_HEADERS}
 	${win-decklink-sdk_HEADERS}
-	${win-decklink-sdk_GENERATED_FILES})
+	${win-decklink-sdk_GENERATED_FILES}
+	)
 
 target_link_libraries(win-decklink
 	libobs)

+ 167 - 49
plugins/decklink/win/decklink-sdk/DeckLinkAPI.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -95,9 +95,11 @@ typedef [v1_enum] enum	_BMDPacketType {
     bmdFrameFlagDefault                                          = 0,
     bmdFrameFlagFlipVertical                                     = 1 << 0,
     bmdFrameContainsHDRMetadata                                  = 1 << 1,
+    bmdFrameContainsCintelMetadata                               = 1 << 2,
 
     /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */
 
+    bmdFrameCapturedAsPsF                                        = 1 << 30,
     bmdFrameHasNoInputSource                                     = 1 << 31
 };
 
@@ -136,10 +138,10 @@ typedef [v1_enum] enum	_BMDPacketType {
 /* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */
 
 typedef [v1_enum] enum	_BMDOutputFrameCompletionResult {
-    bmdOutputFrameCompleted,
-    bmdOutputFrameDisplayedLate,
-    bmdOutputFrameDropped,
-    bmdOutputFrameFlushed
+    bmdOutputFrameCompleted,                                    
+    bmdOutputFrameDisplayedLate,                                
+    bmdOutputFrameDropped,                                      
+    bmdOutputFrameFlushed                                       
 } BMDOutputFrameCompletionResult;
 
 /* Enum BMDReferenceStatus - GenLock input status */
@@ -171,19 +173,27 @@ typedef [v1_enum] enum	_BMDAudioSampleType {
 /* Enum BMDAudioOutputStreamType - Audio output stream type */
 
 typedef [v1_enum] enum	_BMDAudioOutputStreamType {
-    bmdAudioOutputStreamContinuous,
-    bmdAudioOutputStreamContinuousDontResample,
-    bmdAudioOutputStreamTimestamped
+    bmdAudioOutputStreamContinuous,                             
+    bmdAudioOutputStreamContinuousDontResample,                 
+    bmdAudioOutputStreamTimestamped                             
 } BMDAudioOutputStreamType;
 
 /* Enum BMDDisplayModeSupport - Output mode supported flags */
 
 typedef [v1_enum] enum	_BMDDisplayModeSupport {
     bmdDisplayModeNotSupported                                   = 0,
-    bmdDisplayModeSupported,
-    bmdDisplayModeSupportedWithConversion
+    bmdDisplayModeSupported,                                    
+    bmdDisplayModeSupportedWithConversion                       
 } BMDDisplayModeSupport;
 
+/* Enum BMDAncillaryPacketFormat - Ancillary packet format */
+
+typedef [v1_enum] enum	_BMDAncillaryPacketFormat {
+    bmdAncillaryPacketFormatUInt8                                = /* 'ui08' */ 0x75693038,
+    bmdAncillaryPacketFormatUInt16                               = /* 'ui16' */ 0x75693136,
+    bmdAncillaryPacketFormatYCbCr10                              = /* 'v210' */ 0x76323130
+} BMDAncillaryPacketFormat;
+
 /* Enum BMDTimecodeFormat - Timecode formats for frame metadata */
 
 typedef [v1_enum] enum	_BMDTimecodeFormat {
@@ -296,6 +306,37 @@ typedef [v1_enum] enum	_BMDDeviceInterface {
 
 typedef [v1_enum] enum	_BMDDeckLinkFrameMetadataID {
     bmdDeckLinkFrameMetadataHDRElectroOpticalTransferFunc        = /* 'eotf' */ 0x656F7466,	// EOTF in range 0-7 as per CEA 861.3
+    bmdDeckLinkFrameMetadataCintelFilmType                       = /* 'cfty' */ 0x63667479,	// Current film type
+    bmdDeckLinkFrameMetadataCintelFilmGauge                      = /* 'cfga' */ 0x63666761,	// Current film gauge
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedHorizontal       = /* 'odfh' */ 0x6F646668,	// Horizontal offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelOffsetDetectedVertical         = /* 'odfv' */ 0x6F646676,	// Vertical offset (pixels) detected in image
+    bmdDeckLinkFrameMetadataCintelKeykodeLow                     = /* 'ckkl' */ 0x636B6B6C,	// Raw keykode value - low 64 bits
+    bmdDeckLinkFrameMetadataCintelKeykodeHigh                    = /* 'ckkh' */ 0x636B6B68,	// Raw keykode value - high 64 bits
+    bmdDeckLinkFrameMetadataCintelTile1Size                      = /* 'ct1s' */ 0x63743173,	// Size in bytes of compressed raw tile 1
+    bmdDeckLinkFrameMetadataCintelTile2Size                      = /* 'ct2s' */ 0x63743273,	// Size in bytes of compressed raw tile 2
+    bmdDeckLinkFrameMetadataCintelTile3Size                      = /* 'ct3s' */ 0x63743373,	// Size in bytes of compressed raw tile 3
+    bmdDeckLinkFrameMetadataCintelTile4Size                      = /* 'ct4s' */ 0x63743473,	// Size in bytes of compressed raw tile 4
+    bmdDeckLinkFrameMetadataCintelImageWidth                     = /* 'IWPx' */ 0x49575078,	// Width in pixels of image
+    bmdDeckLinkFrameMetadataCintelImageHeight                    = /* 'IHPx' */ 0x49485078,	// Height in pixels of image
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInRed          = /* 'mrir' */ 0x6D726972,	// Red in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInRed        = /* 'mgir' */ 0x6D676972,	// Green in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInRed         = /* 'mbir' */ 0x6D626972,	// Blue in red linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInGreen        = /* 'mrig' */ 0x6D726967,	// Red in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInGreen      = /* 'mgig' */ 0x6D676967,	// Green in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInGreen       = /* 'mbig' */ 0x6D626967,	// Blue in green linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingRedInBlue         = /* 'mrib' */ 0x6D726962,	// Red in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingGreenInBlue       = /* 'mgib' */ 0x6D676962,	// Green in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLinearMaskingBlueInBlue        = /* 'mbib' */ 0x6D626962,	// Blue in blue linear masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInRed             = /* 'mlrr' */ 0x6D6C7272,	// Red in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInRed           = /* 'mlgr' */ 0x6D6C6772,	// Green in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInRed            = /* 'mlbr' */ 0x6D6C6272,	// Blue in red log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInGreen           = /* 'mlrg' */ 0x6D6C7267,	// Red in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInGreen         = /* 'mlgg' */ 0x6D6C6767,	// Green in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInGreen          = /* 'mlbg' */ 0x6D6C6267,	// Blue in green log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingRedInBlue            = /* 'mlrb' */ 0x6D6C7262,	// Red in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingGreenInBlue          = /* 'mlgb' */ 0x6D6C6762,	// Green in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelLogMaskingBlueInBlue           = /* 'mlbb' */ 0x6D6C6262,	// Blue in blue log masking parameter
+    bmdDeckLinkFrameMetadataCintelFilmFrameRate                  = /* 'cffr' */ 0x63666672,	// Film frame rate
     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
@@ -307,7 +348,15 @@ typedef [v1_enum] enum	_BMDDeckLinkFrameMetadataID {
     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
+    bmdDeckLinkFrameMetadataHDRMaximumFrameAverageLightLevel     = /* 'fall' */ 0x66616C6C,	// Maximum Frame Average Light Level in range 1 cd/m2 - 65535 cd/m2
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyHorizontal        = /* 'otah' */ 0x6F746168,	// Horizontal offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelOffsetToApplyVertical          = /* 'otav' */ 0x6F746176,	// Vertical offset (pixels) to be applied to image
+    bmdDeckLinkFrameMetadataCintelGainRed                        = /* 'LfRd' */ 0x4C665264,	// Red gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainGreen                      = /* 'LfGr' */ 0x4C664772,	// Green gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelGainBlue                       = /* 'LfBl' */ 0x4C66426C,	// Blue gain parameter to apply after log
+    bmdDeckLinkFrameMetadataCintelLiftRed                        = /* 'GnRd' */ 0x476E5264,	// Red lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftGreen                      = /* 'GnGr' */ 0x476E4772,	// Green lift parameter to apply after log and gain
+    bmdDeckLinkFrameMetadataCintelLiftBlue                       = /* 'GnBl' */ 0x476E426C	// Blue lift parameter to apply after log and gain
 } BMDDeckLinkFrameMetadataID;
 
 /* Enum BMDDuplexMode - Duplex for configurable ports */
@@ -347,18 +396,19 @@ typedef [v1_enum] enum	_BMDDeckLinkAttributeID {
     /* Integers */
 
     BMDDeckLinkMaximumAudioChannels                              = /* 'mach' */ 0x6D616368,
-    BMDDeckLinkMaximumAnalogAudioChannels                        = /* 'aach' */ 0x61616368,
+    BMDDeckLinkMaximumAnalogAudioInputChannels                   = /* 'iach' */ 0x69616368,
+    BMDDeckLinkMaximumAnalogAudioOutputChannels                  = /* 'aach' */ 0x61616368,
     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,
+    BMDDeckLinkVideoOutputConnections                            = /* 'vocn' */ 0x766F636E,	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkVideoInputConnections                             = /* 'vicn' */ 0x7669636E,	// Returns a BMDVideoConnection bit field
+    BMDDeckLinkAudioOutputConnections                            = /* 'aocn' */ 0x616F636E,	// Returns a BMDAudioConnection bit field
+    BMDDeckLinkAudioInputConnections                             = /* 'aicn' */ 0x6169636E,	// Returns a BMDAudioConnection bit field
     BMDDeckLinkVideoIOSupport                                    = /* 'vios' */ 0x76696F73,	// Returns a BMDVideoIOSupport bit field
-    BMDDeckLinkDeckControlConnections                            = /* 'dccn' */ 0x6463636E,
+    BMDDeckLinkDeckControlConnections                            = /* 'dccn' */ 0x6463636E,	// Returns a BMDDeckControlConnection bit field
     BMDDeckLinkDeviceInterface                                   = /* 'dbus' */ 0x64627573,	// Returns a BMDDeviceInterface
     BMDDeckLinkAudioInputRCAChannelCount                         = /* 'airc' */ 0x61697263,
     BMDDeckLinkAudioInputXLRChannelCount                         = /* 'aixc' */ 0x61697863,
@@ -410,11 +460,14 @@ typedef [v1_enum] enum	_BMDDeckLinkStatusID {
     bmdDeckLinkStatusReferenceSignalFlags                        = /* 'reff' */ 0x72656666,
     bmdDeckLinkStatusDuplexMode                                  = /* 'dupx' */ 0x64757078,
     bmdDeckLinkStatusBusy                                        = /* 'busy' */ 0x62757379,
+    bmdDeckLinkStatusInterchangeablePanelType                    = /* 'icpt' */ 0x69637074,
+    bmdDeckLinkStatusDeviceTemperature                           = /* 'dtmp' */ 0x64746D70,
 
     /* Flags */
 
     bmdDeckLinkStatusVideoInputSignalLocked                      = /* 'visl' */ 0x7669736C,
-    bmdDeckLinkStatusReferenceSignalLocked                       = /* 'refl' */ 0x7265666C
+    bmdDeckLinkStatusReferenceSignalLocked                       = /* 'refl' */ 0x7265666C,
+    bmdDeckLinkStatusReceivedEDID                                = /* 'edid' */ 0x65646964
 } BMDDeckLinkStatusID;
 
 /* Enum BMDDeckLinkVideoStatusFlags -  */
@@ -433,6 +486,13 @@ typedef [v1_enum] enum	_BMDDuplexStatus {
     bmdDuplexStatusInactive                                      = /* 'inac' */ 0x696E6163
 } BMDDuplexStatus;
 
+/* Enum BMDPanelType - The type of interchangeable panel */
+
+typedef [v1_enum] enum	_BMDPanelType {
+    bmdPanelNotDetected                                          = /* 'npnl' */ 0x6E706E6C,
+    bmdPanelTeranexMiniSmartPanel                                = /* 'tmsm' */ 0x746D736D
+} BMDPanelType;
+
 /* Enum BMDDeviceBusyState - Current device busy state */
 
 [v1_enum] enum	_BMDDeviceBusyState {
@@ -482,6 +542,9 @@ interface IDeckLinkMutableVideoFrame;
 interface IDeckLinkVideoFrame3DExtensions;
 interface IDeckLinkVideoFrameMetadataExtensions;
 interface IDeckLinkVideoInputFrame;
+interface IDeckLinkAncillaryPacket;
+interface IDeckLinkAncillaryPacketIterator;
+interface IDeckLinkVideoFrameAncillaryPackets;
 interface IDeckLinkVideoFrameAncillary;
 interface IDeckLinkEncoderPacket;
 interface IDeckLinkEncoderVideoPacket;
@@ -542,7 +605,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(B36EB6E7-9D29-4AA8-92EF-843B87A289E8),
-    local,
+    local, 
     helpstring("Memory allocator for video frames.")
 ] interface IDeckLinkMemoryAllocator : IUnknown
 {
@@ -558,7 +621,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(403C681B-7F46-4A12-B993-2BB127084EE6),
-    local,
+    local, 
     helpstring("Optional callback to allow audio samples to be pulled as required.")
 ] interface IDeckLinkAudioOutputCallback : IUnknown
 {
@@ -595,7 +658,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564),
-    local,
+    local, 
     helpstring("Created by QueryInterface from IDeckLink.")
 ] interface IDeckLinkOutput : IUnknown
 {
@@ -611,7 +674,7 @@ interface IDeckLinkDiscovery;
 
     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 CreateAncillaryData([in] BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer); // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 
     HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);
     HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, [in] BMDTimeValue displayTime, [in] BMDTimeValue displayDuration, [in] BMDTimeScale timeScale);
@@ -729,7 +792,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(3F716FE0-F023-4111-BE5D-EF4414C05B17),
-    local,
+    local, 
     helpstring("Interface to encapsulate a video frame; can be caller-implemented.")
 ] interface IDeckLinkVideoFrame : IUnknown
 {
@@ -741,7 +804,7 @@ interface IDeckLinkDiscovery;
     HRESULT GetBytes([out] void **buffer);
 
     HRESULT GetTimecode([in] BMDTimecodeFormat format, [out] IDeckLinkTimecode **timecode);
-    HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary);
+    HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary); // Use of IDeckLinkVideoFrameAncillaryPackets is preferred
 };
 
 /* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */
@@ -749,7 +812,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(69E2639F-40DA-4E19-B6F2-20ACE815C390),
-    local,
+    local, 
     helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")
 ] interface IDeckLinkMutableVideoFrame : IDeckLinkVideoFrame
 {
@@ -766,7 +829,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7),
-    local,
+    local, 
     helpstring("Optional interface implemented on IDeckLinkVideoFrame to support 3D frames")
 ] interface IDeckLinkVideoFrame3DExtensions : IUnknown
 {
@@ -779,7 +842,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(D5973DC9-6432-46D0-8F0B-2496F8A1238F),
-    local,
+    local, 
     helpstring("Optional interface implemented on IDeckLinkVideoFrame to support frame metadata such as HDMI HDR information")
 ] interface IDeckLinkVideoFrameMetadataExtensions : IUnknown
 {
@@ -794,7 +857,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(05CFE374-537C-4094-9A57-680525118F44),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
 ] interface IDeckLinkVideoInputFrame : IDeckLinkVideoFrame
 {
@@ -802,17 +865,61 @@ interface IDeckLinkDiscovery;
     HRESULT GetHardwareReferenceTimestamp([in] BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration);
 };
 
-/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+/* Interface IDeckLinkAncillaryPacket - On output, user needs to implement this interface */
 
 [
     object,
-    uuid(732E723C-D1A4-4E29-9E8E-4A88797A0004),
-    local,
+    uuid(CC5BBF7E-029C-4D3B-9158-6000EF5E3670),
+    helpstring("On output, user needs to implement this interface")
+] interface IDeckLinkAncillaryPacket : IUnknown
+{
+
+    HRESULT GetBytes([in] BMDAncillaryPacketFormat format /* For output, only one format need be offered */, [out] const void **data /* Optional */, [out] unsigned int *size /* Optional */);
+    unsigned char GetDID(void);
+    unsigned char GetSDID(void);
+    unsigned int GetLineNumber(void); // On output, zero is auto
+    unsigned char GetDataStreamIndex(void); // Usually zero. Can only be 1 if non-SD and the first data stream is completely full
+};
+
+/* Interface IDeckLinkAncillaryPacketIterator - Enumerates ancillary packets */
+
+[
+    object,
+    uuid(3FC8994B-88FB-4C17-968F-9AAB69D964A7),
+    helpstring("Enumerates ancillary packets")
+] interface IDeckLinkAncillaryPacketIterator : IUnknown
+{
+    HRESULT Next([out] IDeckLinkAncillaryPacket **packet);
+};
+
+/* Interface IDeckLinkVideoFrameAncillaryPackets - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+
+[
+    object,
+    uuid(6C186C0F-459E-41D8-AEE2-4812D81AEE68),
+    local, 
     helpstring("Obtained through QueryInterface() on an IDeckLinkVideoFrame object.")
+] interface IDeckLinkVideoFrameAncillaryPackets : IUnknown
+{
+
+    HRESULT GetPacketIterator([out] IDeckLinkAncillaryPacketIterator **iterator);
+    HRESULT GetFirstPacketByID([in] unsigned char DID, [in] unsigned char SDID, [out] IDeckLinkAncillaryPacket **packet);
+    HRESULT AttachPacket([in] IDeckLinkAncillaryPacket *packet); // Implement IDeckLinkAncillaryPacket to output your own
+    HRESULT DetachPacket([in] IDeckLinkAncillaryPacket *packet);
+    HRESULT DetachAllPackets(void);
+};
+
+/* Interface IDeckLinkVideoFrameAncillary - Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */
+
+[
+    object,
+    uuid(732E723C-D1A4-4E29-9E8E-4A88797A0004),
+    local, 
+    helpstring("Use of IDeckLinkVideoFrameAncillaryPackets is preferred. Obtained through QueryInterface() on an IDeckLinkVideoFrame object.")
 ] interface IDeckLinkVideoFrameAncillary : IUnknown
 {
 
-    HRESULT GetBufferForVerticalBlankingLine([in] unsigned int lineNumber, [out] void **buffer);
+    HRESULT GetBufferForVerticalBlankingLine([in] unsigned int lineNumber, [out] void **buffer); // Pixels/rowbytes is same as display mode, except for above HD where it's 1920 pixels for UHD modes and 2048 pixels for DCI modes
     BMDPixelFormat GetPixelFormat(void);
     BMDDisplayMode GetDisplayMode(void);
 };
@@ -822,7 +929,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(B693F36C-316E-4AF1-B6C2-F389A4BCA620),
-    local,
+    local, 
     helpstring("Interface to encapsulate an encoded packet.")
 ] interface IDeckLinkEncoderPacket : IUnknown
 {
@@ -837,7 +944,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(4E7FD944-E8C7-4EAC-B8C0-7B77F80F5AE0),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkEncoderInput video packet arrival callback.")
 ] interface IDeckLinkEncoderVideoPacket : IDeckLinkEncoderPacket
 {
@@ -852,7 +959,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(49E8EDC8-693B-4E14-8EF6-12C658F5A07A),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkEncoderInput audio packet arrival callback.")
 ] interface IDeckLinkEncoderAudioPacket : IDeckLinkEncoderPacket
 {
@@ -864,7 +971,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(639C8E0B-68D5-4BDE-A6D4-95F3AEAFF2E7),
-    local,
+    local, 
     helpstring("Obtained through QueryInterface() on an IDeckLinkEncoderVideoPacket object")
 ] interface IDeckLinkH265NALPacket : IDeckLinkEncoderVideoPacket
 {
@@ -878,7 +985,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(E43D5870-2894-11DE-8C30-0800200C9A66),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkInput callback.")
 ] interface IDeckLinkAudioInputPacket : IUnknown
 {
@@ -892,7 +999,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438),
-    local,
+    local, 
     helpstring("Screen preview callback")
 ] interface IDeckLinkScreenPreviewCallback : IUnknown
 {
@@ -904,7 +1011,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(504E2209-CAC7-4C1A-9FB4-C5BB6274D22F),
-    local,
+    local, 
     helpstring("Created with CoCreateInstance().")
 ] interface IDeckLinkGLScreenPreviewHelper : IUnknown
 {
@@ -922,7 +1029,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(2094B522-D1A1-40C0-9AC7-1C012218EF02),
-    local,
+    local, 
     helpstring("Created with CoCreateInstance().")
 ] interface IDeckLinkDX9ScreenPreviewHelper : IUnknown
 {
@@ -937,7 +1044,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(b002a1ec-070d-4288-8289-bd5d36e5ff0d),
-    local,
+    local, 
     helpstring("DeckLink Notification Callback Interface")
 ] interface IDeckLinkNotificationCallback : IUnknown
 {
@@ -949,7 +1056,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(0a1fb207-e215-441b-9b19-6fa1575946c5),
-    local,
+    local, 
     helpstring("DeckLink Notification interface")
 ] interface IDeckLinkNotification : IUnknown
 {
@@ -962,7 +1069,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(ABC11843-D966-44CB-96E2-A1CB5D3135C4),
-    local,
+    local, 
     helpstring("DeckLink Attribute interface")
 ] interface IDeckLinkAttributes : IUnknown
 {
@@ -977,7 +1084,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(5F558200-4028-49BC-BEAC-DB3FA4A96E46),
-    local,
+    local, 
     helpstring("DeckLink Status interface")
 ] interface IDeckLinkStatus : IUnknown
 {
@@ -993,7 +1100,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3),
-    local,
+    local, 
     helpstring("DeckLink Keyer interface")
 ] interface IDeckLinkKeyer : IUnknown
 {
@@ -1009,7 +1116,7 @@ interface IDeckLinkDiscovery;
 [
     object,
     uuid(3BBCB8A2-DA2C-42D9-B5D8-88083644E99A),
-    local,
+    local, 
     helpstring("Created with CoCreateInstance().")
 ] interface IDeckLinkVideoConversion : IUnknown
 {
@@ -1045,7 +1152,7 @@ interface IDeckLinkDiscovery;
 importlib("stdole2.tlb");
 
 [
-    uuid(1F2E109A-8F4F-49E4-9203-135595CB6FA5),
+    uuid(87D2693F-8D4A-45C7-B43F-10ACBA25E68F),
     helpstring("CDeckLinkIterator Class")
 ] coclass CDeckLinkIterator
 {
@@ -1085,15 +1192,26 @@ importlib("stdole2.tlb");
 };
 
 [
-    uuid(1073A05C-D885-47E9-B3C6-129B3F9F648B),
+    uuid(652615D4-26CD-4514-B161-2FD5072ED008),
     helpstring("CDeckLinkDiscovery Class")
 ] coclass CDeckLinkDiscovery
 {
     [default] interface IDeckLinkDiscovery;
 };
 
+[
+    uuid(F891AD29-D0C2-46E9-A926-4E2D0DD8CFAD),
+    helpstring("CDeckLinkVideoFrameAncillaryPackets Class")
+] coclass CDeckLinkVideoFrameAncillaryPackets
+{
+    [default] interface IDeckLinkVideoFrameAncillaryPackets;
+};
+
 
 // import deprecated interfaces
+#include "DeckLinkAPI_v10_9.idl"
+#include "DeckLinkAPIStreaming_v10_8.idl"
+#include "DeckLinkAPI_v10_8.idl"
 #include "DeckLinkAPI_v10_6.idl"
 #include "DeckLinkAPI_v10_5.idl"
 #include "DeckLinkAPI_v10_4.idl"

+ 15 - 9
plugins/decklink/win/decklink-sdk/DeckLinkAPIConfiguration.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -50,10 +50,6 @@ typedef [v1_enum] enum	_BMDDeckLinkConfigurationID {
 
     bmdDeckLinkConfigSwapSerialRxTx                              = /* 'ssrt' */ 0x73737274,
 
-    /* Video Input/Output Flags */
-
-    bmdDeckLinkConfigUse1080pNotPsF                              = /* 'fpro' */ 0x6670726F,
-
     /* Video Input/Output Integers */
 
     bmdDeckLinkConfigHDMI3DPackingFormat                         = /* '3dpf' */ 0x33647066,
@@ -74,6 +70,12 @@ typedef [v1_enum] enum	_BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigLowLatencyVideoOutput                       = /* 'llvo' */ 0x6C6C766F,
     bmdDeckLinkConfigDownConversionOnAllAnalogOutput             = /* 'caao' */ 0x6361616F,
     bmdDeckLinkConfigSMPTELevelAOutput                           = /* 'smta' */ 0x736D7461,
+    bmdDeckLinkConfigRec2020Output                               = /* 'rec2' */ 0x72656332,	// Ensure output is Rec.2020 colorspace
+    bmdDeckLinkConfigQuadLinkSDIVideoOutputSquareDivisionSplit   = /* 'SDQS' */ 0x53445153,
+
+    /* Video Output Flags */
+
+    bmdDeckLinkConfigOutput1080pAsPsF                            = /* 'pfpr' */ 0x70667072,
 
     /* Video Output Integers */
 
@@ -102,6 +104,10 @@ typedef [v1_enum] enum	_BMDDeckLinkConfigurationID {
     bmdDeckLinkConfigUseDedicatedLTCInput                        = /* 'dltc' */ 0x646C7463,	// Use timecode from LTC input instead of SDI stream
     bmdDeckLinkConfigSDIInput3DPayloadOverride                   = /* '3dds' */ 0x33646473,
 
+    /* Video Input Flags */
+
+    bmdDeckLinkConfigCapture1080pAsPsF                           = /* 'cfpr' */ 0x63667072,
+
     /* Video Input Integers */
 
     bmdDeckLinkConfigVideoInputConnection                        = /* 'vicn' */ 0x7669636E,
@@ -203,8 +209,8 @@ interface IDeckLinkEncoderConfiguration;
 
 [
     object,
-    uuid(CB71734A-FE37-4E8D-8E13-802133A1C3F2),
-    local,
+    uuid(EF90380B-4AE5-4346-9077-E288E149F129),
+    local, 
     helpstring("DeckLink Configuration interface")
 ] interface IDeckLinkConfiguration : IUnknown
 {
@@ -224,7 +230,7 @@ interface IDeckLinkEncoderConfiguration;
 [
     object,
     uuid(138050E5-C60A-4552-BF3F-0F358049327E),
-    local,
+    local, 
     helpstring("DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput")
 ] interface IDeckLinkEncoderConfiguration : IUnknown
 {

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPIDeckControl.idl

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPIDiscovery.idl

@@ -7,14 +7,14 @@
 ** 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

+ 52 - 10
plugins/decklink/win/decklink-sdk/DeckLinkAPIModes.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -63,12 +63,12 @@ typedef [v1_enum] enum	_BMDDisplayMode {
     bmdModeHD1080p25                                             = /* 'Hp25' */ 0x48703235,
     bmdModeHD1080p2997                                           = /* 'Hp29' */ 0x48703239,
     bmdModeHD1080p30                                             = /* 'Hp30' */ 0x48703330,
-    bmdModeHD1080i50                                             = /* 'Hi50' */ 0x48693530,
-    bmdModeHD1080i5994                                           = /* 'Hi59' */ 0x48693539,
-    bmdModeHD1080i6000                                           = /* 'Hi60' */ 0x48693630,	// N.B. This _really_ is 60.00 Hz.
     bmdModeHD1080p50                                             = /* 'Hp50' */ 0x48703530,
     bmdModeHD1080p5994                                           = /* 'Hp59' */ 0x48703539,
     bmdModeHD1080p6000                                           = /* 'Hp60' */ 0x48703630,	// N.B. This _really_ is 60.00 Hz.
+    bmdModeHD1080i50                                             = /* 'Hi50' */ 0x48693530,
+    bmdModeHD1080i5994                                           = /* 'Hi59' */ 0x48693539,
+    bmdModeHD1080i6000                                           = /* 'Hi60' */ 0x48693630,	// N.B. This _really_ is 60.00 Hz.
 
     /* HD 720 Modes */
 
@@ -76,19 +76,24 @@ typedef [v1_enum] enum	_BMDDisplayMode {
     bmdModeHD720p5994                                            = /* 'hp59' */ 0x68703539,
     bmdModeHD720p60                                              = /* 'hp60' */ 0x68703630,
 
-    /* 2k Modes */
+    /* 2K Modes */
 
     bmdMode2k2398                                                = /* '2k23' */ 0x326B3233,
     bmdMode2k24                                                  = /* '2k24' */ 0x326B3234,
     bmdMode2k25                                                  = /* '2k25' */ 0x326B3235,
 
-    /* DCI Modes (output only) */
+    /* 2K DCI Modes */
 
     bmdMode2kDCI2398                                             = /* '2d23' */ 0x32643233,
     bmdMode2kDCI24                                               = /* '2d24' */ 0x32643234,
     bmdMode2kDCI25                                               = /* '2d25' */ 0x32643235,
+    bmdMode2kDCI2997                                             = /* '2d29' */ 0x32643239,
+    bmdMode2kDCI30                                               = /* '2d30' */ 0x32643330,
+    bmdMode2kDCI50                                               = /* '2d50' */ 0x32643530,
+    bmdMode2kDCI5994                                             = /* '2d59' */ 0x32643539,
+    bmdMode2kDCI60                                               = /* '2d60' */ 0x32643630,
 
-    /* 4k Modes */
+    /* 4K UHD Modes */
 
     bmdMode4K2160p2398                                           = /* '4k23' */ 0x346B3233,
     bmdMode4K2160p24                                             = /* '4k24' */ 0x346B3234,
@@ -99,11 +104,43 @@ typedef [v1_enum] enum	_BMDDisplayMode {
     bmdMode4K2160p5994                                           = /* '4k59' */ 0x346B3539,
     bmdMode4K2160p60                                             = /* '4k60' */ 0x346B3630,
 
-    /* DCI Modes (output only) */
+    /* 4K DCI Modes */
 
     bmdMode4kDCI2398                                             = /* '4d23' */ 0x34643233,
     bmdMode4kDCI24                                               = /* '4d24' */ 0x34643234,
     bmdMode4kDCI25                                               = /* '4d25' */ 0x34643235,
+    bmdMode4kDCI2997                                             = /* '4d29' */ 0x34643239,
+    bmdMode4kDCI30                                               = /* '4d30' */ 0x34643330,
+    bmdMode4kDCI50                                               = /* '4d50' */ 0x34643530,
+    bmdMode4kDCI5994                                             = /* '4d59' */ 0x34643539,
+    bmdMode4kDCI60                                               = /* '4d60' */ 0x34643630,
+
+    /* 8K UHD Modes */
+
+    bmdMode8K4320p2398                                           = /* '8k23' */ 0x386B3233,
+    bmdMode8K4320p24                                             = /* '8k24' */ 0x386B3234,
+    bmdMode8K4320p25                                             = /* '8k25' */ 0x386B3235,
+    bmdMode8K4320p2997                                           = /* '8k29' */ 0x386B3239,
+    bmdMode8K4320p30                                             = /* '8k30' */ 0x386B3330,
+    bmdMode8K4320p50                                             = /* '8k50' */ 0x386B3530,
+    bmdMode8K4320p5994                                           = /* '8k59' */ 0x386B3539,
+    bmdMode8K4320p60                                             = /* '8k60' */ 0x386B3630,
+
+    /* 8K DCI Modes */
+
+    bmdMode8kDCI2398                                             = /* '8d23' */ 0x38643233,
+    bmdMode8kDCI24                                               = /* '8d24' */ 0x38643234,
+    bmdMode8kDCI25                                               = /* '8d25' */ 0x38643235,
+    bmdMode8kDCI2997                                             = /* '8d29' */ 0x38643239,
+    bmdMode8kDCI30                                               = /* '8d30' */ 0x38643330,
+    bmdMode8kDCI50                                               = /* '8d50' */ 0x38643530,
+    bmdMode8kDCI5994                                             = /* '8d59' */ 0x38643539,
+    bmdMode8kDCI60                                               = /* '8d60' */ 0x38643630,
+
+    /* RAW Modes for Cintel (input only) */
+
+    bmdModeCintelRAW                                             = /* 'rwci' */ 0x72776369,	// Frame size up to 4096x3072, variable frame rate
+    bmdModeCintelCompressedRAW                                   = /* 'rwcc' */ 0x72776363,	// Frame size up to 4096x3072, variable frame rate
 
     /* Special Modes */
 
@@ -136,7 +173,12 @@ typedef [v1_enum] enum	_BMDPixelFormat {
 
     /* AVID DNxHR */
 
-    bmdFormatDNxHR                                               = /* 'AVdh' */ 0x41566468
+    bmdFormatDNxHR                                               = /* 'AVdh' */ 0x41566468,
+
+    /* Cintel formats */
+
+    bmdFormat12BitRAWGRBG                                        = /* 'r12p' */ 0x72313270,	// 12-bit RAW data for bayer pattern GRBG
+    bmdFormat12BitRAWJPEG                                        = /* 'r16p' */ 0x72313670	// 12-bit RAW data arranged in tiles and JPEG compressed
 } BMDPixelFormat;
 
 /* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */

+ 5 - 5
plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -77,8 +77,8 @@ typedef [v1_enum] enum	_BMDStreamingEncodingFrameRate {
 
 typedef [v1_enum] enum	_BMDStreamingEncodingSupport {
     bmdStreamingEncodingModeNotSupported                         = 0,
-    bmdStreamingEncodingModeSupported,
-    bmdStreamingEncodingModeSupportedWithChanges
+    bmdStreamingEncodingModeSupported,                          
+    bmdStreamingEncodingModeSupportedWithChanges                
 } BMDStreamingEncodingSupport;
 
 /* Enum BMDStreamingVideoCodec - Video codecs */
@@ -346,7 +346,7 @@ interface IBMDStreamingH264NALParser;
 importlib("stdole2.tlb");
 
 [
-    uuid(0CAA31F6-8A26-40B0-86A4-BF58DCCA710C),
+    uuid(23A4EDF5-A0E5-432C-94EF-3BABB5F81C82),
     helpstring("CBMDStreamingDiscovery Class")
 ] coclass CBMDStreamingDiscovery
 {

+ 40 - 0
plugins/decklink/win/decklink-sdk/DeckLinkAPIStreaming_v10_8.idl

@@ -0,0 +1,40 @@
+/* -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-
+*/
+
+
+
+/* Coclasses */
+
+importlib("stdole2.tlb");
+
+[
+    uuid(0CAA31F6-8A26-40B0-86A4-BF58DCCA710C),
+    helpstring("CBMDStreamingDiscovery Class")
+] coclass CBMDStreamingDiscovery_v10_8
+{
+    [default] interface IBMDStreamingDiscovery;
+};

+ 4 - 3
plugins/decklink/win/decklink-sdk/DeckLinkAPITypes.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -53,7 +53,8 @@ cpp_quote("#endif")
 [v1_enum] enum	_BMDTimecodeFlags {
     bmdTimecodeFlagDefault                                       = 0,
     bmdTimecodeIsDropFrame                                       = 1 << 0,
-    bmdTimecodeFieldMark                                         = 1 << 1
+    bmdTimecodeFieldMark                                         = 1 << 1,
+    bmdTimecodeColorFrame                                        = 1 << 2
 };
 
 /* Enum BMDVideoConnection - Video connection types */

+ 4 - 4
plugins/decklink/win/decklink-sdk/DeckLinkAPIVersion.h

@@ -7,14 +7,14 @@
  * ** 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
@@ -30,8 +30,8 @@
 #ifndef __DeckLink_API_Version_h__
 #define __DeckLink_API_Version_h__
 
-#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a080000
-#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.8"
+#define BLACKMAGIC_DECKLINK_API_VERSION					0x0a0b0000
+#define BLACKMAGIC_DECKLINK_API_VERSION_STRING			"10.11"
 
 #endif	// __DeckLink_API_Version_h__
 

+ 3 - 3
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_2.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -57,7 +57,7 @@ interface IDeckLinkConfiguration_v10_2;
 [
     object,
     uuid(C679A35B-610C-4D09-B748-1D0478100FC0),
-    local,
+    local, 
     helpstring("DeckLink Configuration interface")
 ] interface IDeckLinkConfiguration_v10_2 : IUnknown
 {

+ 1 - 1
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_5.idl

@@ -45,7 +45,7 @@ interface IDeckLinkEncoderConfiguration_v10_5;
 [
     object,
     uuid(67455668-0848-45DF-8D8E-350A77C9A028),
-    local,
+    local, 
     helpstring("DeckLink Encoder Configuration interface. Obtained from IDeckLinkEncoderInput")
 ] interface IDeckLinkEncoderConfiguration_v10_5 : IUnknown
 {

+ 46 - 0
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_8.idl

@@ -0,0 +1,46 @@
+/* -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_8.idl */
+
+
+importlib("stdole2.tlb");
+
+[
+    uuid(1F2E109A-8F4F-49E4-9203-135595CB6FA5),
+    helpstring("CDeckLinkIterator_v10_8 Class")
+] coclass CDeckLinkIterator_v10_8
+{
+    [default] interface IDeckLinkIterator;
+};
+
+[
+    uuid(1073A05C-D885-47E9-B3C6-129B3F9F648B),
+    helpstring("CDeckLinkDiscovery_v10_8 Class")
+] coclass CDeckLinkDiscovery_v10_8
+{
+    [default] interface IDeckLinkDiscovery;
+};

+ 61 - 0
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v10_9.idl

@@ -0,0 +1,61 @@
+/* -LICENSE-START-
+** Copyright (c) 2017 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_9.idl */
+
+/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */
+
+typedef [v1_enum] enum	_BMDDeckLinkConfigurationID_v10_9 {
+
+    /* Video output flags */
+
+    bmdDeckLinkConfig1080pNotPsF_v10_9                      = /* 'fpro' */ 0x6670726F,
+
+} BMDDeckLinkConfigurationID_v10_9;
+
+// Forward Declarations
+
+interface IDeckLinkConfiguration_v10_9;
+
+/* Interface IDeckLinkConfiguration_v10_9 - DeckLink Configuration interface */
+
+[
+    object,
+    uuid(CB71734A-FE37-4E8D-8E13-802133A1C3F2),
+    local,
+    helpstring("DeckLink Configuration interface")
+] interface IDeckLinkConfiguration_v10_9 : 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);
+};

+ 21 - 21
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_1.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -31,7 +31,7 @@
 	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
@@ -50,21 +50,21 @@
 		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.")]
@@ -72,11 +72,11 @@
     {
 		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);
@@ -84,22 +84,22 @@
         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);
@@ -112,24 +112,24 @@
     {
 		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
@@ -141,14 +141,14 @@
         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
@@ -157,4 +157,4 @@
 		HRESULT				GetBytes (void* *buffer);
 		HRESULT				GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale);
     };
-
+	

+ 4 - 4
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_3.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -55,7 +55,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
 [
     object,
     uuid(271C65E3-C323-4344-A30F-D908BCB20AA3),
-    local,
+    local, 
     helpstring("Created by QueryInterface from IDeckLink.")
 ] interface IDeckLinkOutput_v7_3 : IUnknown
 {
@@ -146,7 +146,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
 [
     object,
     uuid(CF317790-2894-11DE-8C30-0800200C9A66),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
 ] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame_v7_6
 {

+ 9 - 9
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_6.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -114,7 +114,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(29228142-EB8C-4141-A621-F74026450955),
-    local,
+    local, 
     helpstring("Created by QueryInterface from IDeckLink.")
 ] interface IDeckLinkOutput_v7_6 : IUnknown
 {
@@ -225,7 +225,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(A8D8238E-6B18-4196-99E1-5AF717B83D32),
-    local,
+    local, 
     helpstring("Interface to encapsulate a video frame; can be caller-implemented.")
 ] interface IDeckLinkVideoFrame_v7_6 : IUnknown
 {
@@ -246,7 +246,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(46FCEE00-B4E6-43D0-91C0-023A7FCEB34F),
-    local,
+    local, 
     helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")
 ] interface IDeckLinkMutableVideoFrame_v7_6 : IDeckLinkVideoFrame_v7_6
 {
@@ -263,7 +263,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(9A74FA41-AE9F-47AC-8CF4-01F42DD59965),
-    local,
+    local, 
     helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
 ] interface IDeckLinkVideoInputFrame_v7_6 : IDeckLinkVideoFrame_v7_6
 {
@@ -277,7 +277,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(373F499D-4B4D-4518-AD22-6354E5A5825E),
-    local,
+    local, 
     helpstring("Screen preview callback")
 ] interface IDeckLinkScreenPreviewCallback_v7_6 : IUnknown
 {
@@ -290,7 +290,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA),
-    local,
+    local, 
     helpstring("Created with CoCreateInstance().")
 ] interface IDeckLinkGLScreenPreviewHelper_v7_6 : IUnknown
 {
@@ -308,7 +308,7 @@ interface IDeckLinkConfiguration_v7_6;
 [
     object,
     uuid(3EB504C9-F97D-40FE-A158-D407D48CB53B),
-    local,
+    local, 
     helpstring("Created with CoCreateInstance().")
 ] interface IDeckLinkVideoConversion_v7_6 : IUnknown
 {

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v7_9.idl

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_0.idl

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v8_1.idl

@@ -7,14 +7,14 @@
 ** 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

+ 2 - 2
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_2.idl

@@ -7,14 +7,14 @@
 ** 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

+ 3 - 3
plugins/decklink/win/decklink-sdk/DeckLinkAPI_v9_9.idl

@@ -7,14 +7,14 @@
 ** 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
@@ -33,7 +33,7 @@
 [
     object,
     uuid(A3EF0963-0862-44ED-92A9-EE89ABF431C7),
-    local,
+    local, 
     helpstring("Created by QueryInterface from IDeckLink.")
 ] interface IDeckLinkOutput_v9_9 : IUnknown
 {