|
|
@ -434,6 +434,8 @@ class videoDevice{ |
|
|
|
int myID; |
|
|
|
int myID; |
|
|
|
long requestedFrameTime; //ie fps
|
|
|
|
long requestedFrameTime; //ie fps
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LONG volatile property_window_count; |
|
|
|
|
|
|
|
|
|
|
|
char nDeviceName[255]; |
|
|
|
char nDeviceName[255]; |
|
|
|
WCHAR wDeviceName[255]; |
|
|
|
WCHAR wDeviceName[255]; |
|
|
|
|
|
|
|
|
|
|
@ -499,7 +501,7 @@ class videoInput{ |
|
|
|
|
|
|
|
|
|
|
|
//Launches a pop up settings window
|
|
|
|
//Launches a pop up settings window
|
|
|
|
//For some reason in GLUT you have to call it twice each time.
|
|
|
|
//For some reason in GLUT you have to call it twice each time.
|
|
|
|
void showSettingsWindow(int deviceID); |
|
|
|
bool showSettingsWindow(int deviceID); |
|
|
|
|
|
|
|
|
|
|
|
//Manual control over settings thanks.....
|
|
|
|
//Manual control over settings thanks.....
|
|
|
|
//These are experimental for now.
|
|
|
|
//These are experimental for now.
|
|
|
@ -535,6 +537,8 @@ class videoInput{ |
|
|
|
|
|
|
|
|
|
|
|
bool isDeviceDisconnected(int deviceID); |
|
|
|
bool isDeviceDisconnected(int deviceID); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int property_window_count(int device_idx); |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
void setPhyCon(int deviceID, int conn); |
|
|
|
void setPhyCon(int deviceID, int conn); |
|
|
|
void setAttemptCaptureSize(int deviceID, int w, int h,GUID mediaType=MEDIASUBTYPE_RGB24); |
|
|
|
void setAttemptCaptureSize(int deviceID, int w, int h,GUID mediaType=MEDIASUBTYPE_RGB24); |
|
|
@ -578,7 +582,6 @@ class videoInput{ |
|
|
|
static void __cdecl basicThread(void * objPtr); |
|
|
|
static void __cdecl basicThread(void * objPtr); |
|
|
|
|
|
|
|
|
|
|
|
static char deviceNames[VI_MAX_CAMERAS][255]; |
|
|
|
static char deviceNames[VI_MAX_CAMERAS][255]; |
|
|
|
|
|
|
|
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////// HANDY FUNCTIONS /////////////////////////////
|
|
|
|
/////////////////////////// HANDY FUNCTIONS /////////////////////////////
|
|
|
@ -764,6 +767,8 @@ videoDevice::videoDevice(){ |
|
|
|
pixels = 0; |
|
|
|
pixels = 0; |
|
|
|
formatType = 0; |
|
|
|
formatType = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
property_window_count = 0; |
|
|
|
|
|
|
|
|
|
|
|
memset(wDeviceName, 0, sizeof(WCHAR) * 255); |
|
|
|
memset(wDeviceName, 0, sizeof(WCHAR) * 255); |
|
|
|
memset(nDeviceName, 0, sizeof(char) * 255); |
|
|
|
memset(nDeviceName, 0, sizeof(char) * 255); |
|
|
|
|
|
|
|
|
|
|
@ -1240,6 +1245,7 @@ bool videoInput::setFormat(int deviceNumber, int format){ |
|
|
|
if(VDList[deviceNumber]->pVideoInputFilter)VDList[deviceNumber]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceNumber]->pVideoInputFilter)VDList[deviceNumber]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceNumber]->pVideoInputFilter)VDList[deviceNumber]->pVideoInputFilter = NULL; |
|
|
|
if(VDList[deviceNumber]->pVideoInputFilter)VDList[deviceNumber]->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(FAILED(hr)){ |
|
|
|
if(FAILED(hr)){ |
|
|
|
DebugPrintOut("SETUP: couldn't set requested format\n"); |
|
|
|
DebugPrintOut("SETUP: couldn't set requested format\n"); |
|
|
|
}else{ |
|
|
|
}else{ |
|
|
@ -1586,36 +1592,47 @@ bool videoInput::isDeviceSetup(int id) const |
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
// ----------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void __cdecl videoInput::basicThread(void * objPtr){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//get a reference to the video device
|
|
|
|
void __cdecl videoInput::basicThread(void* ptr) |
|
|
|
//not a copy as we need to free the filter
|
|
|
|
{ |
|
|
|
videoDevice * vd = *( (videoDevice **)(objPtr) ); |
|
|
|
videoDevice* dev = (videoDevice*) ptr; |
|
|
|
ShowFilterPropertyPages(vd->pVideoInputFilter); |
|
|
|
IBaseFilter* filter = dev->pVideoInputFilter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//now we free the filter and make sure it set to NULL
|
|
|
|
|
|
|
|
if(vd->pVideoInputFilter)vd->pVideoInputFilter->Release(); |
|
|
|
|
|
|
|
if(vd->pVideoInputFilter)vd->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return; |
|
|
|
(void) ShowFilterPropertyPages(filter); |
|
|
|
|
|
|
|
(void) InterlockedDecrement(&dev->property_window_count); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void videoInput::showSettingsWindow(int id){ |
|
|
|
bool videoInput::showSettingsWindow(int id){ |
|
|
|
|
|
|
|
|
|
|
|
if(isDeviceSetup(id)){ |
|
|
|
if(isDeviceSetup(id)){ |
|
|
|
//HANDLE myTempThread;
|
|
|
|
//HANDLE myTempThread;
|
|
|
|
|
|
|
|
|
|
|
|
//we reconnect to the device as we have freed our reference to it
|
|
|
|
//we reconnect to the device as we have freed our reference to it
|
|
|
|
//why have we freed our reference? because there seemed to be an issue
|
|
|
|
//why have we freed our reference? because there seemed to be an issue
|
|
|
|
//with some mpeg devices if we didn't
|
|
|
|
//with some mpeg devices if we didn't
|
|
|
|
HRESULT hr = getDevice(&VDList[id]->pVideoInputFilter, id, VDList[id]->wDeviceName, VDList[id]->nDeviceName); |
|
|
|
|
|
|
|
if(hr == S_OK){ |
|
|
|
// XXX TODO compare fourcc for mpeg devices? is this comment still valid? -sh 20180104
|
|
|
|
//myTempThread = (HANDLE)
|
|
|
|
|
|
|
|
_beginthread(basicThread, 0, (void *)&VDList[id]); |
|
|
|
videoDevice* dev = VDList[id]; |
|
|
|
|
|
|
|
HRESULT hr = getDevice(&dev->pVideoInputFilter, id, dev->wDeviceName, dev->nDeviceName); |
|
|
|
|
|
|
|
if(hr == S_OK) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// it's pointless to keep the filter around. it crashes in
|
|
|
|
|
|
|
|
// pGraph or ISampleGrabber anyway
|
|
|
|
|
|
|
|
//dev->pVideoInputFilter->AddRef();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int new_window_count = InterlockedIncrement(&dev->property_window_count); |
|
|
|
|
|
|
|
// don't open multiple property windows at a time.
|
|
|
|
|
|
|
|
// will cause the camera to confuse itself anyway.
|
|
|
|
|
|
|
|
if (new_window_count == 1) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
_beginthread(basicThread, 0, dev); |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
(void) InterlockedDecrement(&dev->property_window_count); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1639,8 +1656,10 @@ bool videoInput::getVideoSettingFilter(int deviceID, long Property, long &min, l |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pAMVideoProcAmp); |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pAMVideoProcAmp); |
|
|
|
if(FAILED(hr)){ |
|
|
|
if(FAILED(hr)){ |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1654,8 +1673,10 @@ bool videoInput::getVideoSettingFilter(int deviceID, long Property, long &min, l |
|
|
|
pAMVideoProcAmp->Get(Property, ¤tValue, &flags); |
|
|
|
pAMVideoProcAmp->Get(Property, ¤tValue, &flags); |
|
|
|
|
|
|
|
|
|
|
|
if(pAMVideoProcAmp)pAMVideoProcAmp->Release(); |
|
|
|
if(pAMVideoProcAmp)pAMVideoProcAmp->Release(); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
@ -1721,8 +1742,10 @@ bool videoInput::setVideoSettingFilter(int deviceID, long Property, long lValue, |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pAMVideoProcAmp); |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pAMVideoProcAmp); |
|
|
|
if(FAILED(hr)){ |
|
|
|
if(FAILED(hr)){ |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1745,8 +1768,10 @@ bool videoInput::setVideoSettingFilter(int deviceID, long Property, long lValue, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(pAMVideoProcAmp)pAMVideoProcAmp->Release(); |
|
|
|
if(pAMVideoProcAmp)pAMVideoProcAmp->Release(); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
@ -1802,8 +1827,10 @@ bool videoInput::setVideoSettingCamera(int deviceID, long Property, long lValue, |
|
|
|
hr = VDList[deviceID]->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl); |
|
|
|
hr = VDList[deviceID]->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl); |
|
|
|
if (FAILED(hr)) { |
|
|
|
if (FAILED(hr)) { |
|
|
|
DebugPrintOut("Error\n"); |
|
|
|
DebugPrintOut("Error\n"); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL; |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
@ -1822,8 +1849,10 @@ bool videoInput::setVideoSettingCamera(int deviceID, long Property, long lValue, |
|
|
|
pIAMCameraControl->Set(Property, lValue, Flags); |
|
|
|
pIAMCameraControl->Set(Property, lValue, Flags); |
|
|
|
} |
|
|
|
} |
|
|
|
pIAMCameraControl->Release(); |
|
|
|
pIAMCameraControl->Release(); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release(); |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL; |
|
|
|
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -1851,8 +1880,10 @@ bool videoInput::getVideoSettingCamera(int deviceID, long Property, long &min, l |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl); |
|
|
|
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl); |
|
|
|
if(FAILED(hr)){ |
|
|
|
if(FAILED(hr)){ |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
DebugPrintOut("setVideoSetting - QueryInterface Error\n"); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1865,8 +1896,10 @@ bool videoInput::getVideoSettingCamera(int deviceID, long Property, long &min, l |
|
|
|
pIAMCameraControl->Get(Property, ¤tValue, &flags); |
|
|
|
pIAMCameraControl->Get(Property, ¤tValue, &flags); |
|
|
|
|
|
|
|
|
|
|
|
if(pIAMCameraControl)pIAMCameraControl->Release(); |
|
|
|
if(pIAMCameraControl)pIAMCameraControl->Release(); |
|
|
|
|
|
|
|
#if 0 |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release(); |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
@ -2203,7 +2236,6 @@ void videoInput::getVideoPropertyAsString(int prop, char * propertyAsString){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int videoInput::getVideoPropertyFromCV(int cv_property){ |
|
|
|
int videoInput::getVideoPropertyFromCV(int cv_property){ |
|
|
|
|
|
|
|
|
|
|
|
// see VideoProcAmpProperty in strmif.h
|
|
|
|
// see VideoProcAmpProperty in strmif.h
|
|
|
|
switch (cv_property) { |
|
|
|
switch (cv_property) { |
|
|
|
case CV_CAP_PROP_BRIGHTNESS: |
|
|
|
case CV_CAP_PROP_BRIGHTNESS: |
|
|
@ -2780,8 +2812,10 @@ int videoInput::start(int deviceID, videoDevice *VD){ |
|
|
|
//if we release this then we don't have access to the settings
|
|
|
|
//if we release this then we don't have access to the settings
|
|
|
|
//we release our video input filter but then reconnect with it
|
|
|
|
//we release our video input filter but then reconnect with it
|
|
|
|
//each time we need to use it
|
|
|
|
//each time we need to use it
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
VD->pVideoInputFilter->Release(); |
|
|
|
VD->pVideoInputFilter->Release(); |
|
|
|
VD->pVideoInputFilter = NULL; |
|
|
|
VD->pVideoInputFilter = NULL; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
VD->pGrabberF->Release(); |
|
|
|
VD->pGrabberF->Release(); |
|
|
|
VD->pGrabberF = NULL; |
|
|
|
VD->pGrabberF = NULL; |
|
|
@ -2902,8 +2936,12 @@ HRESULT videoInput::getDevice(IBaseFilter** gottaFilter, int deviceId, WCHAR * w |
|
|
|
count++; |
|
|
|
count++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// We found it, so send it back to the caller
|
|
|
|
// reuse existing filter due to webcam problems
|
|
|
|
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)gottaFilter); |
|
|
|
if (*gottaFilter) |
|
|
|
|
|
|
|
hr = S_OK; |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
// We found it, so send it back to the caller
|
|
|
|
|
|
|
|
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)gottaFilter); |
|
|
|
done = true; |
|
|
|
done = true; |
|
|
|
} |
|
|
|
} |
|
|
|
VariantClear(&varName); |
|
|
|
VariantClear(&varName); |
|
|
@ -3125,6 +3163,14 @@ HRESULT videoInput::routeCrossbar(ICaptureGraphBuilder2 **ppBuild, IBaseFilter * |
|
|
|
return hr; |
|
|
|
return hr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int videoInput::property_window_count(int idx) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (isDeviceSetup(idx)) |
|
|
|
|
|
|
|
return (int)InterlockedCompareExchange(&VDList[idx]->property_window_count, 0L, 0L); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
namespace cv |
|
|
|
namespace cv |
|
|
|
{ |
|
|
|
{ |
|
|
|
videoInput VideoCapture_DShow::g_VI; |
|
|
|
videoInput VideoCapture_DShow::g_VI; |
|
|
@ -3189,6 +3235,11 @@ double VideoCapture_DShow::getProperty(int propIdx) const |
|
|
|
return (double)current_value; |
|
|
|
return (double)current_value; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (propIdx == CV_CAP_PROP_SETTINGS ) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return g_VI.property_window_count(m_index); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// unknown parameter or value not available
|
|
|
|
// unknown parameter or value not available
|
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
@ -3260,8 +3311,7 @@ bool VideoCapture_DShow::setProperty(int propIdx, double propVal) |
|
|
|
// show video/camera filter dialog
|
|
|
|
// show video/camera filter dialog
|
|
|
|
if (propIdx == CV_CAP_PROP_SETTINGS ) |
|
|
|
if (propIdx == CV_CAP_PROP_SETTINGS ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
g_VI.showSettingsWindow(m_index); |
|
|
|
return g_VI.showSettingsWindow(m_index); |
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//video Filter properties
|
|
|
|
//video Filter properties
|
|
|
|