]> git.sesse.net Git - nageru/blobdiff - decklink_util.cpp
Release Nageru 1.7.4.
[nageru] / decklink_util.cpp
index 0e775dea4981b709077701389e30c40b4061b8ed..4b701abed3799448d2d6755652190a1c57769b77 100644 (file)
@@ -1,7 +1,10 @@
 #include <DeckLinkAPI.h>
 #include <DeckLinkAPIModes.h>
 
+#include <assert.h>
+
 #include "decklink_util.h"
+#include "flags.h"
 
 using namespace bmusb;
 using namespace std;
@@ -18,6 +21,7 @@ map<uint32_t, VideoMode> 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<uint32_t, VideoMode> 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);
+       }
+}