void stopGrabbing();
RawImage *getRawImage();
// Function of creation of the instance of the class
- static HRESULT CreateInstance(ImageGrabber **ppIG,unsigned int deviceID);
+ static HRESULT CreateInstance(ImageGrabber **ppIG, unsigned int deviceID, bool synchronous = false);
- HANDLE ig_hFrameReady;
- HANDLE ig_hFrameGrabbed;
- HANDLE ig_hFinish;
+ const HANDLE ig_hFrameReady;
+ const HANDLE ig_hFrameGrabbed;
+ const HANDLE ig_hFinish;
private:
bool ig_RIE;
bool ig_Close;
+ bool ig_Synchronous;
long m_cRef;
unsigned int ig_DeviceID;
IMFMediaSource *ig_pSource;
RawImage *ig_RIFirst;
RawImage *ig_RISecond;
RawImage *ig_RIOut;
- ImageGrabber(unsigned int deviceID);
+ ImageGrabber(unsigned int deviceID, bool synchronous);
HRESULT CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo);
HRESULT AddSourceNode(
IMFTopology *pTopology,
friend DWORD WINAPI MainThreadFunction( LPVOID lpParam );
public:
~ImageGrabberThread(void);
- static HRESULT CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID);
+ static HRESULT CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID, bool synchronious = false);
void start();
void stop();
void setEmergencyStopEvent(void *userData, void(*func)(int, void *));
protected:
virtual void run();
private:
- ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID);
+ ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID, bool synchronious);
HANDLE igt_Handle;
DWORD igt_ThreadIdArray;
ImageGrabber *igt_pImageGrabber;
#define CHECK_HR(x) if (FAILED(x)) { printf("Checking failed !!!\n"); goto done; }
-ImageGrabber::ImageGrabber(unsigned int deviceID):
+ImageGrabber::ImageGrabber(unsigned int deviceID, bool synchronous):
m_cRef(1),
ig_DeviceID(deviceID),
ig_pSource(NULL),
ig_pTopology(NULL),
ig_RIE(true),
ig_Close(false),
- ig_hFrameReady(CreateEvent(NULL, FALSE, FALSE, "ig_hFrameReady")),
- ig_hFrameGrabbed(CreateEvent(NULL, FALSE, TRUE, "ig_hFrameGrabbed")),
- ig_hFinish(CreateEvent(NULL, FALSE, FALSE, "ig_hFinish"))
+ ig_Synchronous(synchronous),
+ ig_hFrameReady(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFrameReady"): 0),
+ ig_hFrameGrabbed(synchronous ? CreateEvent(NULL, FALSE, TRUE, "ig_hFrameGrabbed"): 0),
+ ig_hFinish(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFinish") : 0)
{}
ImageGrabber::~ImageGrabber(void)
ig_pSession->Shutdown();
}
- CloseHandle(ig_hFrameReady);
- CloseHandle(ig_hFrameGrabbed);
- CloseHandle(ig_hFinish);
+ if (ig_Synchronous)
+ {
+ CloseHandle(ig_hFrameReady);
+ CloseHandle(ig_hFrameGrabbed);
+ CloseHandle(ig_hFinish);
+ }
SafeRelease(&ig_pSession);
SafeRelease(&ig_pTopology);
SafeRelease(&pEvent);
}
- SetEvent(ig_hFinish);
+ if (ig_Synchronous)
+ {
+ SetEvent(ig_hFinish);
+ }
DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing \n", ig_DeviceID);
return hr;
}
-HRESULT ImageGrabber::CreateInstance(ImageGrabber **ppIG, unsigned int deviceID)
+HRESULT ImageGrabber::CreateInstance(ImageGrabber **ppIG, unsigned int deviceID, bool synchronious)
{
- *ppIG = new (std::nothrow) ImageGrabber(deviceID);
+ *ppIG = new (std::nothrow) ImageGrabber(deviceID, synchronious);
if (ppIG == NULL)
{
return E_OUTOFMEMORY;
printf("ImageGrabber::OnProcessSample() -- end\n");
- SetEvent(ig_hFrameReady);
+ if (ig_Synchronous)
+ {
+ SetEvent(ig_hFrameReady);
+ }
return S_OK;
}
STDMETHODIMP ImageGrabber::OnShutdown()
{
- SetEvent(ig_hFrameGrabbed);
+ if (ig_Synchronous)
+ {
+ SetEvent(ig_hFrameGrabbed);
+ }
+
return S_OK;
}
return 0;
}
-HRESULT ImageGrabberThread::CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID)
+HRESULT ImageGrabberThread::CreateInstance(ImageGrabberThread **ppIGT, IMFMediaSource *pSource, unsigned int deviceID, bool synchronious)
{
DebugPrintOut *DPO = &DebugPrintOut::getInstance();
- *ppIGT = new (std::nothrow) ImageGrabberThread(pSource, deviceID);
+ *ppIGT = new (std::nothrow) ImageGrabberThread(pSource, deviceID, synchronious);
if (ppIGT == NULL)
{
DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Memory cannot be allocated\n", deviceID);
return S_OK;
}
-ImageGrabberThread::ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID): igt_func(NULL), igt_Handle(NULL), igt_stop(false)
+ImageGrabberThread::ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID, bool synchronious):
+ igt_func(NULL),
+ igt_Handle(NULL),
+ igt_stop(false)
{
DebugPrintOut *DPO = &DebugPrintOut::getInstance();
- HRESULT hr = ImageGrabber::CreateInstance(&igt_pImageGrabber, deviceID);
+ HRESULT hr = ImageGrabber::CreateInstance(&igt_pImageGrabber, deviceID, synchronious);
igt_DeviceID = deviceID;
if(SUCCEEDED(hr))
{
if (SUCCEEDED(hr))
{
- hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, -2);
+ hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, -2, true);
}
if (SUCCEEDED(hr))
if(RIOut && size == RIOut->getSize())
{
- processPixels(RIOut->getpPixels(), (unsigned char*)frame->imageData, width, height, bytes, true, false);
+ processPixels(RIOut->getpPixels(), (unsigned char*)frame->imageData, width, height, bytes, false, false);
}
return frame;