});
}
-void DeckLinkOutput::set_device(IDeckLink *decklink)
+bool DeckLinkOutput::set_device(IDeckLink *decklink)
{
if (decklink->QueryInterface(IID_IDeckLinkOutput, (void**)&output) != S_OK) {
- fprintf(stderr, "Card %u has no outputs\n", card_index);
- exit(1);
+ fprintf(stderr, "Warning: Card %u has no outputs\n", card_index);
+ return false;
}
IDeckLinkDisplayModeIterator *mode_it;
if (output->GetDisplayModeIterator(&mode_it) != S_OK) {
- fprintf(stderr, "Failed to enumerate output display modes for card %u\n", card_index);
- exit(1);
+ fprintf(stderr, "Warning: Failed to enumerate output display modes for card %u\n", card_index);
+ return false;
}
video_modes.clear();
// 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);
+ return true;
}
void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
public:
DeckLinkOutput(movit::ResourcePool *resource_pool, QSurface *surface, unsigned width, unsigned height, unsigned card_index);
- void set_device(IDeckLink *output);
+ bool set_device(IDeckLink *output);
void start_output(uint32_t mode, int64_t base_pts); // Mode comes from get_available_video_modes().
void end_output();
DeckLinkCapture *capture = new DeckLinkCapture(decklink, card_index);
DeckLinkOutput *output = new DeckLinkOutput(resource_pool.get(), decklink_output_surface, global_flags.width, global_flags.height, card_index);
- output->set_device(decklink);
+ if (!output->set_device(decklink)) {
+ delete output;
+ output = nullptr;
+ }
configure_card(card_index, capture, CardType::LIVE_CARD, output);
++num_pci_devices;
}