mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
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:
parent
9ecdfea7da
commit
c6151f635f
14 changed files with 330 additions and 245 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -71,7 +71,7 @@ struct _GstDecklinkVideoSrc
|
|||
|
||||
GstVideoInfo info;
|
||||
GstDecklinkVideoFormat video_format;
|
||||
BMDDuplexMode duplex_mode;
|
||||
BMDProfileID profile_id;
|
||||
BMDTimecodeFormat timecode_format;
|
||||
|
||||
GstDecklinkInput *input;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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__
|
||||
|
||||
|
|
Loading…
Reference in a new issue