MF Discovery extended

This commit is contained in:
Paulchen Panther
2021-05-19 19:59:54 +02:00
parent 8d8ee8b3cd
commit 5f0ad931ba
5 changed files with 162 additions and 119 deletions

View File

@@ -42,14 +42,15 @@ public:
SourceReaderCB(MFGrabber* grabber)
: _nRefCount(1)
, _grabber(grabber)
, _bEOS(FALSE)
, _hrStatus(S_OK)
, _isBusy(false)
, _transform(nullptr)
, _pixelformat(PixelFormat::NO_CHANGE)
{
// Initialize critical section.
InitializeCriticalSection(&_critsec);
// Create event handler
_event = CreateEvent(nullptr, FALSE, FALSE, nullptr);
}
// IUnknown methods
@@ -83,12 +84,11 @@ public:
DWORD dwStreamFlags, LONGLONG llTimestamp, IMFSample* pSample)
{
EnterCriticalSection(&_critsec);
_isBusy = true;
if (_grabber->_sourceReader == nullptr)
{
_isBusy = false;
LeaveCriticalSection(&_critsec);
SetEvent(_event);
return S_OK;
}
@@ -172,14 +172,11 @@ public:
done:
SAFE_RELEASE(buffer);
if (MF_SOURCE_READERF_ENDOFSTREAM & dwStreamFlags)
_bEOS = TRUE; // Reached the end of the stream.
if (_pixelformat != PixelFormat::MJPEG && _pixelformat != PixelFormat::BGR24 && _pixelformat != PixelFormat::NO_CHANGE)
SAFE_RELEASE(pSample);
_isBusy = false;
LeaveCriticalSection(&_critsec);
SetEvent(_event);
return _hrStatus;
}
@@ -283,15 +280,7 @@ public:
return _hrStatus;
}
BOOL SourceReaderCB::isBusy()
{
EnterCriticalSection(&_critsec);
BOOL result = _isBusy;
LeaveCriticalSection(&_critsec);
return result;
}
void Wait() { WaitForSingleObject(_event, INFINITE); }
STDMETHODIMP OnEvent(DWORD, IMFMediaEvent*) { return S_OK; }
STDMETHODIMP OnFlush(DWORD) { return S_OK; }
@@ -397,5 +386,5 @@ private:
HRESULT _hrStatus;
IMFTransform* _transform;
PixelFormat _pixelformat;
std::atomic<bool> _isBusy;
HANDLE _event;
};