123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #include "DecklinkInput.hpp"
- #include <util/threading.h>
- DeckLinkInput::DeckLinkInput(obs_source_t *source,
- DeckLinkDeviceDiscovery *discovery_)
- : DecklinkBase(discovery_), source(source)
- {
- discovery->AddCallback(DeckLinkInput::DevicesChanged, this);
- }
- DeckLinkInput::~DeckLinkInput(void)
- {
- discovery->RemoveCallback(DeckLinkInput::DevicesChanged, this);
- Deactivate();
- }
- void DeckLinkInput::DevicesChanged(void *param, DeckLinkDevice *device,
- bool added)
- {
- DeckLinkInput *decklink = reinterpret_cast<DeckLinkInput *>(param);
- std::lock_guard<std::recursive_mutex> lock(decklink->deviceMutex);
- obs_source_update_properties(decklink->source);
- if (added && !decklink->instance) {
- const char *hash;
- long long mode;
- obs_data_t *settings;
- BMDVideoConnection videoConnection;
- BMDAudioConnection audioConnection;
- settings = obs_source_get_settings(decklink->source);
- hash = obs_data_get_string(settings, "device_hash");
- videoConnection = (BMDVideoConnection)obs_data_get_int(
- settings, "video_connection");
- audioConnection = (BMDAudioConnection)obs_data_get_int(
- settings, "audio_connection");
- mode = obs_data_get_int(settings, "mode_id");
- obs_data_release(settings);
- if (device->GetHash().compare(hash) == 0) {
- if (!decklink->activateRefs)
- return;
- if (decklink->Activate(device, mode, videoConnection,
- audioConnection))
- os_atomic_dec_long(&decklink->activateRefs);
- }
- } else if (!added && decklink->instance) {
- if (decklink->instance->GetDevice() == device) {
- os_atomic_inc_long(&decklink->activateRefs);
- decklink->Deactivate();
- }
- }
- }
- bool DeckLinkInput::Activate(DeckLinkDevice *device, long long modeId,
- BMDVideoConnection bmdVideoConnection,
- BMDAudioConnection bmdAudioConnection)
- {
- std::lock_guard<std::recursive_mutex> lock(deviceMutex);
- DeckLinkDevice *curDevice = GetDevice();
- const bool same = device == curDevice;
- const bool isActive = instance != nullptr;
- if (same) {
- if (!isActive)
- return false;
- if (instance->GetActiveModeId() == modeId &&
- instance->GetVideoConnection() == bmdVideoConnection &&
- instance->GetAudioConnection() == bmdAudioConnection &&
- instance->GetActivePixelFormat() == pixelFormat &&
- instance->GetActiveColorSpace() == colorSpace &&
- instance->GetActiveColorRange() == colorRange &&
- instance->GetActiveChannelFormat() == channelFormat &&
- instance->GetActiveSwapState() == swap)
- return false;
- }
- if (isActive)
- instance->StopCapture();
- isCapturing = false;
- if (!same)
- instance.Set(new DeckLinkDeviceInstance(this, device));
- if (instance == nullptr)
- return false;
- if (GetDevice() == nullptr) {
- LOG(LOG_ERROR,
- "Tried to activate an input with nullptr device.");
- return false;
- }
- DeckLinkDeviceMode *mode = GetDevice()->FindInputMode(modeId);
- if (mode == nullptr) {
- instance = nullptr;
- return false;
- }
- if (!instance->StartCapture(mode, allow10Bit, bmdVideoConnection,
- bmdAudioConnection)) {
- instance = nullptr;
- return false;
- }
- os_atomic_inc_long(&activateRefs);
- SaveSettings();
- id = modeId;
- isCapturing = true;
- return true;
- }
- void DeckLinkInput::Deactivate(void)
- {
- std::lock_guard<std::recursive_mutex> lock(deviceMutex);
- if (instance)
- instance->StopCapture();
- isCapturing = false;
- instance = nullptr;
- os_atomic_dec_long(&activateRefs);
- }
- bool DeckLinkInput::Capturing(void)
- {
- return isCapturing;
- }
- void DeckLinkInput::SaveSettings()
- {
- if (!instance)
- return;
- DeckLinkDevice *device = instance->GetDevice();
- DeckLinkDeviceMode *mode = instance->GetMode();
- obs_data_t *settings = obs_source_get_settings(source);
- obs_data_set_string(settings, "device_hash", device->GetHash().c_str());
- obs_data_set_string(settings, "device_name",
- device->GetDisplayName().c_str());
- obs_data_set_int(settings, "mode_id", instance->GetActiveModeId());
- obs_data_set_string(settings, "mode_name", mode->GetName().c_str());
- obs_data_release(settings);
- }
- obs_source_t *DeckLinkInput::GetSource(void) const
- {
- return source;
- }
|