diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index 7742aa4370..b2160f1971 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -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); diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index 790dfc19f9..6ee0a13c2d 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -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; diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp index e3a6775483..9a27d26f79 100644 --- a/sys/decklink/gstdecklinkvideosink.cpp +++ b/sys/decklink/gstdecklinkvideosink.cpp @@ -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, diff --git a/sys/decklink/gstdecklinkvideosink.h b/sys/decklink/gstdecklinkvideosink.h index 06f5b762f6..fa88a86e79 100644 --- a/sys/decklink/gstdecklinkvideosink.h +++ b/sys/decklink/gstdecklinkvideosink.h @@ -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; diff --git a/sys/decklink/gstdecklinkvideosrc.cpp b/sys/decklink/gstdecklinkvideosrc.cpp index 4106d68e6f..0a84fb9632 100644 --- a/sys/decklink/gstdecklinkvideosrc.cpp +++ b/sys/decklink/gstdecklinkvideosrc.cpp @@ -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, diff --git a/sys/decklink/gstdecklinkvideosrc.h b/sys/decklink/gstdecklinkvideosrc.h index 837bf43188..a56d6ca50c 100644 --- a/sys/decklink/gstdecklinkvideosrc.h +++ b/sys/decklink/gstdecklinkvideosrc.h @@ -71,7 +71,7 @@ struct _GstDecklinkVideoSrc GstVideoInfo info; GstDecklinkVideoFormat video_format; - BMDDuplexMode duplex_mode; + BMDProfileID profile_id; BMDTimecodeFormat timecode_format; GstDecklinkInput *input; diff --git a/sys/decklink/linux/DeckLinkAPI.h b/sys/decklink/linux/DeckLinkAPI.h index e113fc38aa..21d172b982 100644 --- a/sys/decklink/linux/DeckLinkAPI.h +++ b/sys/decklink/linux/DeckLinkAPI.h @@ -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 */ diff --git a/sys/decklink/linux/DeckLinkAPIConfiguration.h b/sys/decklink/linux/DeckLinkAPIConfiguration.h index 430f87154a..e472f73e15 100644 --- a/sys/decklink/linux/DeckLinkAPIConfiguration.h +++ b/sys/decklink/linux/DeckLinkAPIConfiguration.h @@ -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 */ diff --git a/sys/decklink/linux/DeckLinkAPIDeckControl.h b/sys/decklink/linux/DeckLinkAPIDeckControl.h index e0522a2315..5cfbcec506 100644 --- a/sys/decklink/linux/DeckLinkAPIDeckControl.h +++ b/sys/decklink/linux/DeckLinkAPIDeckControl.h @@ -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 diff --git a/sys/decklink/linux/DeckLinkAPIDiscovery.h b/sys/decklink/linux/DeckLinkAPIDiscovery.h index d6619caa18..ff9ce337af 100644 --- a/sys/decklink/linux/DeckLinkAPIDiscovery.h +++ b/sys/decklink/linux/DeckLinkAPIDiscovery.h @@ -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 diff --git a/sys/decklink/linux/DeckLinkAPIDispatch.cpp b/sys/decklink/linux/DeckLinkAPIDispatch.cpp index 67cf4188a4..02bed76ed2 100644 --- a/sys/decklink/linux/DeckLinkAPIDispatch.cpp +++ b/sys/decklink/linux/DeckLinkAPIDispatch.cpp @@ -7,14 +7,14 @@ ** execute, and transmit the Software, and to prepare derivative works of the ** Software, and to permit third-parties to whom the Software is furnished to ** do so, all subject to the following: -** +** ** The copyright notices in the Software and this entire statement, including ** the above license grant, this restriction and the following disclaimer, ** must be included in all copies of the Software, in whole or in part, and ** all derivative works of the Software, unless such copies or derivative ** works are solely in the form of machine-executable object code generated by ** a source language processor. -** +** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT @@ -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(); diff --git a/sys/decklink/linux/DeckLinkAPIModes.h b/sys/decklink/linux/DeckLinkAPIModes.h index 543aaa1f7f..0280a85057 100644 --- a/sys/decklink/linux/DeckLinkAPIModes.h +++ b/sys/decklink/linux/DeckLinkAPIModes.h @@ -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, diff --git a/sys/decklink/linux/DeckLinkAPITypes.h b/sys/decklink/linux/DeckLinkAPITypes.h index 559126282a..a4ef6358db 100644 --- a/sys/decklink/linux/DeckLinkAPITypes.h +++ b/sys/decklink/linux/DeckLinkAPITypes.h @@ -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, diff --git a/sys/decklink/linux/DeckLinkAPIVersion.h b/sys/decklink/linux/DeckLinkAPIVersion.h index f9db7ff18f..b032e93715 100644 --- a/sys/decklink/linux/DeckLinkAPIVersion.h +++ b/sys/decklink/linux/DeckLinkAPIVersion.h @@ -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__