Media Foundation camera capture fixed.
Camera-based VideoCapture updated to fit changes in ImageGrabber from prev commit
This commit is contained in:
parent
9fb762ccec
commit
e94cc0b5ee
@ -180,15 +180,16 @@ public:
|
|||||||
void stopGrabbing();
|
void stopGrabbing();
|
||||||
RawImage *getRawImage();
|
RawImage *getRawImage();
|
||||||
// Function of creation of the instance of the class
|
// 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;
|
const HANDLE ig_hFrameReady;
|
||||||
HANDLE ig_hFrameGrabbed;
|
const HANDLE ig_hFrameGrabbed;
|
||||||
HANDLE ig_hFinish;
|
const HANDLE ig_hFinish;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ig_RIE;
|
bool ig_RIE;
|
||||||
bool ig_Close;
|
bool ig_Close;
|
||||||
|
bool ig_Synchronous;
|
||||||
long m_cRef;
|
long m_cRef;
|
||||||
unsigned int ig_DeviceID;
|
unsigned int ig_DeviceID;
|
||||||
IMFMediaSource *ig_pSource;
|
IMFMediaSource *ig_pSource;
|
||||||
@ -197,7 +198,7 @@ private:
|
|||||||
RawImage *ig_RIFirst;
|
RawImage *ig_RIFirst;
|
||||||
RawImage *ig_RISecond;
|
RawImage *ig_RISecond;
|
||||||
RawImage *ig_RIOut;
|
RawImage *ig_RIOut;
|
||||||
ImageGrabber(unsigned int deviceID);
|
ImageGrabber(unsigned int deviceID, bool synchronous);
|
||||||
HRESULT CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo);
|
HRESULT CreateTopology(IMFMediaSource *pSource, IMFActivate *pSinkActivate, IMFTopology **ppTopo);
|
||||||
HRESULT AddSourceNode(
|
HRESULT AddSourceNode(
|
||||||
IMFTopology *pTopology,
|
IMFTopology *pTopology,
|
||||||
@ -229,7 +230,7 @@ class ImageGrabberThread
|
|||||||
friend DWORD WINAPI MainThreadFunction( LPVOID lpParam );
|
friend DWORD WINAPI MainThreadFunction( LPVOID lpParam );
|
||||||
public:
|
public:
|
||||||
~ImageGrabberThread(void);
|
~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 start();
|
||||||
void stop();
|
void stop();
|
||||||
void setEmergencyStopEvent(void *userData, void(*func)(int, void *));
|
void setEmergencyStopEvent(void *userData, void(*func)(int, void *));
|
||||||
@ -237,7 +238,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
virtual void run();
|
virtual void run();
|
||||||
private:
|
private:
|
||||||
ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID);
|
ImageGrabberThread(IMFMediaSource *pSource, unsigned int deviceID, bool synchronious);
|
||||||
HANDLE igt_Handle;
|
HANDLE igt_Handle;
|
||||||
DWORD igt_ThreadIdArray;
|
DWORD igt_ThreadIdArray;
|
||||||
ImageGrabber *igt_pImageGrabber;
|
ImageGrabber *igt_pImageGrabber;
|
||||||
@ -854,7 +855,7 @@ FormatReader::~FormatReader(void)
|
|||||||
|
|
||||||
#define CHECK_HR(x) if (FAILED(x)) { printf("Checking failed !!!\n"); goto done; }
|
#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),
|
m_cRef(1),
|
||||||
ig_DeviceID(deviceID),
|
ig_DeviceID(deviceID),
|
||||||
ig_pSource(NULL),
|
ig_pSource(NULL),
|
||||||
@ -862,9 +863,10 @@ ImageGrabber::ImageGrabber(unsigned int deviceID):
|
|||||||
ig_pTopology(NULL),
|
ig_pTopology(NULL),
|
||||||
ig_RIE(true),
|
ig_RIE(true),
|
||||||
ig_Close(false),
|
ig_Close(false),
|
||||||
ig_hFrameReady(CreateEvent(NULL, FALSE, FALSE, "ig_hFrameReady")),
|
ig_Synchronous(synchronous),
|
||||||
ig_hFrameGrabbed(CreateEvent(NULL, FALSE, TRUE, "ig_hFrameGrabbed")),
|
ig_hFrameReady(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFrameReady"): 0),
|
||||||
ig_hFinish(CreateEvent(NULL, FALSE, FALSE, "ig_hFinish"))
|
ig_hFrameGrabbed(synchronous ? CreateEvent(NULL, FALSE, TRUE, "ig_hFrameGrabbed"): 0),
|
||||||
|
ig_hFinish(synchronous ? CreateEvent(NULL, FALSE, FALSE, "ig_hFinish") : 0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
ImageGrabber::~ImageGrabber(void)
|
ImageGrabber::~ImageGrabber(void)
|
||||||
@ -876,9 +878,12 @@ ImageGrabber::~ImageGrabber(void)
|
|||||||
ig_pSession->Shutdown();
|
ig_pSession->Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseHandle(ig_hFrameReady);
|
if (ig_Synchronous)
|
||||||
CloseHandle(ig_hFrameGrabbed);
|
{
|
||||||
CloseHandle(ig_hFinish);
|
CloseHandle(ig_hFrameReady);
|
||||||
|
CloseHandle(ig_hFrameGrabbed);
|
||||||
|
CloseHandle(ig_hFinish);
|
||||||
|
}
|
||||||
|
|
||||||
SafeRelease(&ig_pSession);
|
SafeRelease(&ig_pSession);
|
||||||
SafeRelease(&ig_pTopology);
|
SafeRelease(&ig_pTopology);
|
||||||
@ -1056,7 +1061,10 @@ HRESULT ImageGrabber::startGrabbing(void)
|
|||||||
SafeRelease(&pEvent);
|
SafeRelease(&pEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetEvent(ig_hFinish);
|
if (ig_Synchronous)
|
||||||
|
{
|
||||||
|
SetEvent(ig_hFinish);
|
||||||
|
}
|
||||||
|
|
||||||
DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing \n", ig_DeviceID);
|
DPO->printOut(L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing \n", ig_DeviceID);
|
||||||
|
|
||||||
@ -1172,9 +1180,9 @@ done:
|
|||||||
return hr;
|
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)
|
if (ppIG == NULL)
|
||||||
{
|
{
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
@ -1286,14 +1294,21 @@ STDMETHODIMP ImageGrabber::OnProcessSample(REFGUID guidMajorMediaType, DWORD dwS
|
|||||||
|
|
||||||
printf("ImageGrabber::OnProcessSample() -- end\n");
|
printf("ImageGrabber::OnProcessSample() -- end\n");
|
||||||
|
|
||||||
SetEvent(ig_hFrameReady);
|
if (ig_Synchronous)
|
||||||
|
{
|
||||||
|
SetEvent(ig_hFrameReady);
|
||||||
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
STDMETHODIMP ImageGrabber::OnShutdown()
|
STDMETHODIMP ImageGrabber::OnShutdown()
|
||||||
{
|
{
|
||||||
SetEvent(ig_hFrameGrabbed);
|
if (ig_Synchronous)
|
||||||
|
{
|
||||||
|
SetEvent(ig_hFrameGrabbed);
|
||||||
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1309,10 +1324,10 @@ DWORD WINAPI MainThreadFunction( LPVOID lpParam )
|
|||||||
return 0;
|
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();
|
DebugPrintOut *DPO = &DebugPrintOut::getInstance();
|
||||||
*ppIGT = new (std::nothrow) ImageGrabberThread(pSource, deviceID);
|
*ppIGT = new (std::nothrow) ImageGrabberThread(pSource, deviceID, synchronious);
|
||||||
if (ppIGT == NULL)
|
if (ppIGT == NULL)
|
||||||
{
|
{
|
||||||
DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Memory cannot be allocated\n", deviceID);
|
DPO->printOut(L"IMAGEGRABBERTHREAD VIDEODEVICE %i: Memory cannot be allocated\n", deviceID);
|
||||||
@ -1323,10 +1338,13 @@ HRESULT ImageGrabberThread::CreateInstance(ImageGrabberThread **ppIGT, IMFMediaS
|
|||||||
return S_OK;
|
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();
|
DebugPrintOut *DPO = &DebugPrintOut::getInstance();
|
||||||
HRESULT hr = ImageGrabber::CreateInstance(&igt_pImageGrabber, deviceID);
|
HRESULT hr = ImageGrabber::CreateInstance(&igt_pImageGrabber, deviceID, synchronious);
|
||||||
igt_DeviceID = deviceID;
|
igt_DeviceID = deviceID;
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
@ -3057,7 +3075,7 @@ bool CvCaptureFile_MSMF::open(const char* filename)
|
|||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, -2);
|
hr = ImageGrabberThread::CreateInstance(&grabberThread, videoFileSource, -2, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
@ -3278,7 +3296,7 @@ IplImage* CvCaptureFile_MSMF::retrieveFrame(int)
|
|||||||
|
|
||||||
if(RIOut && size == RIOut->getSize())
|
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;
|
return frame;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user