exit(1);
}
- set_video_input(bmdVideoConnectionHDMI);
+ BMDVideoConnection connection = pick_default_video_connection(card, BMDDeckLinkVideoInputConnections, card_index);
+
+ set_video_input(connection);
set_audio_input(bmdAudioConnectionEmbedded);
IDeckLinkDisplayModeIterator *mode_it;
}
mode_it->Release();
+
+ // HDMI or SDI generally mean “both HDMI and SDI at the same time” on DeckLink cards
+ // that support both; pick_default_video_connection() will generally pick one of those
+ // if they exist. We're not very likely to need analog outputs, so we don't need a way
+ // to change beyond that.
+ video_connection = pick_default_video_connection(decklink, BMDDeckLinkVideoOutputConnections, card_index);
}
void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
fprintf(stderr, "Failed to set low latency output\n");
exit(1);
}
- // HDMI or SDI generally mean “both HDMI and SDI at the same time” on DeckLink cards.
- // We're not very likely to need analog outputs.
- if (config->SetInt(bmdDeckLinkConfigVideoOutputConnection, bmdVideoConnectionHDMI) != S_OK) {
+ if (config->SetInt(bmdDeckLinkConfigVideoOutputConnection, video_connection) != S_OK) {
fprintf(stderr, "Failed to set video output connection for card %u\n", card_index);
exit(1);
}
movit::ResourcePool *resource_pool;
IDeckLinkOutput *output = nullptr;
+ BMDVideoConnection video_connection;
QSurface *surface;
unsigned width, height;
unsigned card_index;
#include <DeckLinkAPI.h>
#include <DeckLinkAPIModes.h>
+#include <assert.h>
+
#include "decklink_util.h"
using namespace bmusb;
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 outpu connectionss\n", card_index);
+ }
+ exit(1);
+ }
+
+ if (connection_mask & bmdVideoConnectionHDMI) {
+ return bmdVideoConnectionHDMI;
+ } else if (connection_mask & bmdVideoConnectionSDI) {
+ return bmdVideoConnectionSDI;
+ } else {
+ // Fallback: Return lowest-set bit, whatever that might be.
+ return connection_mask & (-connection_mask);
+ }
+}
std::map<uint32_t, bmusb::VideoMode> summarize_video_modes(IDeckLinkDisplayModeIterator *mode_it, unsigned card_index);
+// Picks a video connection that the card supports. Priority list: HDMI, SDI, anything else.
+BMDVideoConnection pick_default_video_connection(IDeckLink *card, BMDDeckLinkAttributeID attribute_id, unsigned card_index);
+
#endif // !defined(_DECKLINK_UTIL)