yolobs-studio/plugins/decklink/decklink-device-instance.hpp

67 lines
2.3 KiB
C++
Raw Normal View History

2016-02-23 23:16:51 +00:00
#pragma once
#include "decklink-device.hpp"
2017-06-29 19:01:10 +00:00
class AudioRepacker;
2016-02-23 23:16:51 +00:00
class DeckLinkDeviceInstance : public IDeckLinkInputCallback {
protected:
struct obs_source_frame currentFrame;
struct obs_source_audio currentPacket;
DeckLink *decklink = nullptr;
DeckLinkDevice *device = nullptr;
DeckLinkDeviceMode *mode = nullptr;
2018-02-19 19:54:37 +00:00
BMDDisplayMode displayMode = bmdModeNTSC;
2016-02-23 23:16:51 +00:00
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
2018-02-19 19:54:37 +00:00
video_colorspace colorSpace = VIDEO_CS_DEFAULT;
video_colorspace activeColorSpace = VIDEO_CS_DEFAULT;
video_range_type colorRange = VIDEO_RANGE_DEFAULT;
2016-02-23 23:16:51 +00:00
ComPtr<IDeckLinkInput> input;
volatile long refCount = 1;
2017-06-29 19:01:10 +00:00
int64_t audioOffset = 0;
uint64_t nextAudioTS = 0;
uint64_t lastVideoTS = 0;
AudioRepacker *audioRepacker = nullptr;
speaker_layout channelFormat = SPEAKERS_STEREO;
void FinalizeStream();
2018-02-19 19:54:37 +00:00
void SetupVideoFormat(DeckLinkDeviceMode *mode_);
2016-02-23 23:16:51 +00:00
void HandleAudioPacket(IDeckLinkAudioInputPacket *audioPacket,
const uint64_t timestamp);
void HandleVideoFrame(IDeckLinkVideoInputFrame *videoFrame,
const uint64_t timestamp);
public:
DeckLinkDeviceInstance(DeckLink *decklink, DeckLinkDevice *device);
virtual ~DeckLinkDeviceInstance();
inline DeckLinkDevice *GetDevice() const {return device;}
inline long long GetActiveModeId() const
{
return mode ? mode->GetId() : 0;
}
inline BMDPixelFormat GetActivePixelFormat() const {return pixelFormat;}
2018-02-19 19:54:37 +00:00
inline video_colorspace GetActiveColorSpace() const {return colorSpace;}
inline video_range_type GetActiveColorRange() const {return colorRange;}
2017-06-29 19:01:10 +00:00
inline speaker_layout GetActiveChannelFormat() const {return channelFormat;}
2016-02-23 23:16:51 +00:00
inline DeckLinkDeviceMode *GetMode() const {return mode;}
bool StartCapture(DeckLinkDeviceMode *mode);
bool StopCapture(void);
HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(
IDeckLinkVideoInputFrame *videoFrame,
IDeckLinkAudioInputPacket *audioPacket);
HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(
BMDVideoInputFormatChangedEvents events,
IDeckLinkDisplayMode *newMode,
BMDDetectedVideoInputFormatFlags detectedSignalFlags);
ULONG STDMETHODCALLTYPE AddRef(void);
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv);
ULONG STDMETHODCALLTYPE Release(void);
};