Simplify ownership/lifetime
This commit is contained in:
@@ -344,7 +344,48 @@ bool DeckLinkSession::ConfigureOutput(OpenGLComposite* owner, HDC hdc, HGLRC hgl
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeckLinkSession::Start(unsigned outputHeight)
|
||||
double DeckLinkSession::FrameBudgetMilliseconds() const
|
||||
{
|
||||
return frameTimescale != 0
|
||||
? (static_cast<double>(frameDuration) * 1000.0) / static_cast<double>(frameTimescale)
|
||||
: 0.0;
|
||||
}
|
||||
|
||||
IDeckLinkMutableVideoFrame* DeckLinkSession::RotateOutputFrame()
|
||||
{
|
||||
IDeckLinkMutableVideoFrame* outputVideoFrame = outputVideoFrameQueue.front();
|
||||
outputVideoFrameQueue.push_back(outputVideoFrame);
|
||||
outputVideoFrameQueue.pop_front();
|
||||
return outputVideoFrame;
|
||||
}
|
||||
|
||||
bool DeckLinkSession::TransferPlayoutFrame(void* address, GLuint outputTexture)
|
||||
{
|
||||
return playoutAllocator != nullptr && playoutAllocator->transferFrame(address, outputTexture);
|
||||
}
|
||||
|
||||
void DeckLinkSession::WaitForPlayoutTransferComplete(void* address)
|
||||
{
|
||||
if (playoutAllocator != nullptr)
|
||||
playoutAllocator->waitForTransferComplete(address);
|
||||
}
|
||||
|
||||
void DeckLinkSession::AccountForCompletionResult(BMDOutputFrameCompletionResult completionResult)
|
||||
{
|
||||
if (completionResult == bmdOutputFrameDisplayedLate || completionResult == bmdOutputFrameDropped)
|
||||
totalPlayoutFrames += 2;
|
||||
}
|
||||
|
||||
bool DeckLinkSession::ScheduleOutputFrame(IDeckLinkMutableVideoFrame* outputVideoFrame)
|
||||
{
|
||||
if (output->ScheduleVideoFrame(outputVideoFrame, (totalPlayoutFrames * frameDuration), frameDuration, frameTimescale) != S_OK)
|
||||
return false;
|
||||
|
||||
totalPlayoutFrames++;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool DeckLinkSession::Start()
|
||||
{
|
||||
totalPlayoutFrames = 0;
|
||||
if (!output)
|
||||
@@ -380,7 +421,7 @@ bool DeckLinkSession::Start(unsigned outputHeight)
|
||||
|
||||
void* pFrame;
|
||||
outputVideoFrameBuffer->GetBytes((void**)&pFrame);
|
||||
memset(pFrame, 0, outputVideoFrame->GetRowBytes() * outputHeight);
|
||||
memset(pFrame, 0, outputVideoFrame->GetRowBytes() * outputFrameHeight);
|
||||
|
||||
outputVideoFrameBuffer->EndAccess(bmdBufferAccessWrite);
|
||||
outputVideoFrameBuffer->Release();
|
||||
|
||||
@@ -18,9 +18,33 @@ public:
|
||||
bool DiscoverDevicesAndModes(BMDDisplayMode inputDisplayMode, BMDDisplayMode outputDisplayMode, const std::string& requestedInputDisplayModeName, const std::string& requestedOutputDisplayModeName, std::string& error);
|
||||
bool ConfigureInput(OpenGLComposite* owner, HDC hdc, HGLRC hglrc, BMDDisplayMode inputDisplayMode, std::string& error);
|
||||
bool ConfigureOutput(OpenGLComposite* owner, HDC hdc, HGLRC hglrc, BMDDisplayMode outputDisplayMode, bool externalKeyingEnabled, std::string& error);
|
||||
bool Start(unsigned outputFrameHeight);
|
||||
bool Start();
|
||||
bool Stop();
|
||||
|
||||
bool HasInputDevice() const { return input != nullptr; }
|
||||
bool HasInputSource() const { return !hasNoInputSource; }
|
||||
void SetInputSourceMissing(bool missing) { hasNoInputSource = missing; }
|
||||
bool InputOutputDimensionsDiffer() const { return inputFrameWidth != outputFrameWidth || inputFrameHeight != outputFrameHeight; }
|
||||
unsigned InputFrameWidth() const { return inputFrameWidth; }
|
||||
unsigned InputFrameHeight() const { return inputFrameHeight; }
|
||||
unsigned OutputFrameWidth() const { return outputFrameWidth; }
|
||||
unsigned OutputFrameHeight() const { return outputFrameHeight; }
|
||||
const std::string& InputDisplayModeName() const { return inputDisplayModeName; }
|
||||
const std::string& OutputModelName() const { return outputModelName; }
|
||||
bool SupportsInternalKeying() const { return supportsInternalKeying; }
|
||||
bool SupportsExternalKeying() const { return supportsExternalKeying; }
|
||||
bool KeyerInterfaceAvailable() const { return keyerInterfaceAvailable; }
|
||||
bool ExternalKeyingActive() const { return externalKeyingActive; }
|
||||
const std::string& StatusMessage() const { return statusMessage; }
|
||||
void SetStatusMessage(const std::string& message) { statusMessage = message; }
|
||||
double FrameBudgetMilliseconds() const;
|
||||
IDeckLinkMutableVideoFrame* RotateOutputFrame();
|
||||
bool TransferPlayoutFrame(void* address, GLuint outputTexture);
|
||||
void WaitForPlayoutTransferComplete(void* address);
|
||||
void AccountForCompletionResult(BMDOutputFrameCompletionResult completionResult);
|
||||
bool ScheduleOutputFrame(IDeckLinkMutableVideoFrame* outputVideoFrame);
|
||||
|
||||
private:
|
||||
CaptureDelegate* captureDelegate = nullptr;
|
||||
PlayoutDelegate* playoutDelegate = nullptr;
|
||||
IDeckLinkInput* input = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user