X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=decklink_util.cpp;h=4b701abed3799448d2d6755652190a1c57769b77;hb=refs%2Ftags%2F1.7.4;hp=0e775dea4981b709077701389e30c40b4061b8ed;hpb=00bcd63104da3965714baaffd3bf6526e85a6f26;p=nageru diff --git a/decklink_util.cpp b/decklink_util.cpp index 0e775de..4b701ab 100644 --- a/decklink_util.cpp +++ b/decklink_util.cpp @@ -1,7 +1,10 @@ #include #include +#include + #include "decklink_util.h" +#include "flags.h" using namespace bmusb; using namespace std; @@ -18,6 +21,7 @@ map summarize_video_modes(IDeckLinkDisplayModeIterator *mod mode.name = "Unknown mode"; } else { mode.name = mode_name; + free((char *)mode_name); } mode.autodetect = false; @@ -43,3 +47,46 @@ map summarize_video_modes(IDeckLinkDisplayModeIterator *mod return video_modes; } + +BMDVideoConnection pick_default_video_connection(IDeckLink *card, BMDDeckLinkAttributeID attribute_id, unsigned card_index) +{ + assert(attribute_id == BMDDeckLinkVideoInputConnections || + attribute_id == BMDDeckLinkVideoOutputConnections); + + IDeckLinkAttributes *attr; + if (card->QueryInterface(IID_IDeckLinkAttributes, (void**)&attr) != S_OK) { + fprintf(stderr, "Card %u has no attributes\n", card_index); + exit(1); + } + + int64_t connection_mask; + if (attr->GetInt(attribute_id, &connection_mask) != S_OK) { + if (attribute_id == BMDDeckLinkVideoInputConnections) { + fprintf(stderr, "Failed to enumerate video inputs for card %u\n", card_index); + } else { + fprintf(stderr, "Failed to enumerate video outputs for card %u\n", card_index); + } + exit(1); + } + attr->Release(); + if (connection_mask == 0) { + if (attribute_id == BMDDeckLinkVideoInputConnections) { + fprintf(stderr, "Card %u has no input connections\n", card_index); + } else { + fprintf(stderr, "Card %u has no output connections\n", card_index); + } + exit(1); + } + + if ((connection_mask & bmdVideoConnectionHDMI) && + global_flags.default_hdmi_input) { + return bmdVideoConnectionHDMI; + } else if (connection_mask & bmdVideoConnectionSDI) { + return bmdVideoConnectionSDI; + } else if (connection_mask & bmdVideoConnectionHDMI) { + return bmdVideoConnectionHDMI; + } else { + // Fallback: Return lowest-set bit, whatever that might be. + return connection_mask & (-connection_mask); + } +}