@@ -79,9 +79,10 @@ DeckLinkDevice::~DeckLinkDevice()
79
79
DeleteCriticalSection (&m_outputCriticalSection);
80
80
DeleteCriticalSection (&m_frameAccessCriticalSection);
81
81
82
- delete[] cachedBuffer ;
83
- delete[] stagingBuffer ;
82
+ delete[] thirdCachedBuffer ;
83
+ delete[] secondCachedBuffer ;
84
84
delete[] latestBuffer;
85
+ delete[] stagingBuffer;
85
86
delete[] outputBuffer;
86
87
delete[] outputBufferRaw;
87
88
}
@@ -148,7 +149,8 @@ bool DeckLinkDevice::Init(ID3D11ShaderResourceView* colorSRV, ID3D11Texture2D* o
148
149
BSTR deviceNameBSTR = NULL ;
149
150
150
151
ZeroMemory (rawBuffer, FRAME_BUFSIZE_RAW);
151
- ZeroMemory (cachedBuffer, FRAME_BUFSIZE);
152
+ ZeroMemory (thirdCachedBuffer, FRAME_BUFSIZE);
153
+ ZeroMemory (secondCachedBuffer, FRAME_BUFSIZE);
152
154
ZeroMemory (latestBuffer, FRAME_BUFSIZE);
153
155
ZeroMemory (outputBuffer, FRAME_BUFSIZE);
154
156
ZeroMemory (outputBufferRaw, FRAME_BUFSIZE_RAW);
@@ -372,13 +374,16 @@ HRESULT DeckLinkDevice::VideoInputFrameArrived(/* in */ IDeckLinkVideoInputFrame
372
374
{
373
375
if (frame->GetBytes ((void **)&rawBuffer) == S_OK)
374
376
{
377
+ // Always return the latest buffer when using the CPU.
375
378
if (_useCPU)
376
379
{
377
- DirectXHelper::ConvertYUVtoBGRA (rawBuffer, cachedBuffer , FRAME_WIDTH, FRAME_HEIGHT, true );
380
+ DirectXHelper::ConvertYUVtoBGRA (rawBuffer, latestBuffer , FRAME_WIDTH, FRAME_HEIGHT, true );
378
381
}
379
382
else
380
383
{
381
- memcpy (cachedBuffer, rawBuffer, FRAME_BUFSIZE_RAW);
384
+ memcpy (thirdCachedBuffer, secondCachedBuffer, FRAME_BUFSIZE_RAW);
385
+ memcpy (secondCachedBuffer, latestBuffer, FRAME_BUFSIZE_RAW);
386
+ memcpy (latestBuffer, rawBuffer, FRAME_BUFSIZE_RAW);
382
387
}
383
388
}
384
389
}
@@ -391,11 +396,14 @@ HRESULT DeckLinkDevice::VideoInputFrameArrived(/* in */ IDeckLinkVideoInputFrame
391
396
// TODO: Remove this block if R and B components are swapped in color feed.
392
397
memcpy (stagingBuffer, localFrameBuffer, FRAME_BUFSIZE);
393
398
DirectXHelper::ConvertBGRAtoRGBA (stagingBuffer, FRAME_WIDTH, FRAME_HEIGHT, true );
394
- memcpy (cachedBuffer, stagingBuffer, FRAME_BUFSIZE);
399
+ // Do not cache frames when using the CPU
400
+ memcpy (latestBuffer, stagingBuffer, FRAME_BUFSIZE);
395
401
}
396
402
else
397
403
{
398
- memcpy (cachedBuffer, localFrameBuffer, FRAME_BUFSIZE);
404
+ memcpy (thirdCachedBuffer, secondCachedBuffer, FRAME_BUFSIZE);
405
+ memcpy (secondCachedBuffer, latestBuffer, FRAME_BUFSIZE);
406
+ memcpy (latestBuffer, localFrameBuffer, FRAME_BUFSIZE);
399
407
}
400
408
}
401
409
}
@@ -404,7 +412,9 @@ HRESULT DeckLinkDevice::VideoInputFrameArrived(/* in */ IDeckLinkVideoInputFrame
404
412
frame->GetStreamTime (&t, &frameDuration, QPC_MULTIPLIER);
405
413
406
414
// Get frame time.
407
- cachedTimeStamp = time .QuadPart ;
415
+ thirdTimeStamp = secondTimeStamp;
416
+ secondTimeStamp = latestTimeStamp;
417
+ latestTimeStamp = time .QuadPart ;
408
418
409
419
dirtyFrame = false ;
410
420
@@ -445,13 +455,20 @@ HRESULT DeckLinkDevice::VideoInputFrameArrived(/* in */ IDeckLinkVideoInputFrame
445
455
void DeckLinkDevice::Update ()
446
456
{
447
457
if (_colorSRV != nullptr &&
448
- cachedBuffer != nullptr &&
449
458
device != nullptr )
450
459
{
451
460
if (!dirtyFrame)
452
461
{
453
462
dirtyFrame = true ;
454
- DirectXHelper::UpdateSRV (device, _colorSRV, cachedBuffer, FRAME_WIDTH * FRAME_BPP);
463
+ if (_useCPU && latestBuffer != nullptr )
464
+ {
465
+ // Do not cache when using CPU.
466
+ DirectXHelper::UpdateSRV (device, _colorSRV, latestBuffer, FRAME_WIDTH * FRAME_BPP);
467
+ }
468
+ else if (!_useCPU && thirdCachedBuffer != nullptr )
469
+ {
470
+ DirectXHelper::UpdateSRV (device, _colorSRV, thirdCachedBuffer, FRAME_WIDTH * FRAME_BPP);
471
+ }
455
472
456
473
EnterCriticalSection (&m_frameAccessCriticalSection);
457
474
isVideoFrameReady = true ;
0 commit comments