[vlc-commits] vout: decklink: check video connection parameter
Francois Cartegnie
git at videolan.org
Mon Nov 28 19:44:34 CET 2016
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Nov 28 19:17:57 2016 +0100| [19d9eb8e1226ef38c38b810272d84fff0e8e274d] | committer: Francois Cartegnie
vout: decklink: check video connection parameter
Does not fail on setting
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=19d9eb8e1226ef38c38b810272d84fff0e8e274d
---
modules/video_output/decklink.cpp | 95 +++++++++++++++++++++++++++------------
1 file changed, 66 insertions(+), 29 deletions(-)
diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp
index 05b8b4b..ae52a6d 100644
--- a/modules/video_output/decklink.cpp
+++ b/modules/video_output/decklink.cpp
@@ -120,14 +120,34 @@ static const int pi_channels_maps[CHANNELS_MAX+1] =
#define VIDEO_CFG_PREFIX "decklink-vout-"
#define AUDIO_CFG_PREFIX "decklink-aout-"
-
-
+/* Video Connections */
static const char *const ppsz_videoconns[] = {
- "sdi", "hdmi", "opticalsdi", "component", "composite", "svideo"
+ "sdi",
+ "hdmi",
+ "opticalsdi",
+ "component",
+ "composite",
+ "svideo"
};
static const char *const ppsz_videoconns_text[] = {
- N_("SDI"), N_("HDMI"), N_("Optical SDI"), N_("Component"), N_("Composite"), N_("S-video")
+ "SDI",
+ "HDMI",
+ "Optical SDI",
+ "Component",
+ "Composite",
+ "S-video",
+};
+static const BMDVideoConnection rgbmd_videoconns[] =
+{
+ bmdVideoConnectionSDI,
+ bmdVideoConnectionHDMI,
+ bmdVideoConnectionOpticalSDI,
+ bmdVideoConnectionComponent,
+ bmdVideoConnectionComposite,
+ bmdVideoConnectionSVideo,
};
+static_assert(ARRAY_SIZE(rgbmd_videoconns) == ARRAY_SIZE(ppsz_videoconns), "videoconn arrays messed up");
+static_assert(ARRAY_SIZE(rgbmd_videoconns) == ARRAY_SIZE(ppsz_videoconns_text), "videoconn arrays messed up");
static const int rgi_afd_values[] = {
0, 2, 3, 4, 8, 9, 10, 11, 13, 14, 15,
@@ -313,28 +333,27 @@ static void ReleaseDLSys(vlc_object_t *obj)
vlc_mutex_unlock(&sys_lock);
}
-static BMDVideoConnection getVConn(vout_display_t *vd)
+static BMDVideoConnection getVConn(vout_display_t *vd, BMDVideoConnection mask)
{
- BMDVideoConnection conn = bmdVideoConnectionSDI;
+ BMDVideoConnection conn = 0;
char *psz = var_InheritString(vd, VIDEO_CFG_PREFIX "video-connection");
- if (!psz)
- goto end;
-
- if (!strcmp(psz, "sdi"))
- conn = bmdVideoConnectionSDI;
- else if (!strcmp(psz, "hdmi"))
- conn = bmdVideoConnectionHDMI;
- else if (!strcmp(psz, "opticalsdi"))
- conn = bmdVideoConnectionOpticalSDI;
- else if (!strcmp(psz, "component"))
- conn = bmdVideoConnectionComponent;
- else if (!strcmp(psz, "composite"))
- conn = bmdVideoConnectionComposite;
- else if (!strcmp(psz, "svideo"))
- conn = bmdVideoConnectionSVideo;
-
-end:
- free(psz);
+ if (psz)
+ {
+ for(size_t i=0; i<ARRAY_SIZE(rgbmd_videoconns); i++)
+ {
+ if (!strcmp(psz, ppsz_videoconns[i]) && (mask & rgbmd_videoconns[i]))
+ {
+ conn = rgbmd_videoconns[i];
+ break;
+ }
+ }
+ free(psz);
+ }
+ else /* Pick one as default connection */
+ {
+ conn = ctz(mask);
+ conn = conn ? ( 1 << conn ) : bmdVideoConnectionSDI;
+ }
return conn;
}
@@ -514,6 +533,7 @@ static int OpenDecklink(vout_display_t *vd, struct decklink_sys_t *decklink_sys)
IDeckLinkIterator *decklink_iterator = NULL;
IDeckLinkDisplayMode *p_display_mode = NULL;
IDeckLinkConfiguration *p_config = NULL;
+ IDeckLinkAttributes *p_attributes = NULL;
IDeckLink *p_card = NULL;
BMDDisplayMode wanted_mode_id = bmdDisplayModeNotSupported;
@@ -525,8 +545,8 @@ static int OpenDecklink(vout_display_t *vd, struct decklink_sys_t *decklink_sys)
vlc_cond_wait(&decklink_sys->cond, &decklink_sys->lock);
int i_card_index = var_InheritInteger(vd, CFG_PREFIX "card-index");
- BMDVideoConnection vconn = getVConn(vd);
char *mode = var_InheritString(vd, VIDEO_CFG_PREFIX "mode");
+
if(mode)
{
size_t len = strlen(mode);
@@ -569,6 +589,15 @@ static int OpenDecklink(vout_display_t *vd, struct decklink_sys_t *decklink_sys)
msg_Dbg(vd, "Opened DeckLink PCI card %s", psz_model_name);
+ /* Read attributes */
+
+ result = p_card->QueryInterface(IID_IDeckLinkAttributes, (void**)&p_attributes);
+ CHECK("Could not get IDeckLinkAttributes");
+
+ int64_t vconn;
+ result = p_attributes->GetInt(BMDDeckLinkVideoOutputConnections, &vconn); /* reads mask */
+ CHECK("Could not get BMDDeckLinkVideoOutputConnections");
+
result = p_card->QueryInterface(IID_IDeckLinkOutput,
(void**)&decklink_sys->p_output);
CHECK("No outputs");
@@ -577,13 +606,18 @@ static int OpenDecklink(vout_display_t *vd, struct decklink_sys_t *decklink_sys)
(void**)&p_config);
CHECK("Could not get config interface");
- if (vconn)
+ /* Now configure card */
+
+ vconn = getVConn(vd, (BMDVideoConnection) vconn);
+ if (vconn == 0)
{
- result = p_config->SetInt(
- bmdDeckLinkConfigVideoOutputConnection, vconn);
- CHECK("Could not set video output connection");
+ msg_Err(vd, "Invalid video connection specified");
+ goto error;
}
+ result = p_config->SetInt(bmdDeckLinkConfigVideoOutputConnection, (BMDVideoConnection) vconn);
+ CHECK("Could not set video output connection");
+
p_display_mode = MatchDisplayMode(vd, decklink_sys->p_output,
fmt, wanted_mode_id);
if(p_display_mode == NULL)
@@ -660,6 +694,7 @@ static int OpenDecklink(vout_display_t *vd, struct decklink_sys_t *decklink_sys)
p_config->Release();
p_display_mode->Release();
p_card->Release();
+ p_attributes->Release();
decklink_iterator->Release();
vlc_mutex_unlock(&decklink_sys->lock);
@@ -677,6 +712,8 @@ error:
p_card->Release();
if (p_config)
p_config->Release();
+ if (p_attributes)
+ p_attributes->Release();
if (decklink_iterator)
decklink_iterator->Release();
if (p_display_mode)
More information about the vlc-commits
mailing list