Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
57dc28fe
Commit
57dc28fe
authored
Jan 11, 2018
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #10504 from opentrack:fork
parents
18edd917
c8794c89
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
75 additions
and
25 deletions
+75
-25
cap_dshow.cpp
modules/videoio/src/cap_dshow.cpp
+75
-25
No files found.
modules/videoio/src/cap_dshow.cpp
View file @
57dc28fe
...
@@ -434,6 +434,8 @@ class videoDevice{
...
@@ -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{
...
@@ -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{
...
@@ -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{
...
@@ -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(){
...
@@ -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){
...
@@ -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
...
@@ -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
...
@@ -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
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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,
...
@@ -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
...
@@ -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
...
@@ -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){
...
@@ -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){
...
@@ -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
...
@@ -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 *
...
@@ -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
...
@@ -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)
...
@@ -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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment