From: Steinar H. Gunderson Date: Sun, 22 Jan 2017 21:49:47 +0000 (+0100) Subject: Enable input mode autodetection for DeckLink cards that support it. X-Git-Tag: 1.5.0~68 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=4abf88e64e7aaf2e87c05a2294d1ddb1ebf9e092;p=nageru Enable input mode autodetection for DeckLink cards that support it. --- diff --git a/decklink_capture.cpp b/decklink_capture.cpp index 348ee28..16c187d 100644 --- a/decklink_capture.cpp +++ b/decklink_capture.cpp @@ -205,6 +205,12 @@ DeckLinkCapture::DeckLinkCapture(IDeckLink *card, int card_index) } } + // Check if we the card supports input autodetection. + if (attr->GetFlag(BMDDeckLinkSupportsInputFormatDetection, &supports_autodetect) != S_OK) { + fprintf(stderr, "Warning: Failed to ask card %d whether it supports input format autodetection\n", card_index); + supports_autodetect = false; + } + // If there's more than one subdevice on this card, label them. int64_t num_subdevices, subdevice_idx; if (attr->GetInt(BMDDeckLinkNumberOfSubDevices, &num_subdevices) == S_OK && num_subdevices > 1) { @@ -273,8 +279,15 @@ ULONG STDMETHODCALLTYPE DeckLinkCapture::Release(void) HRESULT STDMETHODCALLTYPE DeckLinkCapture::VideoInputFormatChanged( BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode* display_mode, - BMDDetectedVideoInputFormatFlags) + BMDDetectedVideoInputFormatFlags format_flags) { + if (format_flags & bmdDetectedVideoInputRGB444) { + fprintf(stderr, "WARNING: Input detected as 4:4:4 RGB, but Nageru can't consume that yet.\n"); + fprintf(stderr, "Doing hardware conversion to 4:2:2 Y'CbCr.\n"); + } + if (supports_autodetect && display_mode->GetDisplayMode() != current_video_mode) { + set_video_mode(display_mode->GetDisplayMode()); + } if (display_mode->GetFrameRate(&frame_duration, &time_scale) != S_OK) { fprintf(stderr, "Could not get new frame rate\n"); exit(1); @@ -391,7 +404,7 @@ void DeckLinkCapture::start_bm_capture() if (running) { return; } - if (input->EnableVideoInput(current_video_mode, bmdFormat8BitYUV, 0) != S_OK) { + if (input->EnableVideoInput(current_video_mode, bmdFormat8BitYUV, supports_autodetect ? bmdVideoInputEnableFormatDetection : 0) != S_OK) { fprintf(stderr, "Failed to set video mode 0x%04x for card %d\n", current_video_mode, card_index); exit(1); } @@ -465,7 +478,7 @@ void DeckLinkCapture::set_video_mode_no_restart(uint32_t video_mode_id) field_dominance = display_mode->GetFieldDominance(); if (running) { - if (input->EnableVideoInput(video_mode_id, bmdFormat8BitYUV, 0) != S_OK) { + if (input->EnableVideoInput(video_mode_id, bmdFormat8BitYUV, supports_autodetect ? bmdVideoInputEnableFormatDetection : 0) != S_OK) { fprintf(stderr, "Failed to set video mode 0x%04x for card %d\n", video_mode_id, card_index); exit(1); } diff --git a/decklink_capture.h b/decklink_capture.h index 31efc37..1bdf9ad 100644 --- a/decklink_capture.h +++ b/decklink_capture.h @@ -128,6 +128,7 @@ private: BMDTimeScale time_scale; BMDFieldDominance field_dominance; bool running = false; + bool supports_autodetect = false; std::map video_modes; BMDDisplayMode current_video_mode;