]> git.sesse.net Git - nageru/blobdiff - nageru/decklink_output.cpp
On errors, abort() instead of exit(1); exit() in a multithreaded program just gives...
[nageru] / nageru / decklink_output.cpp
index e37002918cb4891f645827dcef74dc7115429031..f6826b51366e4a73afcfdcf0edac39179601a5ad 100644 (file)
@@ -130,7 +130,7 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
 
        if (video_modes.empty()) {
                fprintf(stderr, "ERROR: No matching output modes for %dx%d found\n", width, height);
-               exit(1);
+               abort();
        }
 
        should_quit.unquit();
@@ -141,19 +141,19 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
        IDeckLinkConfiguration *config = nullptr;
        if (output->QueryInterface(IID_IDeckLinkConfiguration, (void**)&config) != S_OK) {
                fprintf(stderr, "Failed to get configuration interface for output card\n");
-               exit(1);
+               abort();
        }
        if (config->SetFlag(bmdDeckLinkConfigLowLatencyVideoOutput, true) != S_OK) {
                fprintf(stderr, "Failed to set low latency output\n");
-               exit(1);
+               abort();
        }
        if (config->SetInt(bmdDeckLinkConfigVideoOutputConnection, video_connection) != S_OK) {
                fprintf(stderr, "Failed to set video output connection for card %u\n", card_index);
-               exit(1);
+               abort();
        }
        if (config->SetFlag(bmdDeckLinkConfigUse1080pNotPsF, true) != S_OK) {
                fprintf(stderr, "Failed to set PsF flag for card\n");
-               exit(1);
+               abort();
        }
        if (config->SetFlag(bmdDeckLinkConfigSMPTELevelAOutput, true) != S_OK) {
                // This affects at least some no-name SDI->HDMI converters.
@@ -167,12 +167,12 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
        if (output->DoesSupportVideoMode(mode, pixel_format, bmdVideoOutputFlagDefault,
                                         &support, &display_mode) != S_OK) {
                fprintf(stderr, "Couldn't ask for format support\n");
-               exit(1);
+               abort();
        }
 
        if (support == bmdDisplayModeNotSupported) {
                fprintf(stderr, "Requested display mode not supported\n");
-               exit(1);
+               abort();
        }
 
        current_mode_flags = display_mode->GetFlags();
@@ -181,7 +181,7 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
        BMDTimeScale time_scale;
        if (display_mode->GetFrameRate(&time_value, &time_scale) != S_OK) {
                fprintf(stderr, "Couldn't get frame rate\n");
-               exit(1);
+               abort();
        }
 
        metric_decklink_output_width_pixels = width;
@@ -196,20 +196,20 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
        HRESULT result = output->EnableVideoOutput(mode, bmdVideoOutputFlagDefault);
        if (result != S_OK) {
                fprintf(stderr, "Couldn't enable output with error 0x%x\n", result);
-               exit(1);
+               abort();
        }
        if (output->SetScheduledFrameCompletionCallback(this) != S_OK) {
                fprintf(stderr, "Couldn't set callback\n");
-               exit(1);
+               abort();
        }
        assert(OUTPUT_FREQUENCY == 48000);
        if (output->EnableAudioOutput(bmdAudioSampleRate48kHz, bmdAudioSampleType32bitInteger, 2, bmdAudioOutputStreamTimestamped) != S_OK) {
                fprintf(stderr, "Couldn't enable audio output\n");
-               exit(1);
+               abort();
        }
        if (output->BeginAudioPreroll() != S_OK) {
                fprintf(stderr, "Couldn't begin audio preroll\n");
-               exit(1);
+               abort();
        }
 
        present_thread = thread([this]{
@@ -218,7 +218,7 @@ void DeckLinkOutput::start_output(uint32_t mode, int64_t base_pts)
                if (!make_current(context, this->surface)) {
                        printf("display=%p surface=%p context=%p curr=%p err=%d\n", eglGetCurrentDisplay(), this->surface, context, eglGetCurrentContext(),
                                eglGetError());
-                       exit(1);
+                       abort();
                }
                present_thread_func();
                delete_context(context);
@@ -366,11 +366,11 @@ void DeckLinkOutput::wait_for_frame(int64_t pts, int *dropped_frames, int64_t *f
        if (!playback_started) {
                if (output->EndAudioPreroll() != S_OK) {
                        fprintf(stderr, "Could not end audio preroll\n");
-                       exit(1);  // TODO
+                       abort();  // TODO
                }
                if (output->StartScheduledPlayback(base_pts, TIMEBASE, 1.0) != S_OK) {
                        fprintf(stderr, "Could not start playback\n");
-                       exit(1);  // TODO
+                       abort();  // TODO
                }
                playback_started = true;
        }