decklink: Updated DeckLink SDK to 11.2 to support DeckLink 8K Pro

Updated Decklink SDK to version 11.2 in order to support newer cards like the Decklink 8K Pro.
This required to replace the duplex property by a profile property.

Profile values can be the following:
-  bmdProfileOneSubDeviceFullDuplex
-  bmdProfileOneSubDeviceHalfDuplex
-  bmdProfileTwoSubDevicesFullDuplex
-  bmdProfileTwoSubDevicesHalfDuplex
-  bmdProfileFourSubDevicesHalfDuplex

Fixes #987

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1665>
This commit is contained in:
Tim 2019-06-25 11:51:32 +02:00 committed by GStreamer Merge Bot
parent 9ecdfea7da
commit c6151f635f
14 changed files with 330 additions and 245 deletions

View file

@ -157,17 +157,20 @@ gst_decklink_video_format_get_type (void)
}
GType
gst_decklink_duplex_mode_get_type (void)
gst_decklink_profile_id_get_type (void)
{
static gsize id = 0;
static const GEnumValue types[] = {
{GST_DECKLINK_DUPLEX_MODE_HALF, "Half-Duplex", "half"},
{GST_DECKLINK_DUPLEX_MODE_FULL, "Full-Duplex", "full"},
{GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX, "One sub-device, Full-Duplex", "one-sub-device-full"},
{GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_HALF_DUPLEX, "One sub-device, Half-Duplex", "one-sub-device-half"},
{GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_FULL_DUPLEX, "Two sub-devices, Full-Duplex", "two-sub-devices-full"},
{GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_HALF_DUPLEX, "Two sub-devices, Half-Duplex", "two-sub-devices-half"},
{GST_DECKLINK_PROFILE_ID_FOUR_SUB_DEVICES_HALF_DUPLEX, "Four sub-devices, Half-Duplex", "four-sub-devices-half"},
{0, NULL, NULL}
};
if (g_once_init_enter (&id)) {
GType tmp = g_enum_register_static ("GstDecklinkDuplexMode", types);
GType tmp = g_enum_register_static ("GstDecklinkProfileId", types);
g_once_init_leave (&id, tmp);
}
@ -353,15 +356,25 @@ static const struct
static const struct
{
BMDDuplexMode mode;
GstDecklinkDuplexMode gstmode;
} duplex_modes[] = {
BMDProfileID profile;
GstDecklinkProfileId gstprofile;
} profiles[] = {
/* *INDENT-OFF* */
{bmdDuplexModeHalf, GST_DECKLINK_DUPLEX_MODE_HALF},
{bmdDuplexModeFull, GST_DECKLINK_DUPLEX_MODE_FULL},
{bmdProfileOneSubDeviceFullDuplex, GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX},
{bmdProfileOneSubDeviceHalfDuplex, GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_HALF_DUPLEX},
{bmdProfileTwoSubDevicesFullDuplex, GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_FULL_DUPLEX},
{bmdProfileTwoSubDevicesHalfDuplex, GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_HALF_DUPLEX},
{bmdProfileFourSubDevicesHalfDuplex, GST_DECKLINK_PROFILE_ID_FOUR_SUB_DEVICES_HALF_DUPLEX},
/* *INDENT-ON* */
};
enum ProfileSetOperationResult
{
PROFILE_SET_UNSUPPORTED,
PROFILE_SET_SUCCESS,
PROFILE_SET_FAILURE
};
enum DuplexModeSetOperationResult
{
DUPLEX_MODE_SET_UNSUPPORTED,
@ -589,23 +602,23 @@ gst_decklink_timecode_format_to_enum (BMDTimecodeFormat f)
return GST_DECKLINK_TIMECODE_FORMAT_RP188ANY;
}
const BMDDuplexMode
gst_decklink_duplex_mode_from_enum (GstDecklinkDuplexMode m)
const BMDProfileID
gst_decklink_profile_id_from_enum (GstDecklinkProfileId p)
{
return duplex_modes[m].mode;
return profiles[p].profile;
}
const GstDecklinkDuplexMode
gst_decklink_duplex_mode_to_enum (BMDDuplexMode m)
const GstDecklinkProfileId
gst_decklink_profile_id_to_enum (BMDProfileID p)
{
guint i;
for (i = 0; i < G_N_ELEMENTS (duplex_modes); i++) {
if (duplex_modes[i].mode == m)
return duplex_modes[i].gstmode;
for (i = 0; i < G_N_ELEMENTS (profiles); i++) {
if (profiles[i].profile == p)
return profiles[i].gstprofile;
}
g_assert_not_reached ();
return GST_DECKLINK_DUPLEX_MODE_HALF;
return GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX;
}
const BMDKeyerMode
@ -859,11 +872,9 @@ struct _Device
GstDecklinkDevice *devices[4];
};
DuplexModeSetOperationResult gst_decklink_configure_duplex_mode (Device *
device, BMDDuplexMode duplex_mode);
DuplexModeSetOperationResult
gst_decklink_configure_duplex_mode_pair_device (Device * device,
BMDDuplexMode duplex_mode);
ProfileSetOperationResult gst_decklink_configure_profile (Device * device,
BMDProfileID profile_id);
Device *gst_decklink_find_device_by_persistent_id (int64_t persistent_id);
gboolean gst_decklink_device_has_persistent_id (Device * device,
int64_t persistent_id);
@ -1546,7 +1557,7 @@ init_devices (gpointer data)
}
}
ret = decklink->QueryInterface (IID_IDeckLinkAttributes,
ret = decklink->QueryInterface (IID_IDeckLinkProfileAttributes,
(void **) &dev->input.attributes);
dev->output.attributes = dev->input.attributes;
if (ret != S_OK) {
@ -1677,8 +1688,8 @@ gst_decklink_acquire_nth_output (gint n, GstElement * sink, gboolean is_audio)
if (!is_audio) {
GstDecklinkVideoSink *videosink = (GstDecklinkVideoSink *) (sink);
if (gst_decklink_configure_duplex_mode (device,
videosink->duplex_mode) == DUPLEX_MODE_SET_FAILURE) {
if (gst_decklink_configure_profile (device,
videosink->profile_id) == PROFILE_SET_FAILURE) {
return NULL;
}
}
@ -1751,11 +1762,12 @@ gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio)
if (!is_audio) {
GstDecklinkVideoSrc *videosrc = (GstDecklinkVideoSrc *) (src);
if (gst_decklink_configure_duplex_mode (device,
videosrc->duplex_mode) == DUPLEX_MODE_SET_FAILURE) {
if (gst_decklink_configure_profile (device,
videosrc->profile_id) == PROFILE_SET_FAILURE) {
return NULL;
}
}
g_mutex_lock (&input->lock);
input->input->SetVideoInputFrameMemoryAllocator (new
GStreamerDecklinkMemoryAllocator);
@ -1768,6 +1780,7 @@ gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio)
g_mutex_unlock (&input->lock);
return input;
}
g_mutex_unlock (&input->lock);
GST_ERROR ("Input device %d (audio: %d) in use already", n, is_audio);
@ -1804,115 +1817,40 @@ gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio)
g_mutex_unlock (&input->lock);
}
/*
* Probes if duplex-mode is supported and sets it accordingly. I duplex-mode is not supported
* but this device is part of a pair (Duo2- and Quad2-Cards) and Half-Dupley-Mode is requested,
* the parent device is also checked and configured accordingly.
*
* If
* - full-duplex-mode is requested and the device does not support it *or*
* - half-duplex-mode is requested and there is not parent-device *or*
* - half-duplex-mode is requested and neither the device nor the parent device does support setting
* the duplex-mode, DUPLEX_MODE_SET_UNSUPPORTED is returnded.
* If the device does support duplex-mode and setting it succeeded, DUPLEX_MODE_SET_SUCCESS is rerturned.
* If
* - the device does support duplex-mode and setting it failed *or*
* - the Device reported a pair-device that does not exist in the system,
* DUPLEX_MODE_SET_FAILURE is returned.
*/
DuplexModeSetOperationResult
gst_decklink_configure_duplex_mode (Device * device, BMDDuplexMode duplex_mode)
ProfileSetOperationResult
gst_decklink_configure_profile (Device * device, BMDProfileID profile_id)
{
HRESULT result;
bool duplex_supported;
int64_t paired_device_id;
HRESULT res;
GstDecklinkInput *input = &device->input;
IDeckLink *decklink = input->device;
result =
input->attributes->GetFlag (BMDDeckLinkSupportsDuplexModeConfiguration,
&duplex_supported);
if (result != S_OK) {
duplex_supported = false;
}
IDeckLinkProfileManager *manager = NULL;
if (decklink->QueryInterface(IID_IDeckLinkProfileManager, (void **)&manager) == S_OK) {
if (!duplex_supported) {
if (duplex_mode == bmdDuplexModeFull) {
GST_DEBUG ("Device does not support Full-Duplex-Mode");
return DUPLEX_MODE_SET_UNSUPPORTED;
} else if (duplex_mode == bmdDuplexModeHalf) {
result =
input->attributes->GetInt (BMDDeckLinkPairedDevicePersistentID,
&paired_device_id);
IDeckLinkProfile *profile = NULL;
res = manager->GetProfile(profile_id, &profile);
if (result == S_OK) {
GST_DEBUG ("Device does not support Half-Duplex-Mode but the Device is "
"a Part of a Device-Pair, trying to set Half-Duplex-Mode "
"on the Parent-Device");
Device *pair_device =
gst_decklink_find_device_by_persistent_id (paired_device_id);
if (pair_device == NULL) {
GST_ERROR ("Device reported as Pair-Device does not exist");
return DUPLEX_MODE_SET_FAILURE;
}
return gst_decklink_configure_duplex_mode_pair_device (pair_device,
duplex_mode);
} else {
GST_DEBUG ("Device does not support Half-Duplex-Mode");
return DUPLEX_MODE_SET_SUCCESS;
}
} else {
GST_ERROR ("duplex_mode=%d", duplex_mode);
g_assert_not_reached ();
if (res == S_OK) {
res = profile->SetActive();
profile->Release();
}
} else {
GST_DEBUG ("Setting duplex-mode of Device");
result = input->config->SetInt (bmdDeckLinkConfigDuplexMode, duplex_mode);
if (result == S_OK) {
GST_DEBUG ("Duplex mode set successful");
return DUPLEX_MODE_SET_SUCCESS;
} else {
GST_ERROR ("Setting duplex mode failed");
return DUPLEX_MODE_SET_FAILURE;
manager->Release();
if (res == S_OK) {
GST_DEBUG("Successfully set profile.\n");
return PROFILE_SET_SUCCESS;
}
else {
GST_ERROR("Failed to set profile.\n");
return PROFILE_SET_FAILURE;
}
}
else {
g_assert_not_reached ();
return DUPLEX_MODE_SET_FAILURE;
}
DuplexModeSetOperationResult
gst_decklink_configure_duplex_mode_pair_device (Device * device,
BMDDuplexMode duplex_mode)
{
HRESULT result;
bool duplex_supported;
GstDecklinkInput *input = &device->input;
result =
input->attributes->GetFlag (BMDDeckLinkSupportsDuplexModeConfiguration,
&duplex_supported);
if (result != S_OK) {
duplex_supported = false;
}
if (!duplex_supported) {
GST_DEBUG ("Pair-Device does not support Duplex-Mode");
return DUPLEX_MODE_SET_UNSUPPORTED;
}
GST_DEBUG ("Setting duplex-mode of Pair-Device");
result = input->config->SetInt (bmdDeckLinkConfigDuplexMode, duplex_mode);
if (result == S_OK) {
GST_DEBUG ("Duplex mode set successful");
return DUPLEX_MODE_SET_SUCCESS;
} else {
GST_ERROR ("Setting duplex mode failed");
return DUPLEX_MODE_SET_FAILURE;
GST_DEBUG("Device has only one profile.\n");
return PROFILE_SET_UNSUPPORTED;
}
}
@ -2057,7 +1995,7 @@ plugin_init (GstPlugin * plugin)
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_AUDIO_CHANNELS, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_AUDIO_CONNECTION, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_DUPLEX_MODE, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_PROFILE_ID, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_KEYER_MODE, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_MODE, (GstPluginAPIFlags) 0);
gst_type_mark_as_plugin_api (GST_TYPE_DECKLINK_TIMECODE_FORMAT, (GstPluginAPIFlags) 0);

View file

@ -161,11 +161,14 @@ typedef enum {
GType gst_decklink_video_format_get_type (void);
typedef enum {
GST_DECKLINK_DUPLEX_MODE_HALF, /* bmdDuplexModeHalf */
GST_DECKLINK_DUPLEX_MODE_FULL, /* bmdDuplexModeFull */
} GstDecklinkDuplexMode;
#define GST_TYPE_DECKLINK_DUPLEX_MODE (gst_decklink_duplex_mode_get_type ())
GType gst_decklink_duplex_mode_get_type (void);
GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX, /* bmdProfileOneSubDeviceFullDuplex */
GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_HALF_DUPLEX, /* bmdProfileOneSubDeviceHalfDuplex */
GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_FULL_DUPLEX, /* bmdProfileTwoSubDevicesFullDuplex */
GST_DECKLINK_PROFILE_ID_TWO_SUB_DEVICES_HALF_DUPLEX, /* bmdProfileTwoSubDevicesHalfDuplex */
GST_DECKLINK_PROFILE_ID_FOUR_SUB_DEVICES_HALF_DUPLEX, /* bmdProfileFourSubDevicesHalfDuplex */
} GstDecklinkProfileId;
#define GST_TYPE_DECKLINK_PROFILE_ID (gst_decklink_profile_id_get_type ())
GType gst_decklink_profile_id_get_type (void);
typedef enum {
GST_DECKLINK_TIMECODE_FORMAT_RP188VITC1, /*bmdTimecodeRP188VITC1 */
@ -204,8 +207,8 @@ const GstDecklinkVideoFormat gst_decklink_type_from_video_format (GstVideoFormat
GstVideoFormat gst_decklink_video_format_from_type (BMDPixelFormat pf);
const BMDTimecodeFormat gst_decklink_timecode_format_from_enum (GstDecklinkTimecodeFormat f);
const GstDecklinkTimecodeFormat gst_decklink_timecode_format_to_enum (BMDTimecodeFormat f);
const BMDDuplexMode gst_decklink_duplex_mode_from_enum (GstDecklinkDuplexMode m);
const GstDecklinkDuplexMode gst_decklink_duplex_mode_to_enum (BMDDuplexMode m);
const BMDProfileID gst_decklink_profile_id_from_enum (GstDecklinkProfileId p);
const GstDecklinkProfileId gst_decklink_profile_id_to_enum (BMDProfileID p);
const BMDKeyerMode gst_decklink_keyer_mode_from_enum (GstDecklinkKeyerMode m);
const GstDecklinkKeyerMode gst_decklink_keyer_mode_to_enum (BMDKeyerMode m);
@ -233,7 +236,7 @@ typedef struct _GstDecklinkOutput GstDecklinkOutput;
struct _GstDecklinkOutput {
IDeckLink *device;
IDeckLinkOutput *output;
IDeckLinkAttributes *attributes;
IDeckLinkProfileAttributes *attributes;
IDeckLinkKeyer *keyer;
gchar *hw_serial_number;
@ -264,7 +267,7 @@ struct _GstDecklinkInput {
IDeckLink *device;
IDeckLinkInput *input;
IDeckLinkConfiguration *config;
IDeckLinkAttributes *attributes;
IDeckLinkProfileAttributes *attributes;
gchar *hw_serial_number;

View file

@ -238,7 +238,7 @@ enum
PROP_MODE,
PROP_DEVICE_NUMBER,
PROP_VIDEO_FORMAT,
PROP_DUPLEX_MODE,
PROP_PROFILE_ID,
PROP_TIMECODE_FORMAT,
PROP_KEYER_MODE,
PROP_KEYER_LEVEL,
@ -341,17 +341,19 @@ gst_decklink_video_sink_class_init (GstDecklinkVideoSinkClass * klass)
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property (gobject_class, PROP_DUPLEX_MODE,
g_param_spec_enum ("duplex-mode", "Duplex mode",
"Certain DeckLink devices such as the DeckLink Quad 2 and the "
g_object_class_install_property (gobject_class, PROP_PROFILE_ID,
g_param_spec_enum ("profile", "Profile",
"Certain DeckLink devices such as the DeckLink 8K Pro, the DeckLink "
"Quad 2 and the DeckLink Duo 2 support multiple profiles to "
"configure the capture and playback behavior of its sub-devices."
"For the DeckLink Duo 2 and DeckLink Quad 2, a profile is shared "
"between any 2 sub-devices that utilize the same connectors. For the "
"DeckLink 8K Pro, a profile is shared between all 4 sub-devices. Any "
"sub-devices that share a profile are considered to be part of the "
"same profile group."
"DeckLink Duo 2 support configuration of the duplex mode of "
"individual sub-devices."
"A sub-device configured as full-duplex will use two connectors, "
"which allows simultaneous capture and playback, internal keying, "
"and fill & key scenarios."
"A half-duplex sub-device will use a single connector as an "
"individual capture or playback channel.",
GST_TYPE_DECKLINK_DUPLEX_MODE, GST_DECKLINK_DUPLEX_MODE_HALF,
"individual sub-devices.",
GST_TYPE_DECKLINK_PROFILE_ID, GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
@ -419,7 +421,7 @@ gst_decklink_video_sink_init (GstDecklinkVideoSink * self)
self->mode = GST_DECKLINK_MODE_NTSC;
self->device_number = 0;
self->video_format = GST_DECKLINK_VIDEO_FORMAT_8BIT_YUV;
self->duplex_mode = bmdDuplexModeHalf;
self->profile_id = bmdProfileOneSubDeviceFullDuplex;
/* VITC is legacy, we should expect RP188 in modern use cases */
self->timecode_format = bmdTimecodeRP188Any;
self->caption_line = 0;
@ -457,9 +459,9 @@ gst_decklink_video_sink_set_property (GObject * object, guint property_id,
break;
}
break;
case PROP_DUPLEX_MODE:
self->duplex_mode =
gst_decklink_duplex_mode_from_enum ((GstDecklinkDuplexMode)
case PROP_PROFILE_ID:
self->profile_id =
gst_decklink_profile_id_from_enum ((GstDecklinkProfileId)
g_value_get_enum (value));
break;
case PROP_TIMECODE_FORMAT:
@ -503,9 +505,9 @@ gst_decklink_video_sink_get_property (GObject * object, guint property_id,
case PROP_VIDEO_FORMAT:
g_value_set_enum (value, self->video_format);
break;
case PROP_DUPLEX_MODE:
case PROP_PROFILE_ID:
g_value_set_enum (value,
gst_decklink_duplex_mode_to_enum (self->duplex_mode));
gst_decklink_profile_id_to_enum (self->profile_id));
break;
case PROP_TIMECODE_FORMAT:
g_value_set_enum (value,

View file

@ -52,7 +52,7 @@ struct _GstDecklinkVideoSink
GstDecklinkModeEnum mode;
gint device_number;
GstDecklinkVideoFormat video_format;
BMDDuplexMode duplex_mode;
BMDProfileID profile_id;
BMDTimecodeFormat timecode_format;
BMDKeyerMode keyer_mode;
gint keyer_level;

View file

@ -162,7 +162,7 @@ enum
PROP_DEVICE_NUMBER,
PROP_BUFFER_SIZE,
PROP_VIDEO_FORMAT,
PROP_DUPLEX_MODE,
PROP_PROFILE_ID,
PROP_TIMECODE_FORMAT,
PROP_OUTPUT_STREAM_TIME,
PROP_SKIP_FIRST_TIME,
@ -298,17 +298,19 @@ gst_decklink_video_src_class_init (GstDecklinkVideoSrcClass * klass)
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property (gobject_class, PROP_DUPLEX_MODE,
g_param_spec_enum ("duplex-mode", "Duplex mode",
"Certain DeckLink devices such as the DeckLink Quad 2 and the "
g_object_class_install_property (gobject_class, PROP_PROFILE_ID,
g_param_spec_enum ("profile", "Profile",
"Certain DeckLink devices such as the DeckLink 8K Pro, the DeckLink "
"Quad 2 and the DeckLink Duo 2 support multiple profiles to "
"configure the capture and playback behavior of its sub-devices."
"For the DeckLink Duo 2 and DeckLink Quad 2, a profile is shared "
"between any 2 sub-devices that utilize the same connectors. For the "
"DeckLink 8K Pro, a profile is shared between all 4 sub-devices. Any "
"sub-devices that share a profile are considered to be part of the "
"same profile group."
"DeckLink Duo 2 support configuration of the duplex mode of "
"individual sub-devices."
"A sub-device configured as full-duplex will use two connectors, "
"which allows simultaneous capture and playback, internal keying, "
"and fill & key scenarios."
"A half-duplex sub-device will use a single connector as an "
"individual capture or playback channel.",
GST_TYPE_DECKLINK_DUPLEX_MODE, GST_DECKLINK_DUPLEX_MODE_HALF,
"individual sub-devices.",
GST_TYPE_DECKLINK_PROFILE_ID, GST_DECKLINK_PROFILE_ID_ONE_SUB_DEVICE_FULL_DUPLEX,
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
@ -384,7 +386,7 @@ gst_decklink_video_src_init (GstDecklinkVideoSrc * self)
self->device_number = 0;
self->buffer_size = DEFAULT_BUFFER_SIZE;
self->video_format = GST_DECKLINK_VIDEO_FORMAT_AUTO;
self->duplex_mode = bmdDuplexModeHalf;
self->profile_id = bmdProfileOneSubDeviceFullDuplex;
self->timecode_format = bmdTimecodeRP188Any;
self->signal_state = SIGNAL_STATE_UNKNOWN;
self->output_stream_time = DEFAULT_OUTPUT_STREAM_TIME;
@ -456,9 +458,9 @@ gst_decklink_video_src_set_property (GObject * object, guint property_id,
break;
}
break;
case PROP_DUPLEX_MODE:
self->duplex_mode =
gst_decklink_duplex_mode_from_enum ((GstDecklinkDuplexMode)
case PROP_PROFILE_ID:
self->profile_id =
gst_decklink_profile_id_from_enum ((GstDecklinkProfileId)
g_value_get_enum (value));
break;
case PROP_TIMECODE_FORMAT:
@ -509,9 +511,9 @@ gst_decklink_video_src_get_property (GObject * object, guint property_id,
case PROP_VIDEO_FORMAT:
g_value_set_enum (value, self->video_format);
break;
case PROP_DUPLEX_MODE:
case PROP_PROFILE_ID:
g_value_set_enum (value,
gst_decklink_duplex_mode_to_enum (self->duplex_mode));
gst_decklink_profile_id_to_enum (self->profile_id));
break;
case PROP_TIMECODE_FORMAT:
g_value_set_enum (value,

View file

@ -71,7 +71,7 @@ struct _GstDecklinkVideoSrc
GstVideoInfo info;
GstDecklinkVideoFormat video_format;
BMDDuplexMode duplex_mode;
BMDProfileID profile_id;
BMDTimecodeFormat timecode_format;
GstDecklinkInput *input;

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 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
@ -66,10 +66,10 @@ BMD_CONST REFIID IID_IDeckLinkMemoryAllocator = /* B36EB6E7-
BMD_CONST REFIID IID_IDeckLinkAudioOutputCallback = /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ {0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6};
BMD_CONST REFIID IID_IDeckLinkIterator = /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ {0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA};
BMD_CONST REFIID IID_IDeckLinkAPIInformation = /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ {0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4};
BMD_CONST REFIID IID_IDeckLinkOutput = /* CC5C8A6E-3F2F-4B3A-87EA-FD78AF300564 */ {0xCC,0x5C,0x8A,0x6E,0x3F,0x2F,0x4B,0x3A,0x87,0xEA,0xFD,0x78,0xAF,0x30,0x05,0x64};
BMD_CONST REFIID IID_IDeckLinkInput = /* AF22762B-DFAC-4846-AA79-FA8883560995 */ {0xAF,0x22,0x76,0x2B,0xDF,0xAC,0x48,0x46,0xAA,0x79,0xFA,0x88,0x83,0x56,0x09,0x95};
BMD_CONST REFIID IID_IDeckLinkOutput = /* 065A0F6C-C508-4D0D-B919-F5EB0EBFC96B */ {0x06,0x5A,0x0F,0x6C,0xC5,0x08,0x4D,0x0D,0xB9,0x19,0xF5,0xEB,0x0E,0xBF,0xC9,0x6B};
BMD_CONST REFIID IID_IDeckLinkInput = /* 2A88CF76-F494-4216-A7EF-DC74EEB83882 */ {0x2A,0x88,0xCF,0x76,0xF4,0x94,0x42,0x16,0xA7,0xEF,0xDC,0x74,0xEE,0xB8,0x38,0x82};
BMD_CONST REFIID IID_IDeckLinkHDMIInputEDID = /* ABBBACBC-45BC-4665-9D92-ACE6E5A97902 */ {0xAB,0xBB,0xAC,0xBC,0x45,0xBC,0x46,0x65,0x9D,0x92,0xAC,0xE6,0xE5,0xA9,0x79,0x02};
BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* 270587DA-6B7D-42E7-A1F0-6D853F581185 */ {0x27,0x05,0x87,0xDA,0x6B,0x7D,0x42,0xE7,0xA1,0xF0,0x6D,0x85,0x3F,0x58,0x11,0x85};
BMD_CONST REFIID IID_IDeckLinkEncoderInput = /* F222551D-13DF-4FD8-B587-9D4F19EC12C9 */ {0xF2,0x22,0x55,0x1D,0x13,0xDF,0x4F,0xD8,0xB5,0x87,0x9D,0x4F,0x19,0xEC,0x12,0xC9};
BMD_CONST REFIID IID_IDeckLinkVideoFrame = /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ {0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17};
BMD_CONST REFIID IID_IDeckLinkMutableVideoFrame = /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ {0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90};
BMD_CONST REFIID IID_IDeckLinkVideoFrame3DExtensions = /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ {0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7};
@ -87,8 +87,12 @@ BMD_CONST REFIID IID_IDeckLinkAudioInputPacket = /* E43D5870-
BMD_CONST REFIID IID_IDeckLinkScreenPreviewCallback = /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ {0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38};
BMD_CONST REFIID IID_IDeckLinkGLScreenPreviewHelper = /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ {0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F};
BMD_CONST REFIID IID_IDeckLinkNotificationCallback = /* B002A1EC-070D-4288-8289-BD5D36E5FF0D */ {0xB0,0x02,0xA1,0xEC,0x07,0x0D,0x42,0x88,0x82,0x89,0xBD,0x5D,0x36,0xE5,0xFF,0x0D};
BMD_CONST REFIID IID_IDeckLinkNotification = /* 0A1FB207-E215-441B-9B19-6FA1575946C5 */ {0x0A,0x1F,0xB2,0x07,0xE2,0x15,0x44,0x1B,0x9B,0x19,0x6F,0xA1,0x57,0x59,0x46,0xC5};
BMD_CONST REFIID IID_IDeckLinkAttributes = /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ {0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4};
BMD_CONST REFIID IID_IDeckLinkNotification = /* B85DF4C8-BDF5-47C1-8064-28162EBDD4EB */ {0xB8,0x5D,0xF4,0xC8,0xBD,0xF5,0x47,0xC1,0x80,0x64,0x28,0x16,0x2E,0xBD,0xD4,0xEB};
BMD_CONST REFIID IID_IDeckLinkProfileAttributes = /* 17D4BF8E-4911-473A-80A0-731CF6FF345B */ {0x17,0xD4,0xBF,0x8E,0x49,0x11,0x47,0x3A,0x80,0xA0,0x73,0x1C,0xF6,0xFF,0x34,0x5B};
BMD_CONST REFIID IID_IDeckLinkProfileIterator = /* 29E5A8C0-8BE4-46EB-93AC-31DAAB5B7BF2 */ {0x29,0xE5,0xA8,0xC0,0x8B,0xE4,0x46,0xEB,0x93,0xAC,0x31,0xDA,0xAB,0x5B,0x7B,0xF2};
BMD_CONST REFIID IID_IDeckLinkProfile = /* 16093466-674A-432B-9DA0-1AC2C5A8241C */ {0x16,0x09,0x34,0x66,0x67,0x4A,0x43,0x2B,0x9D,0xA0,0x1A,0xC2,0xC5,0xA8,0x24,0x1C};
BMD_CONST REFIID IID_IDeckLinkProfileCallback = /* A4F9341E-97AA-4E04-8935-15F809898CEA */ {0xA4,0xF9,0x34,0x1E,0x97,0xAA,0x4E,0x04,0x89,0x35,0x15,0xF8,0x09,0x89,0x8C,0xEA};
BMD_CONST REFIID IID_IDeckLinkProfileManager = /* 30D41429-3998-4B6D-84F8-78C94A797C6E */ {0x30,0xD4,0x14,0x29,0x39,0x98,0x4B,0x6D,0x84,0xF8,0x78,0xC9,0x4A,0x79,0x7C,0x6E};
BMD_CONST REFIID IID_IDeckLinkStatus = /* 5F558200-4028-49BC-BEAC-DB3FA4A96E46 */ {0x5F,0x55,0x82,0x00,0x40,0x28,0x49,0xBC,0xBE,0xAC,0xDB,0x3F,0xA4,0xA9,0x6E,0x46};
BMD_CONST REFIID IID_IDeckLinkKeyer = /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ {0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3};
BMD_CONST REFIID IID_IDeckLinkVideoConversion = /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ {0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A};
@ -103,7 +107,21 @@ enum _BMDVideoOutputFlags {
bmdVideoOutputVANC = 1 << 0,
bmdVideoOutputVITC = 1 << 1,
bmdVideoOutputRP188 = 1 << 2,
bmdVideoOutputDualStream3D = 1 << 4
bmdVideoOutputDualStream3D = 1 << 4,
bmdVideoOutputSynchronizeToPlaybackGroup = 1 << 6
};
/* Enum BMDSupportedVideoModeFlags - Flags to describe supported video mode */
typedef uint32_t BMDSupportedVideoModeFlags;
enum _BMDSupportedVideoModeFlags {
bmdSupportedVideoModeDefault = 0,
bmdSupportedVideoModeKeying = 1 << 0,
bmdSupportedVideoModeDualStream3D = 1 << 1,
bmdSupportedVideoModeSDISingleLink = 1 << 2,
bmdSupportedVideoModeSDIDualLink = 1 << 3,
bmdSupportedVideoModeSDIQuadLink = 1 << 4,
bmdSupportedVideoModeInAnyProfile = 1 << 5
};
/* Enum BMDPacketType - Type of packet */
@ -135,7 +153,8 @@ typedef uint32_t BMDVideoInputFlags;
enum _BMDVideoInputFlags {
bmdVideoInputFlagDefault = 0,
bmdVideoInputEnableFormatDetection = 1 << 0,
bmdVideoInputDualStream3D = 1 << 1
bmdVideoInputDualStream3D = 1 << 1,
bmdVideoInputSynchronizeToCaptureGroup = 1 << 2
};
/* Enum BMDVideoInputFormatChangedEvents - Bitmask passed to the VideoInputFormatChanged notification to identify the properties of the input signal that have changed */
@ -214,15 +233,6 @@ enum _BMDAudioOutputStreamType {
bmdAudioOutputStreamTimestamped
};
/* Enum BMDDisplayModeSupport - Output mode supported flags */
typedef uint32_t BMDDisplayModeSupport;
enum _BMDDisplayModeSupport {
bmdDisplayModeNotSupported = 0,
bmdDisplayModeSupported,
bmdDisplayModeSupportedWithConversion
};
/* Enum BMDAncillaryPacketFormat - Ancillary packet format */
typedef uint32_t BMDAncillaryPacketFormat;
@ -239,7 +249,8 @@ enum _BMDTimecodeFormat {
bmdTimecodeRP188VITC1 = /* 'rpv1' */ 0x72707631, // RP188 timecode where DBB1 equals VITC1 (line 9)
bmdTimecodeRP188VITC2 = /* 'rp12' */ 0x72703132, // RP188 timecode where DBB1 equals VITC2 (line 9 for progressive or line 571 for interlaced/PsF)
bmdTimecodeRP188LTC = /* 'rplt' */ 0x72706C74, // RP188 timecode where DBB1 equals LTC (line 10)
bmdTimecodeRP188Any = /* 'rp18' */ 0x72703138, // For capture: return the first valid timecode in {VITC1, LTC ,VITC2} - For playback: set the timecode as VITC1
bmdTimecodeRP188HighFrameRate = /* 'rphr' */ 0x72706872, // RP188 timecode where DBB1 is an HFRTC (SMPTE ST 12-3), the only timecode allowing the frame value to go above 30
bmdTimecodeRP188Any = /* 'rp18' */ 0x72703138, // Convenience for capture, returning the first valid timecode in {HFRTC (if supported), VITC1, LTC, VITC2}
bmdTimecodeVITC = /* 'vitc' */ 0x76697463,
bmdTimecodeVITCField2 = /* 'vit2' */ 0x76697432,
bmdTimecodeSerial = /* 'seri' */ 0x73657269
@ -384,8 +395,6 @@ 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
@ -432,15 +441,30 @@ enum _BMDDeckLinkFrameMetadataID {
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
bmdDeckLinkFrameMetadataCintelLiftBlue = /* 'GnBl' */ 0x476E426C, // Blue lift parameter to apply after log and gain
bmdDeckLinkFrameMetadataCintelHDRGainRed = /* 'HGRd' */ 0x48475264, // Red gain parameter to apply to linear data for HDR Combination
bmdDeckLinkFrameMetadataCintelHDRGainGreen = /* 'HGGr' */ 0x48474772, // Green gain parameter to apply to linear data for HDR Combination
bmdDeckLinkFrameMetadataCintelHDRGainBlue = /* 'HGBl' */ 0x4847426C // Blue gain parameter to apply to linear data for HDR Combination
};
/* Enum BMDDuplexMode - Duplex for configurable ports */
/* Enum BMDProfileID - Identifies a profile */
typedef uint32_t BMDDuplexMode;
enum _BMDDuplexMode {
bmdDuplexModeFull = /* 'fdup' */ 0x66647570,
bmdDuplexModeHalf = /* 'hdup' */ 0x68647570
typedef uint32_t BMDProfileID;
enum _BMDProfileID {
bmdProfileOneSubDeviceFullDuplex = /* '1dfd' */ 0x31646664,
bmdProfileOneSubDeviceHalfDuplex = /* '1dhd' */ 0x31646864,
bmdProfileTwoSubDevicesFullDuplex = /* '2dfd' */ 0x32646664,
bmdProfileTwoSubDevicesHalfDuplex = /* '2dhd' */ 0x32646864,
bmdProfileFourSubDevicesHalfDuplex = /* '4dhd' */ 0x34646864
};
/* Enum BMDHDMITimecodePacking - Packing form of timecode on HDMI */
typedef uint32_t BMDHDMITimecodePacking;
enum _BMDHDMITimecodePacking {
bmdHDMITimecodePackingIEEEOUI000085 = 0x00008500,
bmdHDMITimecodePackingIEEEOUI080046 = 0x08004601,
bmdHDMITimecodePackingIEEEOUI5CF9F0 = 0x5CF9F003
};
/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */
@ -452,7 +476,6 @@ enum _BMDDeckLinkAttributeID {
BMDDeckLinkSupportsInternalKeying = /* 'keyi' */ 0x6B657969,
BMDDeckLinkSupportsExternalKeying = /* 'keye' */ 0x6B657965,
BMDDeckLinkSupportsHDKeying = /* 'keyh' */ 0x6B657968,
BMDDeckLinkSupportsInputFormatDetection = /* 'infd' */ 0x696E6664,
BMDDeckLinkHasReferenceInput = /* 'hrin' */ 0x6872696E,
BMDDeckLinkHasSerialPort = /* 'hspt' */ 0x68737074,
@ -461,16 +484,19 @@ enum _BMDDeckLinkAttributeID {
BMDDeckLinkHasVideoInputAntiAliasingFilter = /* 'aafl' */ 0x6161666C,
BMDDeckLinkHasBypass = /* 'byps' */ 0x62797073,
BMDDeckLinkSupportsClockTimingAdjustment = /* 'ctad' */ 0x63746164,
BMDDeckLinkSupportsFullDuplex = /* 'fdup' */ 0x66647570,
BMDDeckLinkSupportsFullFrameReferenceInputTimingOffset = /* 'frin' */ 0x6672696E,
BMDDeckLinkSupportsSMPTELevelAOutput = /* 'lvla' */ 0x6C766C61,
BMDDeckLinkSupportsDualLinkSDI = /* 'sdls' */ 0x73646C73,
BMDDeckLinkSupportsQuadLinkSDI = /* 'sqls' */ 0x73716C73,
BMDDeckLinkSupportsIdleOutput = /* 'idou' */ 0x69646F75,
BMDDeckLinkVANCRequires10BitYUVVideoFrames = /* 'vioY' */ 0x76696F59, // Legacy product requires v210 active picture for IDeckLinkVideoFrameAncillaryPackets or 10-bit VANC
BMDDeckLinkHasLTCTimecodeInput = /* 'hltc' */ 0x686C7463,
BMDDeckLinkSupportsDuplexModeConfiguration = /* 'dupx' */ 0x64757078,
BMDDeckLinkSupportsHDRMetadata = /* 'hdrm' */ 0x6864726D,
BMDDeckLinkSupportsColorspaceMetadata = /* 'cmet' */ 0x636D6574,
BMDDeckLinkSupportsHDMITimecode = /* 'htim' */ 0x6874696D,
BMDDeckLinkSupportsHighFrameRateTimecode = /* 'HFRT' */ 0x48465254,
BMDDeckLinkSupportsSynchronizeToCaptureGroup = /* 'stcg' */ 0x73746367,
BMDDeckLinkSupportsSynchronizeToPlaybackGroup = /* 'stpg' */ 0x73747067,
/* Integers */
@ -493,7 +519,8 @@ enum _BMDDeckLinkAttributeID {
BMDDeckLinkAudioInputXLRChannelCount = /* 'aixc' */ 0x61697863,
BMDDeckLinkAudioOutputRCAChannelCount = /* 'aorc' */ 0x616F7263,
BMDDeckLinkAudioOutputXLRChannelCount = /* 'aoxc' */ 0x616F7863,
BMDDeckLinkPairedDevicePersistentID = /* 'ppid' */ 0x70706964,
BMDDeckLinkProfileID = /* 'prid' */ 0x70726964, // Returns a BMDProfileID
BMDDeckLinkDuplex = /* 'dupx' */ 0x64757078,
/* Floats */
@ -539,7 +566,6 @@ enum _BMDDeckLinkStatusID {
bmdDeckLinkStatusLastVideoOutputPixelFormat = /* 'opix' */ 0x6F706978,
bmdDeckLinkStatusReferenceSignalMode = /* 'refm' */ 0x7265666D,
bmdDeckLinkStatusReferenceSignalFlags = /* 'reff' */ 0x72656666,
bmdDeckLinkStatusDuplexMode = /* 'dupx' */ 0x64757078,
bmdDeckLinkStatusBusy = /* 'busy' */ 0x62757379,
bmdDeckLinkStatusInterchangeablePanelType = /* 'icpt' */ 0x69637074,
bmdDeckLinkStatusDeviceTemperature = /* 'dtmp' */ 0x64746D70,
@ -559,14 +585,14 @@ enum _BMDDeckLinkVideoStatusFlags {
bmdDeckLinkVideoStatusDualStream3D = 1 << 1
};
/* Enum BMDDuplexStatus - Duplex status of the device */
/* Enum BMDDuplexMode - Duplex of the device */
typedef uint32_t BMDDuplexStatus;
enum _BMDDuplexStatus {
bmdDuplexStatusFullDuplex = /* 'fdup' */ 0x66647570,
bmdDuplexStatusHalfDuplex = /* 'hdup' */ 0x68647570,
bmdDuplexStatusSimplex = /* 'splx' */ 0x73706C78,
bmdDuplexStatusInactive = /* 'inac' */ 0x696E6163
typedef uint32_t BMDDuplexMode;
enum _BMDDuplexMode {
bmdDuplexFull = /* 'dxfu' */ 0x64786675,
bmdDuplexHalf = /* 'dxha' */ 0x64786861,
bmdDuplexSimplex = /* 'dxsp' */ 0x64787370,
bmdDuplexInactive = /* 'dxin' */ 0x6478696E
};
/* Enum BMDPanelType - The type of interchangeable panel */
@ -646,7 +672,11 @@ class IDeckLinkScreenPreviewCallback;
class IDeckLinkGLScreenPreviewHelper;
class IDeckLinkNotificationCallback;
class IDeckLinkNotification;
class IDeckLinkAttributes;
class IDeckLinkProfileAttributes;
class IDeckLinkProfileIterator;
class IDeckLinkProfile;
class IDeckLinkProfileCallback;
class IDeckLinkProfileManager;
class IDeckLinkStatus;
class IDeckLinkKeyer;
class IDeckLinkVideoConversion;
@ -737,7 +767,8 @@ protected:
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;
virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ BMDDisplayMode *actualMode, /* out */ bool *supported) = 0;
virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;
@ -794,7 +825,8 @@ protected:
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;
virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedPixelFormat, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0;
virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;
@ -846,7 +878,8 @@ protected:
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;
virtual HRESULT DoesSupportVideoMode (/* in */ BMDVideoConnection connection /* If a value of 0 is specified, the caller does not care about the connection */, /* in */ BMDDisplayMode requestedMode, /* in */ BMDPixelFormat requestedCodec, /* in */ uint32_t requestedCodecProfile, /* in */ BMDSupportedVideoModeFlags flags, /* out */ bool *supported) = 0;
virtual HRESULT GetDisplayMode (/* in */ BMDDisplayMode displayMode, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0;
virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0;
/* Video Input */
@ -1116,11 +1149,14 @@ class BMD_PUBLIC IDeckLinkNotification : public IUnknown
public:
virtual HRESULT Subscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0;
virtual HRESULT Unsubscribe (/* in */ BMDNotifications topic, /* in */ IDeckLinkNotificationCallback *theCallback) = 0;
protected:
virtual ~IDeckLinkNotification () {} // call Release method to drop reference count
};
/* Interface IDeckLinkAttributes - DeckLink Attribute interface */
/* Interface IDeckLinkProfileAttributes - Created by QueryInterface from an IDeckLinkProfile, or from IDeckLink. When queried from IDeckLink, interrogates the active profile */
class BMD_PUBLIC IDeckLinkAttributes : public IUnknown
class BMD_PUBLIC IDeckLinkProfileAttributes : public IUnknown
{
public:
virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0;
@ -1129,7 +1165,57 @@ public:
virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ const char **value) = 0;
protected:
virtual ~IDeckLinkAttributes () {} // call Release method to drop reference count
virtual ~IDeckLinkProfileAttributes () {} // call Release method to drop reference count
};
/* Interface IDeckLinkProfileIterator - Enumerates IDeckLinkProfile interfaces */
class BMD_PUBLIC IDeckLinkProfileIterator : public IUnknown
{
public:
virtual HRESULT Next (/* out */ IDeckLinkProfile **profile) = 0;
protected:
virtual ~IDeckLinkProfileIterator () {} // call Release method to drop reference count
};
/* Interface IDeckLinkProfile - Represents the active profile when queried from IDeckLink */
class BMD_PUBLIC IDeckLinkProfile : public IUnknown
{
public:
virtual HRESULT GetDevice (/* out */ IDeckLink **device) = 0; // Device affected when this profile becomes active
virtual HRESULT IsActive (/* out */ bool *isActive) = 0;
virtual HRESULT SetActive (void) = 0; // Activating a profile will also change the profile on all devices enumerated by GetPeers(). Activation is not complete until IDeckLinkProfileCallback::ProfileActivated() is called
virtual HRESULT GetPeers (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // Profiles of other devices activated with this profile
protected:
virtual ~IDeckLinkProfile () {} // call Release method to drop reference count
};
/* Interface IDeckLinkProfileCallback - Receive notifications about profiles related to this device */
class BMD_PUBLIC IDeckLinkProfileCallback : public IUnknown
{
public:
virtual HRESULT ProfileChanging (/* in */ IDeckLinkProfile *profileToBeActivated, /* in */ bool streamsWillBeForcedToStop) = 0; // Called before this device changes profile. User has an opportunity for teardown if streamsWillBeForcedToStop
virtual HRESULT ProfileActivated (/* in */ IDeckLinkProfile *activatedProfile) = 0; // Called after this device has been activated with a new profile
protected:
virtual ~IDeckLinkProfileCallback () {} // call Release method to drop reference count
};
/* Interface IDeckLinkProfileManager - Created by QueryInterface from IDeckLink when a device has multiple optional profiles */
class BMD_PUBLIC IDeckLinkProfileManager : public IUnknown
{
public:
virtual HRESULT GetProfiles (/* out */ IDeckLinkProfileIterator **profileIterator) = 0; // All available profiles for this device
virtual HRESULT GetProfile (/* in */ BMDProfileID profileID, /* out */ IDeckLinkProfile **profile) = 0;
virtual HRESULT SetCallback (/* in */ IDeckLinkProfileCallback *callback) = 0;
protected:
virtual ~IDeckLinkProfileManager () {} // call Release method to drop reference count
};
/* Interface IDeckLinkStatus - DeckLink Status interface */

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 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
@ -46,7 +46,7 @@
// Interface ID Declarations
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_IDeckLinkConfiguration = /* 912F634B-2D4E-40A4-8AAB-8D80B73F1289 */ {0x91,0x2F,0x63,0x4B,0x2D,0x4E,0x40,0xA4,0x8A,0xAB,0x8D,0x80,0xB7,0x3F,0x12,0x89};
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 */
@ -63,7 +63,6 @@ enum _BMDDeckLinkConfigurationID {
bmdDeckLinkConfigHDMI3DPackingFormat = /* '3dpf' */ 0x33647066,
bmdDeckLinkConfigBypass = /* 'byps' */ 0x62797073,
bmdDeckLinkConfigClockTimingAdjustment = /* 'ctad' */ 0x63746164,
bmdDeckLinkConfigDuplexMode = /* 'dupx' */ 0x64757078,
/* Audio Input/Output Flags */
@ -95,6 +94,8 @@ enum _BMDDeckLinkConfigurationID {
bmdDeckLinkConfigDefaultVideoOutputMode = /* 'dvom' */ 0x64766F6D,
bmdDeckLinkConfigDefaultVideoOutputModeFlags = /* 'dvof' */ 0x64766F66,
bmdDeckLinkConfigSDIOutputLinkConfiguration = /* 'solc' */ 0x736F6C63,
bmdDeckLinkConfigHDMITimecodePacking = /* 'htpk' */ 0x6874706B,
bmdDeckLinkConfigPlaybackGroup = /* 'plgr' */ 0x706C6772,
/* Video Output Floats */
@ -126,6 +127,7 @@ enum _BMDDeckLinkConfigurationID {
bmdDeckLinkConfigVANCSourceLine2Mapping = /* 'vsl2' */ 0x76736C32,
bmdDeckLinkConfigVANCSourceLine3Mapping = /* 'vsl3' */ 0x76736C33,
bmdDeckLinkConfigCapturePassThroughMode = /* 'cptm' */ 0x6370746D,
bmdDeckLinkConfigCaptureGroup = /* 'cpgr' */ 0x63706772,
/* Video Input Floats */

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 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

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 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

View file

@ -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
@ -56,20 +56,17 @@ static CreateVideoFrameAncillaryPacketsInstanceFunc gCreateVideoFrameAncillaryPa
static void InitDeckLinkAPI (void)
{
void *libraryHandle;
libraryHandle = dlopen(kDeckLinkAPI_Name, RTLD_NOW|RTLD_GLOBAL);
if (!libraryHandle)
{
/* As we install this plugin regardless if there is a
* proprietary library present or not, let's stay silent
* to avoid poluting the logs */
// fprintf(stderr, "%s\n", dlerror());
fprintf(stderr, "%s\n", dlerror());
return;
}
gLoadedDeckLinkAPI = true;
gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0003");
gCreateIteratorFunc = (CreateIteratorFunc)dlsym(libraryHandle, "CreateDeckLinkIteratorInstance_0004");
if (!gCreateIteratorFunc)
fprintf(stderr, "%s\n", dlerror());
gCreateAPIInformationFunc = (CreateAPIInformationFunc)dlsym(libraryHandle, "CreateDeckLinkAPIInformationInstance_0001");
@ -78,7 +75,7 @@ static void InitDeckLinkAPI (void)
gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)dlsym(libraryHandle, "CreateVideoConversionInstance_0001");
if (!gCreateVideoConversionFunc)
fprintf(stderr, "%s\n", dlerror());
gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0002");
gCreateDeckLinkDiscoveryFunc = (CreateDeckLinkDiscoveryInstanceFunc)dlsym(libraryHandle, "CreateDeckLinkDiscoveryInstance_0003");
if (!gCreateDeckLinkDiscoveryFunc)
fprintf(stderr, "%s\n", dlerror());
gCreateVideoFrameAncillaryPacketsFunc = (CreateVideoFrameAncillaryPacketsInstanceFunc)dlsym(libraryHandle, "CreateVideoFrameAncillaryPacketsInstance_0001");
@ -89,7 +86,7 @@ static void InitDeckLinkAPI (void)
static void InitDeckLinkPreviewAPI (void)
{
void *libraryHandle;
libraryHandle = dlopen(KDeckLinkPreviewAPI_Name, RTLD_NOW|RTLD_GLOBAL);
if (!libraryHandle)
{
@ -112,7 +109,7 @@ bool IsDeckLinkAPIPresent (void)
IDeckLinkIterator* CreateDeckLinkIteratorInstance (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
if (gCreateIteratorFunc == NULL)
return NULL;
return gCreateIteratorFunc();
@ -121,7 +118,7 @@ IDeckLinkIterator* CreateDeckLinkIteratorInstance (void)
IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
if (gCreateAPIInformationFunc == NULL)
return NULL;
return gCreateAPIInformationFunc();
@ -131,7 +128,7 @@ IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
pthread_once(&gPreviewOnceControl, InitDeckLinkPreviewAPI);
if (gCreateOpenGLPreviewFunc == NULL)
return NULL;
return gCreateOpenGLPreviewFunc();
@ -140,7 +137,7 @@ IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void)
IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
if (gCreateVideoConversionFunc == NULL)
return NULL;
return gCreateVideoConversionFunc();
@ -149,7 +146,7 @@ IDeckLinkVideoConversion* CreateVideoConversionInstance (void)
IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
if (gCreateDeckLinkDiscoveryFunc == NULL)
return NULL;
return gCreateDeckLinkDiscoveryFunc();
@ -158,7 +155,7 @@ IDeckLinkDiscovery* CreateDeckLinkDiscoveryInstance (void)
IDeckLinkVideoFrameAncillaryPackets* CreateVideoFrameAncillaryPacketsInstance (void)
{
pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI);
if (gCreateVideoFrameAncillaryPacketsFunc == NULL)
return NULL;
return gCreateVideoFrameAncillaryPacketsFunc();

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 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
@ -69,9 +69,16 @@ enum _BMDDisplayMode {
bmdModeHD1080p25 = /* 'Hp25' */ 0x48703235,
bmdModeHD1080p2997 = /* 'Hp29' */ 0x48703239,
bmdModeHD1080p30 = /* 'Hp30' */ 0x48703330,
bmdModeHD1080p4795 = /* 'Hp47' */ 0x48703437,
bmdModeHD1080p48 = /* 'Hp48' */ 0x48703438,
bmdModeHD1080p50 = /* 'Hp50' */ 0x48703530,
bmdModeHD1080p5994 = /* 'Hp59' */ 0x48703539,
bmdModeHD1080p6000 = /* 'Hp60' */ 0x48703630, // N.B. This _really_ is 60.00 Hz.
bmdModeHD1080p9590 = /* 'Hp95' */ 0x48703935,
bmdModeHD1080p96 = /* 'Hp96' */ 0x48703936,
bmdModeHD1080p100 = /* 'Hp10' */ 0x48703130,
bmdModeHD1080p11988 = /* 'Hp11' */ 0x48703131,
bmdModeHD1080p120 = /* 'Hp12' */ 0x48703132,
bmdModeHD1080i50 = /* 'Hi50' */ 0x48693530,
bmdModeHD1080i5994 = /* 'Hi59' */ 0x48693539,
bmdModeHD1080i6000 = /* 'Hi60' */ 0x48693630, // N.B. This _really_ is 60.00 Hz.
@ -95,9 +102,16 @@ enum _BMDDisplayMode {
bmdMode2kDCI25 = /* '2d25' */ 0x32643235,
bmdMode2kDCI2997 = /* '2d29' */ 0x32643239,
bmdMode2kDCI30 = /* '2d30' */ 0x32643330,
bmdMode2kDCI4795 = /* '2d47' */ 0x32643437,
bmdMode2kDCI48 = /* '2d48' */ 0x32643438,
bmdMode2kDCI50 = /* '2d50' */ 0x32643530,
bmdMode2kDCI5994 = /* '2d59' */ 0x32643539,
bmdMode2kDCI60 = /* '2d60' */ 0x32643630,
bmdMode2kDCI9590 = /* '2d95' */ 0x32643935,
bmdMode2kDCI96 = /* '2d96' */ 0x32643936,
bmdMode2kDCI100 = /* '2d10' */ 0x32643130,
bmdMode2kDCI11988 = /* '2d11' */ 0x32643131,
bmdMode2kDCI120 = /* '2d12' */ 0x32643132,
/* 4K UHD Modes */
@ -106,9 +120,16 @@ enum _BMDDisplayMode {
bmdMode4K2160p25 = /* '4k25' */ 0x346B3235,
bmdMode4K2160p2997 = /* '4k29' */ 0x346B3239,
bmdMode4K2160p30 = /* '4k30' */ 0x346B3330,
bmdMode4K2160p4795 = /* '4k47' */ 0x346B3437,
bmdMode4K2160p48 = /* '4k48' */ 0x346B3438,
bmdMode4K2160p50 = /* '4k50' */ 0x346B3530,
bmdMode4K2160p5994 = /* '4k59' */ 0x346B3539,
bmdMode4K2160p60 = /* '4k60' */ 0x346B3630,
bmdMode4K2160p9590 = /* '4k95' */ 0x346B3935,
bmdMode4K2160p96 = /* '4k96' */ 0x346B3936,
bmdMode4K2160p100 = /* '4k10' */ 0x346B3130,
bmdMode4K2160p11988 = /* '4k11' */ 0x346B3131,
bmdMode4K2160p120 = /* '4k12' */ 0x346B3132,
/* 4K DCI Modes */
@ -117,9 +138,16 @@ enum _BMDDisplayMode {
bmdMode4kDCI25 = /* '4d25' */ 0x34643235,
bmdMode4kDCI2997 = /* '4d29' */ 0x34643239,
bmdMode4kDCI30 = /* '4d30' */ 0x34643330,
bmdMode4kDCI4795 = /* '4d47' */ 0x34643437,
bmdMode4kDCI48 = /* '4d48' */ 0x34643438,
bmdMode4kDCI50 = /* '4d50' */ 0x34643530,
bmdMode4kDCI5994 = /* '4d59' */ 0x34643539,
bmdMode4kDCI60 = /* '4d60' */ 0x34643630,
bmdMode4kDCI9590 = /* '4d95' */ 0x34643935,
bmdMode4kDCI96 = /* '4d96' */ 0x34643936,
bmdMode4kDCI100 = /* '4d10' */ 0x34643130,
bmdMode4kDCI11988 = /* '4d11' */ 0x34643131,
bmdMode4kDCI120 = /* '4d12' */ 0x34643132,
/* 8K UHD Modes */
@ -128,6 +156,8 @@ enum _BMDDisplayMode {
bmdMode8K4320p25 = /* '8k25' */ 0x386B3235,
bmdMode8K4320p2997 = /* '8k29' */ 0x386B3239,
bmdMode8K4320p30 = /* '8k30' */ 0x386B3330,
bmdMode8K4320p4795 = /* '8k47' */ 0x386B3437,
bmdMode8K4320p48 = /* '8k48' */ 0x386B3438,
bmdMode8K4320p50 = /* '8k50' */ 0x386B3530,
bmdMode8K4320p5994 = /* '8k59' */ 0x386B3539,
bmdMode8K4320p60 = /* '8k60' */ 0x386B3630,
@ -139,10 +169,31 @@ enum _BMDDisplayMode {
bmdMode8kDCI25 = /* '8d25' */ 0x38643235,
bmdMode8kDCI2997 = /* '8d29' */ 0x38643239,
bmdMode8kDCI30 = /* '8d30' */ 0x38643330,
bmdMode8kDCI4795 = /* '8d47' */ 0x38643437,
bmdMode8kDCI48 = /* '8d48' */ 0x38643438,
bmdMode8kDCI50 = /* '8d50' */ 0x38643530,
bmdMode8kDCI5994 = /* '8d59' */ 0x38643539,
bmdMode8kDCI60 = /* '8d60' */ 0x38643630,
/* PC Modes */
bmdMode640x480p60 = /* 'vga6' */ 0x76676136,
bmdMode800x600p60 = /* 'svg6' */ 0x73766736,
bmdMode1440x900p50 = /* 'wxg5' */ 0x77786735,
bmdMode1440x900p60 = /* 'wxg6' */ 0x77786736,
bmdMode1440x1080p50 = /* 'sxg5' */ 0x73786735,
bmdMode1440x1080p60 = /* 'sxg6' */ 0x73786736,
bmdMode1600x1200p50 = /* 'uxg5' */ 0x75786735,
bmdMode1600x1200p60 = /* 'uxg6' */ 0x75786736,
bmdMode1920x1200p50 = /* 'wux5' */ 0x77757835,
bmdMode1920x1200p60 = /* 'wux6' */ 0x77757836,
bmdMode1920x1440p50 = /* '1945' */ 0x31393435,
bmdMode1920x1440p60 = /* '1946' */ 0x31393436,
bmdMode2560x1440p50 = /* 'wqh5' */ 0x77716835,
bmdMode2560x1440p60 = /* 'wqh6' */ 0x77716836,
bmdMode2560x1600p50 = /* 'wqx5' */ 0x77717835,
bmdMode2560x1600p60 = /* 'wqx6' */ 0x77717836,
/* RAW Modes for Cintel (input only) */
bmdModeCintelRAW = /* 'rwci' */ 0x72776369, // Frame size up to 4096x3072, variable frame rate
@ -168,6 +219,7 @@ enum _BMDFieldDominance {
typedef uint32_t BMDPixelFormat;
enum _BMDPixelFormat {
bmdFormatUnspecified = 0,
bmdFormat8BitYUV = /* '2vuy' */ 0x32767579,
bmdFormat10BitYUV = /* 'v210' */ 0x76323130,
bmdFormat8BitARGB = 32,

View file

@ -1,5 +1,5 @@
/* -LICENSE-START-
** Copyright (c) 2018 Blackmagic Design
** Copyright (c) 2019 Blackmagic Design
**
** Permission is hereby granted, free of charge, to any person or organization
** obtaining a copy of the software and accompanying documentation covered by
@ -59,13 +59,16 @@ enum _BMDTimecodeFlags {
bmdTimecodeFlagDefault = 0,
bmdTimecodeIsDropFrame = 1 << 0,
bmdTimecodeFieldMark = 1 << 1,
bmdTimecodeColorFrame = 1 << 2
bmdTimecodeColorFrame = 1 << 2,
bmdTimecodeEmbedRecordingTrigger = 1 << 3, // On SDI recording trigger utilises a user-bit
bmdTimecodeRecordingTriggered = 1 << 4
};
/* Enum BMDVideoConnection - Video connection types */
typedef uint32_t BMDVideoConnection;
enum _BMDVideoConnection {
bmdVideoConnectionUnspecified = 0,
bmdVideoConnectionSDI = 1 << 0,
bmdVideoConnectionHDMI = 1 << 1,
bmdVideoConnectionOpticalSDI = 1 << 2,

View file

@ -30,8 +30,8 @@
#ifndef __DeckLink_API_Version_h__
#define __DeckLink_API_Version_h__
#define BLACKMAGIC_DECKLINK_API_VERSION 0x0a0b0400
#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "10.11.4"
#define BLACKMAGIC_DECKLINK_API_VERSION 0x0b020000
#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "11.2"
#endif // __DeckLink_API_Version_h__