]> git.sesse.net Git - nageru/commitdiff
Add back support for input-only DeckLink cards.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 25 Oct 2017 18:08:05 +0000 (20:08 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 25 Oct 2017 18:08:05 +0000 (20:08 +0200)
decklink_output.cpp
decklink_output.h
mixer.cpp

index 091e1b769018026af491d34b4d0df63bd7f2b5c0..a3d220b37c98bb96834415af5a277c47424b83cb 100644 (file)
@@ -82,17 +82,17 @@ DeckLinkOutput::DeckLinkOutput(ResourcePool *resource_pool, QSurface *surface, u
        });
 }
 
-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();
@@ -118,6 +118,7 @@ void DeckLinkOutput::set_device(IDeckLink *decklink)
        // 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)
index a2954964bb4b1a388ae7dd634a052d41ed7fb3de..44eb86dea9860e6480c4552aeaf352a5990bf979 100644 (file)
@@ -38,7 +38,7 @@ class DeckLinkOutput : public IDeckLinkVideoOutputCallback {
 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();
 
index f1d116fe497bdeb0e6f020aef2a7b468624ede2a..6ec12e88357b1430ef922cf3dad57d9407cd2e66 100644 (file)
--- a/mixer.cpp
+++ b/mixer.cpp
@@ -371,7 +371,10 @@ Mixer::Mixer(const QSurfaceFormat &format, unsigned num_cards)
 
                                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;
                        }