DeckLink: correctly set duplex mode for quad-link

Correctly set the duplex mode for quad-link (implies
bmdProfileOneSubDevicesHalfDuplex).

* changed the duplex options
+ slightly modified usage
This commit is contained in:
Martin Pulec
2019-06-06 16:28:56 +02:00
parent 4151df3d90
commit f625f8529f
2 changed files with 26 additions and 16 deletions

View File

@@ -82,6 +82,9 @@
#define STDMETHODCALLTYPE
#endif
#define DEFAULT 0
#define KEEP -1
#define RELEASE_IF_NOT_NULL(x) if (x != nullptr) { x->Release(); x = nullptr; }
using namespace std;
@@ -436,8 +439,8 @@ decklink_help()
cout << style::bold << "[no]passthrough\n" << style::reset;
printf("\tEnable/disable capture passthrough.\n");
printf("\n");
cout << style::bold << "half-duplex|full-duplex|no-half-duplex\n" << style::reset;
printf("\tUse half-/full-duplex, no-half-duplex suppresses automatically set half-duplex (for quad-link)\n");
cout << style::bold << "half-duplex|full-duplex|one-device-half-duplex|keep-duplex\n" << style::reset;
printf("\tUse half-/full-duplex (1-dev-1/2-duplex is for 8K Pro), keep-duplex suppresses automatically set one-device-half-duplex (for quad-link)\n");
printf("\n");
cout << style::bold << "single-/dual-/quad-link\n" << style::reset;
printf("\tUse single-/dual-/quad-link.\n");
@@ -601,8 +604,12 @@ static bool parse_option(struct vidcap_decklink_state *s, const char *opt)
: bmdDeckLinkCapturePassthroughModeCleanSwitch;
} else if (strcasecmp(opt, "half-duplex") == 0) {
s->duplex = bmdDuplexHalf;
} else if (strcasecmp(opt, "one-device-half-duplex") == 0) {
s->duplex = bmdDuplexSimplex;
} else if (strcasecmp(opt, "full-duplex") == 0) {
s->duplex = bmdDuplexFull;
} else if (strcasecmp(opt, "keep-duplex") == 0) {
s->duplex = KEEP;
} else if (strcasecmp(opt, "single-link") == 0) {
s->link = bmdLinkConfigurationSingleLink;
} else if (strcasecmp(opt, "dual-link") == 0) {
@@ -960,12 +967,11 @@ vidcap_decklink_init(const struct vidcap_params *params, void **state)
}
if (s->link == bmdLinkConfigurationQuadLink) {
if (s->duplex == bmdDuplexFull) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Setting quad-link and full-duplex may not be supported!\n";
}
if (s->duplex == 0) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Quad-link detected - setting half-duplex automatically, use 'no-half-duplex' to override.\n";
s->duplex = bmdDuplexHalf;
if (s->duplex == DEFAULT) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Quad-link detected - setting half-duplex automatically, use 'keep-duplex' to override.\n";
s->duplex = bmdDuplexSimplex;
} else (s->duplex != KEEP) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Setting quad-link and duplex mode that may not be supported!\n";
}
}
@@ -1069,7 +1075,7 @@ vidcap_decklink_init(const struct vidcap_params *params, void **state)
LOG(LOG_LEVEL_INFO) << "Using device " << deviceName << "\n";
}
if (s->duplex != 0 && s->duplex != (uint32_t) -1) {
if (s->duplex != DEFAULT && s->duplex != (uint32_t) KEEP) {
decklink_set_duplex(s->state[i].deckLink, (BMDDuplexMode) s->duplex);
}

View File

@@ -320,7 +320,7 @@ static void show_help(bool full)
int numDevices = 0;
printf("Decklink (output) options:\n");
cout << style::bold << fg::red << "\t-d decklink[:device=<device(s)>]" << fg::reset << "[:timecode][:single-link|:dual-link|:quad-link][:LevelA|:LevelB][:3D[:HDMI3DPacking=<packing>]][:audio_level={line|mic}][:conversion=<fourcc>][:Use1080pNotPsF={true|false}][:[no-]low-latency][:half-duplex|full-duplex][:quad-[no-]square]\n" << style::reset;
cout << style::bold << fg::red << "\t-d decklink[:device=<device(s)>]" << fg::reset << "[:fullhelp][:timecode][:<X>-link][:Level{A|B}][:3D[:HDMI3DPacking=<packing>]][:audio_level={line|mic}][:conversion=<fourcc>][:Use1080pNotPsF={true|false}][:[no-]low-latency][:<X>-duplex][:quad-[no-]square]\n" << style::reset;
cout << style::bold << "\t\t<device(s)>" << style::reset << " is coma-separated indices or names of output devices\n";
cout << style::bold << "\t\tsingle-link/dual-link/quad-link" << style::reset << " specifies if the video output will be in a single-link (HD/3G/6G/12G), dual-link HD-SDI mode or quad-link HD/3G/6G/12G\n";
cout << style::bold << "\t\tLevelA/LevelB" << style::reset << " specifies 3G-SDI output level\n";
@@ -345,6 +345,9 @@ static void show_help(bool full)
style::bold << "\t\t\tup1i" << style::reset << " - simultaneous output of SD and up-converted pollarbox 1080i\n";
cout << style::bold << "\t\tHDMI3DPacking" << style::reset << " can be:\n" <<
style::bold << "\t\t\tSideBySideHalf, LineByLine, TopAndBottom, FramePacking, LeftOnly, RightOnly\n" << style::reset;
cout << style::bold << "\t\thalf-duplex|full-duplex|one-device-half-duplex|keep-duplex\n" << style::reset;
cout << "\t\t\tUse half-/full-duplex (1-dev-1/2-duplex is for 8K Pro), keep-duplex suppresses automatically set one-device-half-duplex (for quad-link)\n";
}
// Create an IDeckLinkIterator object to enumerate all DeckLink cards in the system
@@ -726,13 +729,12 @@ display_decklink_reconfigure_video(void *state, struct video_desc desc)
}
CALL_AND_CHECK(s->state[i].deckLinkConfiguration->SetInt(bmdDeckLinkConfigSDIOutputLinkConfiguration, link), "Unable set output SDI link mode");
if (link == bmdLinkConfigurationQuadLink && s->duplex_req == bmdDuplexFull) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Setting quad-link and full-duplex may not be supported!\n";
}
if (s->duplex_req == DEFAULT && link == bmdLinkConfigurationQuadLink) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Quad-link detected - setting half-duplex automatically, use 'no-half-duplex' to override.\n";
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Quad-link detected - setting half-duplex automatically, use 'keep-duplex' to override.\n";
decklink_set_duplex(s->state[i].deckLink, bmdDuplexSimplex);
} else if (link == bmdLinkConfigurationQuadLink && s->duplex_req != KEEP) {
LOG(LOG_LEVEL_WARNING) << MOD_NAME "Setting quad-link and an incompatible duplex may not be supported!\n";
}
BMD_BOOL quad_link_supp;
@@ -939,10 +941,12 @@ static void *display_decklink_init(struct module *parent, const char *fmt, unsig
s->link_req = bmdLinkConfigurationQuadLink;
} else if(strcasecmp(ptr, "half-duplex") == 0) {
s->duplex_req = bmdDuplexHalf;
} else if(strcasecmp(ptr, "no-half-duplex") == 0) {
s->duplex_req = KEEP;
} else if(strcasecmp(ptr, "one-device-half-duplex") == 0) {
s->duplex_req = bmdDuplexSimplex;
} else if(strcasecmp(ptr, "full-duplex") == 0) {
s->duplex_req = bmdDuplexFull;
} else if(strcasecmp(ptr, "keep-duplex") == 0) {
s->duplex_req = KEEP;
} else if(strcasecmp(ptr, "LevelA") == 0) {
s->level = 'A';
} else if(strcasecmp(ptr, "LevelB") == 0) {