提交 57dc28fe 编写于 作者: A Alexander Alekhin

Merge pull request #10504 from opentrack:fork

......@@ -434,6 +434,8 @@ class videoDevice{
int myID;
long requestedFrameTime; //ie fps
LONG volatile property_window_count;
char nDeviceName[255];
WCHAR wDeviceName[255];
......@@ -499,7 +501,7 @@ class videoInput{
//Launches a pop up settings window
//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.....
//These are experimental for now.
......@@ -535,6 +537,8 @@ class videoInput{
bool isDeviceDisconnected(int deviceID);
int property_window_count(int device_idx);
private:
void setPhyCon(int deviceID, int conn);
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 char deviceNames[VI_MAX_CAMERAS][255];
};
/////////////////////////// HANDY FUNCTIONS /////////////////////////////
......@@ -764,6 +767,8 @@ videoDevice::videoDevice(){
pixels = 0;
formatType = 0;
property_window_count = 0;
memset(wDeviceName, 0, sizeof(WCHAR) * 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 = NULL;
if(FAILED(hr)){
DebugPrintOut("SETUP: couldn't set requested format\n");
}else{
......@@ -1586,36 +1592,47 @@ bool videoInput::isDeviceSetup(int id) const
// ----------------------------------------------------------------------
void __cdecl videoInput::basicThread(void * objPtr){
//get a reference to the video device
//not a copy as we need to free the filter
videoDevice * vd = *( (videoDevice **)(objPtr) );
ShowFilterPropertyPages(vd->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;
void __cdecl videoInput::basicThread(void* ptr)
{
videoDevice* dev = (videoDevice*) ptr;
IBaseFilter* filter = dev->pVideoInputFilter;
return;
(void) ShowFilterPropertyPages(filter);
(void) InterlockedDecrement(&dev->property_window_count);
}
void videoInput::showSettingsWindow(int id){
bool videoInput::showSettingsWindow(int id){
if(isDeviceSetup(id)){
//HANDLE myTempThread;
//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
//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){
//myTempThread = (HANDLE)
_beginthread(basicThread, 0, (void *)&VDList[id]);
// XXX TODO compare fourcc for mpeg devices? is this comment still valid? -sh 20180104
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);
if(FAILED(hr)){
DebugPrintOut("setVideoSetting - QueryInterface Error\n");
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return false;
}
......@@ -1654,8 +1673,10 @@ bool videoInput::getVideoSettingFilter(int deviceID, long Property, long &min, l
pAMVideoProcAmp->Get(Property, &currentValue, &flags);
if(pAMVideoProcAmp)pAMVideoProcAmp->Release();
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return true;
......@@ -1721,8 +1742,10 @@ bool videoInput::setVideoSettingFilter(int deviceID, long Property, long lValue,
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMVideoProcAmp, (void**)&pAMVideoProcAmp);
if(FAILED(hr)){
DebugPrintOut("setVideoSetting - QueryInterface Error\n");
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return false;
}
......@@ -1745,8 +1768,10 @@ bool videoInput::setVideoSettingFilter(int deviceID, long Property, long lValue,
}
if(pAMVideoProcAmp)pAMVideoProcAmp->Release();
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return true;
......@@ -1802,8 +1827,10 @@ bool videoInput::setVideoSettingCamera(int deviceID, long Property, long lValue,
hr = VDList[deviceID]->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl);
if (FAILED(hr)) {
DebugPrintOut("Error\n");
#if 0
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release();
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL;
#endif
return false;
}
else
......@@ -1822,8 +1849,10 @@ bool videoInput::setVideoSettingCamera(int deviceID, long Property, long lValue,
pIAMCameraControl->Set(Property, lValue, Flags);
}
pIAMCameraControl->Release();
#if 0
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter->Release();
if(VDList[deviceID]->pVideoInputFilter)VDList[deviceID]->pVideoInputFilter = NULL;
#endif
return true;
}
}
......@@ -1851,8 +1880,10 @@ bool videoInput::getVideoSettingCamera(int deviceID, long Property, long &min, l
hr = VD->pVideoInputFilter->QueryInterface(IID_IAMCameraControl, (void**)&pIAMCameraControl);
if(FAILED(hr)){
DebugPrintOut("setVideoSetting - QueryInterface Error\n");
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return false;
}
......@@ -1865,8 +1896,10 @@ bool videoInput::getVideoSettingCamera(int deviceID, long Property, long &min, l
pIAMCameraControl->Get(Property, &currentValue, &flags);
if(pIAMCameraControl)pIAMCameraControl->Release();
#if 0
if(VD->pVideoInputFilter)VD->pVideoInputFilter->Release();
if(VD->pVideoInputFilter)VD->pVideoInputFilter = NULL;
#endif
return true;
......@@ -2203,7 +2236,6 @@ void videoInput::getVideoPropertyAsString(int prop, char * propertyAsString){
int videoInput::getVideoPropertyFromCV(int cv_property){
// see VideoProcAmpProperty in strmif.h
switch (cv_property) {
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
//we release our video input filter but then reconnect with it
//each time we need to use it
#if 0
VD->pVideoInputFilter->Release();
VD->pVideoInputFilter = NULL;
#endif
VD->pGrabberF->Release();
VD->pGrabberF = NULL;
......@@ -2902,8 +2936,12 @@ HRESULT videoInput::getDevice(IBaseFilter** gottaFilter, int deviceId, WCHAR * w
count++;
}
// We found it, so send it back to the caller
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)gottaFilter);
// reuse existing filter due to webcam problems
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;
}
VariantClear(&varName);
......@@ -3125,6 +3163,14 @@ HRESULT videoInput::routeCrossbar(ICaptureGraphBuilder2 **ppBuild, IBaseFilter *
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
{
videoInput VideoCapture_DShow::g_VI;
......@@ -3189,6 +3235,11 @@ double VideoCapture_DShow::getProperty(int propIdx) const
return (double)current_value;
}
if (propIdx == CV_CAP_PROP_SETTINGS )
{
return g_VI.property_window_count(m_index);
}
// unknown parameter or value not available
return -1;
}
......@@ -3260,8 +3311,7 @@ bool VideoCapture_DShow::setProperty(int propIdx, double propVal)
// show video/camera filter dialog
if (propIdx == CV_CAP_PROP_SETTINGS )
{
g_VI.showSettingsWindow(m_index);
return true;
return g_VI.showSettingsWindow(m_index);
}
//video Filter properties
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册