Merge pull request #10504 from opentrack:fork

pull/10579/head
Alexander Alekhin 7 years ago
commit 57dc28fe99
  1. 100
      modules/videoio/src/cap_dshow.cpp

@ -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, &currentValue, &flags); pAMVideoProcAmp->Get(Property, &currentValue, &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, &currentValue, &flags); pIAMCameraControl->Get(Property, &currentValue, &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

Loading…
Cancel
Save