0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 13:08:50 +02:00

decklink: Add option to select pixel format

This replaces the name-based detection of the 4K intensity pro, and
allows other devices to be able to use the BGRA pixel format, if the
user so chooses.
This commit is contained in:
jp9000 2015-10-08 10:42:33 -07:00
parent 2e93772339
commit c77544f546
6 changed files with 43 additions and 13 deletions

View File

@ -2,3 +2,4 @@ BlackmagicDevice="Blackmagic Device"
Device="Device"
Mode="Mode"
Buffering="Use Buffering"
PixelFormat="Pixel Format"

View File

@ -8,21 +8,22 @@
#define LOG(level, message, ...) blog(level, "%s: " message, \
obs_source_get_name(this->decklink->GetSource()), ##__VA_ARGS__)
static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
{
switch (format) {
case bmdFormat8BitBGRA: return VIDEO_FORMAT_BGRX;
default:
case bmdFormat8BitYUV:;
}
return VIDEO_FORMAT_UYVY;
}
DeckLinkDeviceInstance::DeckLinkDeviceInstance(DeckLink *decklink_,
DeckLinkDevice *device_) :
currentFrame(), currentPacket(), decklink(decklink_), device(device_)
{
// use BGRA mode if the device is a BMI intensity pro 4K... wish there
// was a better way to check the device model, but older cards don't
// implement BMDDeckLinkPersistentID
if (std::string("Intensity Pro 4K").compare(device_->GetName()) == 0) {
currentFrame.format = VIDEO_FORMAT_BGRX;
pixelFormat = bmdFormat8BitBGRA;
} else {
currentFrame.format = VIDEO_FORMAT_UYVY;
pixelFormat = bmdFormat8BitYUV;
}
currentPacket.samples_per_sec = 48000;
currentPacket.speakers = SPEAKERS_STEREO;
currentPacket.format = AUDIO_FORMAT_16BIT;
@ -89,6 +90,9 @@ bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
if (!device->GetInput(&input))
return false;
pixelFormat = decklink->GetPixelFormat();
currentFrame.format = ConvertPixelFormat(pixelFormat);
input->SetCallback(this);
const BMDDisplayMode displayMode = mode_->GetDisplayMode();

View File

@ -28,6 +28,8 @@ public:
return mode ? mode->GetId() : 0;
}
inline BMDPixelFormat GetActivePixelFormat() const {return pixelFormat;}
inline DeckLinkDeviceMode *GetMode() const {return mode;}
bool StartCapture(DeckLinkDeviceMode *mode);

View File

@ -61,8 +61,13 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId)
const bool same = device == curDevice;
const bool isActive = instance != nullptr;
if (same && (!isActive || instance->GetActiveModeId() == modeId))
return false;
if (same) {
if (!isActive)
return false;
if (instance->GetActiveModeId() == modeId &&
instance->GetActivePixelFormat() == pixelFormat)
return false;
}
if (isActive)
instance->StopCapture();

View File

@ -21,6 +21,7 @@ protected:
obs_source_t *source;
volatile long activateRefs = 0;
std::recursive_mutex deviceMutex;
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
void SaveSettings();
static void DevicesChanged(void *param, DeckLinkDevice *device,
@ -35,6 +36,12 @@ public:
long long GetActiveModeId(void) const;
obs_source_t *GetSource(void) const;
inline BMDPixelFormat GetPixelFormat() const {return pixelFormat;}
inline void SetPixelFormat(BMDPixelFormat format)
{
pixelFormat = format;
}
bool Activate(DeckLinkDevice *device, long long modeId);
void Deactivate();
};

View File

@ -42,6 +42,8 @@ static void decklink_update(void *data, obs_data_t *settings)
DeckLink *decklink = (DeckLink *)data;
const char *hash = obs_data_get_string(settings, "device_hash");
long long id = obs_data_get_int(settings, "mode_id");
BMDPixelFormat format = (BMDPixelFormat)obs_data_get_int(settings,
"pixel_format");
decklink_enable_buffering(decklink,
obs_data_get_bool(settings, "buffering"));
@ -49,12 +51,14 @@ static void decklink_update(void *data, obs_data_t *settings)
ComPtr<DeckLinkDevice> device;
device.Set(deviceEnum->FindByHash(hash));
decklink->SetPixelFormat(format);
decklink->Activate(device, id);
}
static void decklink_get_defaults(obs_data_t *settings)
{
obs_data_set_default_bool(settings, "buffering", true);
obs_data_set_default_int(settings, "pixel_format", bmdFormat8BitYUV);
}
static const char *decklink_get_name(void*)
@ -139,6 +143,13 @@ static obs_properties_t *decklink_get_properties(void *data)
obs_module_text("Mode"), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
list = obs_properties_add_list(props, "pixel_format",
obs_module_text("PixelFormat"), OBS_COMBO_TYPE_LIST,
OBS_COMBO_FORMAT_INT);
obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
obs_properties_add_bool(props, "buffering",
obs_module_text("Buffering"));