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
65c46d0c
Commit
65c46d0c
authored
Apr 11, 2018
by
Vitaly Tuzov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removed WINRT related code
parent
7ea5029a
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
1275 deletions
+0
-1275
cap_msmf.cpp
modules/videoio/src/cap_msmf.cpp
+0
-666
cap_msmf.hpp
modules/videoio/src/cap_msmf.hpp
+0
-609
No files found.
modules/videoio/src/cap_msmf.cpp
View file @
65c46d0c
...
...
@@ -86,36 +86,11 @@
#include <mferror.h>
#ifdef WINRT
// for ComPtr usage
#include <wrl/client.h>
#ifdef __cplusplus_winrt
#include <agile.h>
#include <vccorlib.h>
#endif
#include <wrl\async.h>
#include <wrl\implements.h>
#include <wrl\module.h>
#include <wrl\wrappers\corewrappers.h>
#include <windows.media.capture.h>
#include <windows.devices.enumeration.h>
#ifdef HAVE_CONCURRENCY
#include <concrt.h>
#ifndef __cplusplus_winrt
#include "wrl.h"
#endif
#include "ppltasks_winrt.hpp"
#endif
#else
#include <comdef.h>
#endif
struct
IMFMediaType
;
#ifndef WINRT
struct
IMFActivate
;
struct
IMFMediaSource
;
#endif
struct
IMFAttributes
;
namespace
...
...
@@ -252,43 +227,6 @@ private:
ImageGrabberCallback
&
operator
=
(
const
ImageGrabberCallback
&
);
// Declared to fix compilation warning.
};
#ifdef WINRT
extern
const
__declspec
(
selectany
)
WCHAR
RuntimeClass_CV_ImageGrabberWinRT
[]
=
L"cv.ImageGrabberWinRT"
;
class
ImageGrabberWinRT
:
public
Microsoft
::
WRL
::
RuntimeClass
<
Microsoft
::
WRL
::
RuntimeClassFlags
<
Microsoft
::
WRL
::
RuntimeClassType
::
WinRtClassicComMix
>
,
IMFSampleGrabberSinkCallback
>
,
public
ImageGrabberCallback
{
InspectableClass
(
RuntimeClass_CV_ImageGrabberWinRT
,
BaseTrust
)
public
:
ImageGrabberWinRT
(
bool
synchronous
);
~
ImageGrabberWinRT
(
void
);
HRESULT
initImageGrabber
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
,
GUID
VideoFormat
);
HRESULT
startGrabbing
(
MAKE_WRL_REF
(
_AsyncAction
)
*
action
);
HRESULT
stopGrabbing
(
MAKE_WRL_REF
(
_AsyncAction
)
*
action
);
// IMFClockStateSink methods
STDMETHODIMP
OnClockStart
(
MFTIME
hnsSystemTime
,
LONGLONG
llClockStartOffset
)
{
return
ImageGrabberCallback
::
OnClockStart
(
hnsSystemTime
,
llClockStartOffset
);
}
STDMETHODIMP
OnClockStop
(
MFTIME
hnsSystemTime
)
{
return
ImageGrabberCallback
::
OnClockStop
(
hnsSystemTime
);
}
STDMETHODIMP
OnClockPause
(
MFTIME
hnsSystemTime
)
{
return
ImageGrabberCallback
::
OnClockPause
(
hnsSystemTime
);
}
STDMETHODIMP
OnClockRestart
(
MFTIME
hnsSystemTime
)
{
return
ImageGrabberCallback
::
OnClockRestart
(
hnsSystemTime
);
}
STDMETHODIMP
OnClockSetRate
(
MFTIME
hnsSystemTime
,
float
flRate
)
{
return
ImageGrabberCallback
::
OnClockSetRate
(
hnsSystemTime
,
flRate
);
}
// IMFSampleGrabberSinkCallback methods
STDMETHODIMP
OnSetPresentationClock
(
IMFPresentationClock
*
pClock
)
{
return
ImageGrabberCallback
::
OnSetPresentationClock
(
pClock
);
}
STDMETHODIMP
OnProcessSample
(
REFGUID
guidMajorMediaType
,
DWORD
dwSampleFlags
,
LONGLONG
llSampleTime
,
LONGLONG
llSampleDuration
,
const
BYTE
*
pSampleBuffer
,
DWORD
dwSampleSize
)
{
return
ImageGrabberCallback
::
OnProcessSample
(
guidMajorMediaType
,
dwSampleFlags
,
llSampleTime
,
llSampleDuration
,
pSampleBuffer
,
dwSampleSize
);
}
STDMETHODIMP
OnShutdown
()
{
return
ImageGrabberCallback
::
OnShutdown
();
}
// Function of creation of the instance of the class
static
HRESULT
CreateInstance
(
ImageGrabberWinRT
**
ppIG
,
bool
synchronous
=
false
);
private
:
MAKE_WRL_AGILE_REF
(
_MediaCapture
)
ig_pMedCapSource
;
MediaSink
*
ig_pMediaSink
;
};
#endif
// Class for grabbing image from video stream
class
ImageGrabber
:
public
ImageGrabberCallback
{
...
...
@@ -395,20 +333,7 @@ public:
CamParametrs
getParametrs
();
void
setParametrs
(
CamParametrs
parametrs
);
void
setEmergencyStopEvent
(
void
*
userData
,
void
(
*
func
)(
int
,
void
*
));
#ifdef WINRT
long
readInfoOfDevice
(
MAKE_WRL_REF
(
_IDeviceInformation
)
pDevice
,
unsigned
int
Num
);
void
waitForDevice
()
{
if
(
vd_pAction
)
{
#ifdef HAVE_CONCURRENCY
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
vd_pAction
).
wait
();
#endif
vd_pAction
=
nullptr
;
}
}
#else
long
readInfoOfDevice
(
IMFActivate
*
pActivate
,
unsigned
int
Num
);
#endif
wchar_t
*
getName
();
int
getCountFormats
();
unsigned
int
getWidth
();
...
...
@@ -441,32 +366,14 @@ private:
std
::
map
<
UINT64
,
FrameRateMap
>
vd_CaptureFormats
;
std
::
vector
<
MediaType
>
vd_CurrentFormats
;
IMFMediaSource
*
vd_pSource
;
#ifdef WINRT
MAKE_WRL_AGILE_REF
(
_MediaCapture
)
vd_pMedCap
;
EventRegistrationToken
vd_cookie
;
ImageGrabberWinRT
*
vd_pImGr
;
MAKE_WRL_REF
(
_AsyncAction
)
vd_pAction
;
#ifdef HAVE_CONCURRENCY
Concurrency
::
critical_section
vd_lock
;
#endif
#endif
emergensyStopEventCallback
vd_func
;
void
*
vd_userData
;
HRESULT
enumerateCaptureFormats
(
IMFMediaSource
*
pSource
);
long
setDeviceFormat
(
IMFMediaSource
*
pSource
,
unsigned
long
dwFormatIndex
);
void
buildLibraryofTypes
();
int
findType
(
unsigned
int
size
,
unsigned
int
frameRate
=
0
);
#ifdef WINRT
HRESULT
enumerateCaptureFormats
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
);
long
setDeviceFormat
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
,
unsigned
long
dwFormatIndex
,
MAKE_WRL_REF
(
_AsyncAction
)
*
pAction
);
long
resetDevice
(
MAKE_WRL_REF
(
_IDeviceInformation
)
pDevice
);
#ifdef HAVE_CONCURRENCY
long
checkDevice
(
_DeviceClass
devClass
,
DEFINE_TASK
<
void
>*
pTask
,
MAKE_WRL_REF
(
_IDeviceInformation
)
*
ppDevice
);
#endif
#else
long
resetDevice
(
IMFActivate
*
pActivate
);
long
checkDevice
(
IMFAttributes
*
pAttributes
,
IMFActivate
**
pDevice
);
#endif
long
initDevice
();
};
...
...
@@ -475,28 +382,13 @@ class videoDevices
{
public
:
~
videoDevices
(
void
);
#ifdef WINRT
long
initDevices
(
_DeviceClass
devClass
);
void
waitInit
()
{
if
(
vds_enumTask
)
{
#ifdef HAVE_CONCURRENCY
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
vds_enumTask
).
wait
();
#endif
vds_enumTask
=
nullptr
;
}
}
#else
long
initDevices
(
IMFAttributes
*
pAttributes
);
#endif
static
videoDevices
&
getInstance
();
videoDevice
*
getDevice
(
unsigned
int
i
);
unsigned
int
getCount
();
void
clearDevices
();
private
:
UINT32
count
;
#ifdef WINRT
MAKE_WRL_REF
(
_AsyncAction
)
vds_enumTask
;
#endif
std
::
vector
<
videoDevice
*>
vds_Devices
;
videoDevices
(
void
);
};
...
...
@@ -566,9 +458,6 @@ public:
bool
setupDevice
(
int
deviceID
,
unsigned
int
w
,
unsigned
int
h
,
unsigned
int
idealFramerate
=
30
);
// Checking of recivig of new frame from video device with deviceID
bool
isFrameNew
(
int
deviceID
);
#ifdef WINRT
void
waitForDevice
(
int
deviceID
);
#endif
// Writing of Raw Data pixels from video device with deviceID with correction of RedAndBlue flipping flipRedAndBlue and vertical flipping flipImage
bool
getPixels
(
int
deviceID
,
unsigned
char
*
pixels
,
bool
flipRedAndBlue
=
false
,
bool
flipImage
=
false
);
static
void
processPixels
(
unsigned
char
*
src
,
unsigned
char
*
dst
,
unsigned
int
width
,
unsigned
int
height
,
unsigned
int
bpp
,
bool
bRGB
,
bool
bFlip
);
...
...
@@ -1089,156 +978,6 @@ ImageGrabber::~ImageGrabber(void)
DebugPrintOut
(
L"IMAGEGRABBER VIDEODEVICE %i: Destroying instance of the ImageGrabber class
\n
"
,
ig_DeviceID
);
}
#ifdef WINRT
ImageGrabberWinRT
::
ImageGrabberWinRT
(
bool
synchronous
)
:
ImageGrabberCallback
(
synchronous
),
ig_pMediaSink
(
NULL
)
{
ig_pMedCapSource
=
nullptr
;
}
ImageGrabberWinRT
::~
ImageGrabberWinRT
(
void
)
{
//stop must already be performed and complete by object owner
if
(
ig_pMediaSink
!=
NULL
)
{
((
IMFMediaSink
*
)
ig_pMediaSink
)
->
Shutdown
();
}
SafeRelease
(
&
ig_pMediaSink
);
RELEASE_AGILE_WRL
(
ig_pMedCapSource
)
CloseHandle
(
ig_hFinish
);
if
(
ig_Synchronous
)
{
CloseHandle
(
ig_hFrameReady
);
CloseHandle
(
ig_hFrameGrabbed
);
}
DebugPrintOut
(
L"IMAGEGRABBER VIDEODEVICE: Destroying instance of the ImageGrabberWinRT class
\n
"
);
}
HRESULT
ImageGrabberWinRT
::
initImageGrabber
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
,
GUID
VideoFormat
)
{
HRESULT
hr
;
MAKE_WRL_OBJ
(
_VideoDeviceController
)
pDevCont
;
WRL_PROP_GET
(
pSource
,
VideoDeviceController
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_MediaDeviceController
,
pMedDevCont
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_MediaEncodingProperties
)
pMedEncProps
;
WRL_METHOD
(
pMedDevCont
,
GetMediaStreamProperties
,
pMedEncProps
,
hr
,
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
))
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_VideoEncodingProperties
,
pVidProps
,
pMedEncProps
,
hr
);
if
(
FAILED
(
hr
))
return
hr
;
_ComPtr
<
IMFMediaType
>
pType
=
NULL
;
hr
=
MediaSink
::
ConvertPropertiesToMediaType
(
DEREF_AS_NATIVE_WRL_OBJ
(
ABI
::
Windows
::
Media
::
MediaProperties
::
IMediaEncodingProperties
,
pMedEncProps
),
&
pType
);
if
(
FAILED
(
hr
))
return
hr
;
MediaType
MT
=
FormatReader
::
Read
(
pType
.
Get
());
unsigned
int
sizeRawImage
=
0
;
if
(
VideoFormat
==
MFVideoFormat_RGB24
)
{
sizeRawImage
=
MT
.
MF_MT_FRAME_SIZE
*
3
;
}
else
if
(
VideoFormat
==
MFVideoFormat_RGB32
)
{
sizeRawImage
=
MT
.
MF_MT_FRAME_SIZE
*
4
;
}
sizeRawImage
=
MT
.
MF_MT_SAMPLE_SIZE
;
CHECK_HR
(
hr
=
RawImage
::
CreateInstance
(
&
ig_RIFirst
,
sizeRawImage
));
CHECK_HR
(
hr
=
RawImage
::
CreateInstance
(
&
ig_RISecond
,
sizeRawImage
));
ig_RIOut
=
ig_RISecond
;
ig_pMedCapSource
=
pSource
;
done
:
return
hr
;
}
HRESULT
ImageGrabberWinRT
::
stopGrabbing
(
MAKE_WRL_REF
(
_AsyncAction
)
*
action
)
{
HRESULT
hr
=
S_OK
;
if
(
ig_pMedCapSource
!=
nullptr
)
{
GET_WRL_OBJ_FROM_REF
(
_MediaCaptureVideoPreview
,
imedPrevCap
,
DEREF_AGILE_WRL_OBJ
(
ig_pMedCapSource
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_REF
(
_AsyncAction
)
pAction
;
WRL_METHOD_BASE
(
imedPrevCap
,
StopPreviewAsync
,
pAction
,
hr
)
if
(
SUCCEEDED
(
hr
))
{
#ifdef HAVE_CONCURRENCY
DEFINE_TASK
<
void
>
_task
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pAction
);
*
action
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
_task
,
this
)
HRESULT
hr
=
S_OK
;
_task
.
wait
();
SafeRelease
(
&
ig_pMediaSink
);
SetEvent
(
ig_hFinish
);
END_CREATE_ASYNC
(
hr
));
#else
*
action
=
nullptr
;
#endif
}
}
return
hr
;
}
HRESULT
ImageGrabberWinRT
::
startGrabbing
(
MAKE_WRL_REF
(
_AsyncAction
)
*
action
)
{
HRESULT
hr
=
S_OK
;
GET_WRL_OBJ_FROM_REF
(
_MediaCaptureVideoPreview
,
imedPrevCap
,
DEREF_AGILE_WRL_OBJ
(
ig_pMedCapSource
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
ACTIVATE_OBJ
(
RuntimeClass_Windows_Foundation_Collections_PropertySet
,
_PropertySet
,
pSet
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_Map
,
spSetting
,
pSet
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
ACTIVATE_STATIC_OBJ
(
RuntimeClass_Windows_Foundation_PropertyValue
,
MAKE_WRL_OBJ
(
_PropertyValueStatics
),
spPropVal
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
_ObjectObj
pVal
;
boolean
bReplaced
;
WRL_METHOD
(
spPropVal
,
CreateUInt32
,
pVal
,
hr
,
(
unsigned
int
)
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
))
if
(
FAILED
(
hr
))
return
hr
;
WRL_METHOD
(
spSetting
,
Insert
,
bReplaced
,
hr
,
DEREF_WRL_OBJ
(
_StringReference
(
MF_PROP_VIDTYPE
)),
DEREF_WRL_OBJ
(
pVal
))
if
(
FAILED
(
hr
))
return
hr
;
WRL_METHOD
(
spSetting
,
Insert
,
bReplaced
,
hr
,
DEREF_WRL_OBJ
(
_StringReference
(
MF_PROP_SAMPLEGRABBERCALLBACK
)),
reinterpret_cast
<
_Object
>
(
this
))
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_VideoDeviceController
)
pDevCont
;
WRL_PROP_GET
(
ig_pMedCapSource
,
VideoDeviceController
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_MediaDeviceController
,
pMedDevCont
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_MediaEncodingProperties
)
pMedEncProps
;
WRL_METHOD
(
pMedDevCont
,
GetMediaStreamProperties
,
pMedEncProps
,
hr
,
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
))
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_VideoEncodingProperties
,
pVidProps
,
pMedEncProps
,
hr
);
if
(
FAILED
(
hr
))
return
hr
;
ACTIVATE_OBJ
(
RuntimeClass_Windows_Media_MediaProperties_MediaEncodingProfile
,
_MediaEncodingProfile
,
pEncProps
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
WRL_PROP_PUT
(
pEncProps
,
Video
,
DEREF_WRL_OBJ
(
pVidProps
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
WRL_METHOD
(
spSetting
,
Insert
,
bReplaced
,
hr
,
DEREF_WRL_OBJ
(
_StringReference
(
MF_PROP_VIDENCPROPS
)),
DEREF_WRL_OBJ
(
pVidProps
))
if
(
SUCCEEDED
(
hr
))
{
//can start/stop multiple times with same MediaCapture object if using activatable class
WRL_METHOD
(
imedPrevCap
,
_StartPreviewToCustomSinkIdAsync
,
*
action
,
hr
,
DEREF_WRL_OBJ
(
pEncProps
),
DEREF_WRL_OBJ
(
_StringReference
(
RuntimeClass_CV_MediaSink
)),
DEREF_WRL_OBJ
(
pSet
))
if
(
FAILED
(
hr
)
&&
hr
==
REGDB_E_CLASSNOTREG
)
{
hr
=
Microsoft
::
WRL
::
Make
<
MediaSink
>
().
CopyTo
(
&
ig_pMediaSink
);
if
(
FAILED
(
hr
))
return
hr
;
hr
=
((
ABI
::
Windows
::
Media
::
IMediaExtension
*
)
ig_pMediaSink
)
->
SetProperties
(
DEREF_AS_NATIVE_WRL_OBJ
(
ABI
::
Windows
::
Foundation
::
Collections
::
IPropertySet
,
pSet
));
if
(
FAILED
(
hr
))
return
hr
;
WRL_METHOD
(
imedPrevCap
,
StartPreviewToCustomSinkAsync
,
*
action
,
hr
,
DEREF_WRL_OBJ
(
pEncProps
),
reinterpret_cast
<
MAKE_WRL_REF
(
_MediaExtension
)
>
(
ig_pMediaSink
))
}
}
return
hr
;
}
HRESULT
ImageGrabberWinRT
::
CreateInstance
(
ImageGrabberWinRT
**
ppIG
,
bool
synchronous
)
{
*
ppIG
=
Microsoft
::
WRL
::
Make
<
ImageGrabberWinRT
>
(
synchronous
).
Detach
();
if
(
ppIG
==
NULL
)
{
return
E_OUTOFMEMORY
;
}
DebugPrintOut
(
L"IMAGEGRABBER VIDEODEVICE: Creating instance of ImageGrabberWinRT
\n
"
);
return
S_OK
;
}
#endif
HRESULT
ImageGrabber
::
initImageGrabber
(
IMFMediaSource
*
pSource
)
{
// Clean up.
...
...
@@ -1811,12 +1550,6 @@ unsigned char * RawImage::getpPixels()
videoDevice
::
videoDevice
(
void
)
:
vd_IsSetuped
(
false
),
vd_LockOut
(
OpenLock
),
vd_pFriendlyName
(
NULL
),
vd_Width
(
0
),
vd_Height
(
0
),
vd_FrameRate
(
0
),
vd_pSource
(
NULL
),
vd_pImGrTh
(
NULL
),
vd_func
(
NULL
),
vd_userData
(
NULL
)
{
#ifdef WINRT
vd_pMedCap
=
nullptr
;
vd_cookie
.
value
=
0
;
vd_pImGr
=
NULL
;
vd_pAction
=
nullptr
;
#endif
}
void
videoDevice
::
setParametrs
(
CamParametrs
parametrs
)
...
...
@@ -1899,63 +1632,13 @@ CamParametrs videoDevice::getParametrs()
return
out
;
}
#ifdef WINRT
long
videoDevice
::
resetDevice
(
MAKE_WRL_REF
(
_IDeviceInformation
)
pDevice
)
#else
long
videoDevice
::
resetDevice
(
IMFActivate
*
pActivate
)
#endif
{
HRESULT
hr
=
E_FAIL
;
vd_CurrentFormats
.
clear
();
if
(
vd_pFriendlyName
)
CoTaskMemFree
(
vd_pFriendlyName
);
vd_pFriendlyName
=
NULL
;
#ifdef WINRT
if
(
pDevice
)
{
ACTIVATE_OBJ
(
RuntimeClass_Windows_Media_Capture_MediaCapture
,
_MediaCapture
,
pIMedCap
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
ACTIVATE_OBJ
(
RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings
,
_MediaCaptureInitializationSettings
,
pCapInitSet
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
_StringObj
str
;
WRL_PROP_GET
(
pDevice
,
Name
,
*
REF_WRL_OBJ
(
str
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
unsigned
int
length
=
0
;
PCWSTR
wstr
=
WindowsGetStringRawBuffer
(
reinterpret_cast
<
HSTRING
>
(
DEREF_WRL_OBJ
(
str
)),
&
length
);
vd_pFriendlyName
=
(
wchar_t
*
)
CoTaskMemAlloc
((
length
+
1
)
*
sizeof
(
wchar_t
));
wcscpy
(
vd_pFriendlyName
,
wstr
);
WRL_PROP_GET
(
pDevice
,
Id
,
*
REF_WRL_OBJ
(
str
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
WRL_PROP_PUT
(
pCapInitSet
,
VideoDeviceId
,
DEREF_WRL_OBJ
(
str
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
WRL_PROP_PUT
(
pCapInitSet
,
StreamingCaptureMode
,
WRL_ENUM_GET
(
_StreamingCaptureMode
,
StreamingCaptureMode
,
Video
),
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_REF
(
_AsyncAction
)
pAction
;
WRL_METHOD
(
DEREF_WRL_OBJ
(
pIMedCap
),
_InitializeWithSettingsAsync
,
pAction
,
hr
,
DEREF_WRL_OBJ
(
pCapInitSet
))
#ifdef HAVE_CONCURRENCY
DEFINE_TASK
<
void
>
_task
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pAction
);
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_AGILE_REF
(
_MediaCapture
)
pAgileMedCap
;
pAgileMedCap
=
PREPARE_TRANSFER_WRL_OBJ
(
pIMedCap
);
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
vd_lock
);
MAKE_WRL_REF
(
_AsyncAction
)
pOldAction
=
vd_pAction
;
SAVE_CURRENT_CONTEXT
(
context
);
vd_pAction
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
_task
,
pOldAction
,
context
,
&
pAgileMedCap
,
this
)
HRESULT
hr
=
S_OK
;
if
(
pOldAction
)
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pOldAction
).
wait
();
_task
.
wait
();
if
(
SUCCEEDED
(
hr
))
{
//all camera capture calls only in original context
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
pAgileMedCap
,
this
)
enumerateCaptureFormats
(
DEREF_AGILE_WRL_OBJ
(
pAgileMedCap
));
END_CALL_IN_CONTEXT_BASE
}
buildLibraryofTypes
();
RELEASE_AGILE_WRL
(
pAgileMedCap
)
END_CREATE_ASYNC
(
hr
));
#endif
}
#else
if
(
pActivate
)
{
IMFMediaSource
*
pSource
=
NULL
;
...
...
@@ -1981,64 +1664,15 @@ long videoDevice::resetDevice(IMFActivate *pActivate)
DebugPrintOut
(
L"VIDEODEVICE %i: IMFMediaSource interface cannot be created
\n
"
,
vd_CurrentNumber
);
}
}
#endif
return
hr
;
}
#ifdef WINRT
long
videoDevice
::
readInfoOfDevice
(
MAKE_WRL_REF
(
_IDeviceInformation
)
pDevice
,
unsigned
int
Num
)
{
HRESULT
hr
=
-
1
;
vd_CurrentNumber
=
Num
;
hr
=
resetDevice
(
pDevice
);
return
hr
;
}
#else
long
videoDevice
::
readInfoOfDevice
(
IMFActivate
*
pActivate
,
unsigned
int
Num
)
{
vd_CurrentNumber
=
Num
;
return
resetDevice
(
pActivate
);
}
#endif
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
long
videoDevice
::
checkDevice
(
_DeviceClass
devClass
,
DEFINE_TASK
<
void
>*
pTask
,
MAKE_WRL_REF
(
_IDeviceInformation
)
*
ppDevice
)
{
HRESULT
hr
=
S_OK
;
ACTIVATE_STATIC_OBJ
(
RuntimeClass_Windows_Devices_Enumeration_DeviceInformation
,
MAKE_WRL_OBJ
(
_DeviceInformationStatics
),
pDevStat
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_REF
(
_AsyncOperation
<
MAKE_WRL_REF
(
_DeviceInformationCollection
)
>
)
pAction
;
WRL_METHOD
(
pDevStat
,
_FindAllAsyncDeviceClass
,
pAction
,
hr
,
devClass
)
if
(
SUCCEEDED
(
hr
))
{
*
pTask
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)([
pAction
,
&
ppDevice
,
this
]()
->
DEFINE_RET_FORMAL
(
void
)
{
HRESULT
hr
=
S_OK
;
MAKE_WRL_OBJ
(
_VectorView
<
MAKE_WRL_REF
(
_DeviceInformation
)
>
)
pVector
=
CREATE_TASK
DEFINE_RET_TYPE
(
MAKE_WRL_REF
(
_VectorView
<
MAKE_WRL_REF
(
_DeviceInformation
)
>
))(
pAction
).
get
();
UINT32
count
=
0
;
if
(
SUCCEEDED
(
hr
))
WRL_PROP_GET
(
pVector
,
Size
,
count
,
hr
)
if
(
SUCCEEDED
(
hr
)
&&
count
>
0
)
{
for
(
UINT32
i
=
0
;
i
<
count
;
i
++
)
{
MAKE_WRL_OBJ
(
_IDeviceInformation
)
pDevice
;
WRL_METHOD
(
pVector
,
GetAt
,
pDevice
,
hr
,
i
)
if
(
SUCCEEDED
(
hr
))
{
_StringObj
str
;
unsigned
int
length
=
0
;
WRL_PROP_GET
(
pDevice
,
Name
,
*
REF_WRL_OBJ
(
str
),
hr
)
PCWSTR
wstr
=
WindowsGetStringRawBuffer
(
reinterpret_cast
<
HSTRING
>
(
DEREF_WRL_OBJ
(
str
)),
&
length
);
if
(
wcscmp
(
wstr
,
vd_pFriendlyName
)
==
0
)
{
*
ppDevice
=
PREPARE_TRANSFER_WRL_OBJ
(
pDevice
);
}
}
}
}
RET_VAL_BASE
;
});
}
return
hr
;
}
#endif
#else
long
videoDevice
::
checkDevice
(
IMFAttributes
*
pAttributes
,
IMFActivate
**
pDevice
)
{
IMFActivate
**
ppDevices
=
NULL
;
...
...
@@ -2095,59 +1729,11 @@ long videoDevice::checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice)
}
return
hr
;
}
#endif
long
videoDevice
::
initDevice
()
{
HRESULT
hr
=
S_OK
;
CoInitialize
(
NULL
);
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
vd_lock
);
MAKE_WRL_REF
(
_AsyncAction
)
pOldAction
=
vd_pAction
;
SAVE_CURRENT_CONTEXT
(
context
);
vd_pAction
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
pOldAction
,
context
,
this
)
HRESULT
hr
;
if
(
pOldAction
)
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pOldAction
).
wait
();
DEFINE_TASK
<
void
>
pTask
;
MAKE_WRL_OBJ
(
_IDeviceInformation
)
pDevInfo
;
hr
=
checkDevice
(
WRL_ENUM_GET
(
_DeviceClass
,
DeviceClass
,
VideoCapture
),
&
pTask
,
REF_WRL_OBJ
(
pDevInfo
));
if
(
SUCCEEDED
(
hr
))
pTask
.
wait
();
if
(
SUCCEEDED
(
hr
))
{
DEFINE_TASK
<
void
>
_task
;
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
pDevInfo
,
&
_task
,
context
,
this
)
HRESULT
hr
;
ACTIVATE_OBJ
(
RuntimeClass_Windows_Media_Capture_MediaCapture
,
_MediaCapture
,
pIMedCap
,
hr
)
if
(
SUCCEEDED
(
hr
))
{
RELEASE_WRL
(
vd_pMedCap
);
vd_pMedCap
=
PREPARE_TRANSFER_WRL_OBJ
(
pIMedCap
);
ACTIVATE_OBJ
(
RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings
,
_MediaCaptureInitializationSettings
,
pCapInitSet
,
hr
)
_StringObj
str
;
if
(
SUCCEEDED
(
hr
))
{
WRL_PROP_GET
(
pDevInfo
,
Id
,
*
REF_WRL_OBJ
(
str
),
hr
)
if
(
SUCCEEDED
(
hr
))
{
WRL_PROP_PUT
(
pCapInitSet
,
VideoDeviceId
,
DEREF_WRL_OBJ
(
str
),
hr
)
}
}
if
(
SUCCEEDED
(
hr
))
WRL_PROP_PUT
(
pCapInitSet
,
StreamingCaptureMode
,
WRL_ENUM_GET
(
_StreamingCaptureMode
,
StreamingCaptureMode
,
Video
),
hr
)
if
(
SUCCEEDED
(
hr
))
reinterpret_cast
<
ABI
::
Windows
::
Media
::
Capture
::
IMediaCapture
*>
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
))
->
add_Failed
(
Microsoft
::
WRL
::
Callback
<
ABI
::
Windows
::
Media
::
Capture
::
IMediaCaptureFailedEventHandler
>
([
this
,
context
](
ABI
::
Windows
::
Media
::
Capture
::
IMediaCapture
*
,
ABI
::
Windows
::
Media
::
Capture
::
IMediaCaptureFailedEventArgs
*
)
->
HRESULT
{
HRESULT
hr
;
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
this
)
closeDevice
();
END_CALL_IN_CONTEXT_BASE
return
hr
;
}).
Get
(),
&
vd_cookie
);
MAKE_WRL_OBJ
(
_AsyncAction
)
pAction
;
if
(
SUCCEEDED
(
hr
))
WRL_METHOD
(
vd_pMedCap
,
_InitializeWithSettingsAsync
,
*
REF_WRL_OBJ
(
pAction
),
hr
,
DEREF_WRL_OBJ
(
pCapInitSet
))
if
(
SUCCEEDED
(
hr
))
_task
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
DEREF_WRL_OBJ
(
pAction
));
}
END_CALL_IN_CONTEXT
(
hr
)
_task
.
wait
();
}
END_CREATE_ASYNC
(
hr
));
#endif
#else
_ComPtr
<
IMFAttributes
>
pAttributes
=
NULL
;
IMFActivate
*
vd_pActivate
=
NULL
;
hr
=
MFCreateAttributes
(
pAttributes
.
GetAddressOf
(),
1
);
...
...
@@ -2182,7 +1768,6 @@ long videoDevice::initDevice()
{
DebugPrintOut
(
L"VIDEODEVICE %i: The attribute of video cameras cannot be getting
\n
"
,
vd_CurrentNumber
);
}
#endif
return
hr
;
}
...
...
@@ -2209,31 +1794,6 @@ void videoDevice::closeDevice()
{
vd_IsSetuped
=
false
;
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
if
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
))
{
MAKE_WRL_REF
(
_AsyncAction
)
action
;
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
vd_lock
);
MAKE_WRL_REF
(
_AsyncAction
)
pOldAction
=
vd_pAction
;
vd_pImGr
->
stopGrabbing
(
&
action
);
reinterpret_cast
<
ABI
::
Windows
::
Media
::
Capture
::
IMediaCapture
*>
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
))
->
remove_Failed
(
vd_cookie
);
vd_cookie
.
value
=
0
;
vd_pAction
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
action
,
pOldAction
,
this
)
HRESULT
hr
=
S_OK
;
if
(
pOldAction
)
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pOldAction
).
wait
();
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
action
).
wait
();
RELEASE_WRL
(
vd_pMedCap
)
if
(
vd_LockOut
==
RawDataLock
)
{
delete
vd_pImGr
;
}
vd_pImGr
=
NULL
;
vd_LockOut
=
OpenLock
;
END_CREATE_ASYNC
(
hr
));
return
;
}
#endif
#endif
vd_pSource
->
Shutdown
();
SafeRelease
(
&
vd_pSource
);
if
(
vd_LockOut
==
RawDataLock
)
...
...
@@ -2363,26 +1923,6 @@ void videoDevice::buildLibraryofTypes()
}
}
#ifdef WINRT
long
videoDevice
::
setDeviceFormat
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
,
unsigned
long
dwFormatIndex
,
MAKE_WRL_REF
(
_AsyncAction
)
*
pAction
)
{
HRESULT
hr
;
MAKE_WRL_OBJ
(
_VideoDeviceController
)
pDevCont
;
WRL_PROP_GET
(
pSource
,
VideoDeviceController
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_MediaDeviceController
,
pMedDevCont
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_VectorView
<
MAKE_WRL_REF
(
_MediaEncodingProperties
)
>
)
pVector
;
WRL_METHOD
(
pMedDevCont
,
GetAvailableMediaStreamProperties
,
pVector
,
hr
,
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
))
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_MediaEncodingProperties
)
pMedEncProps
;
WRL_METHOD
(
pVector
,
GetAt
,
pMedEncProps
,
hr
,
dwFormatIndex
)
if
(
FAILED
(
hr
))
return
hr
;
WRL_METHOD
(
pMedDevCont
,
SetMediaStreamPropertiesAsync
,
*
pAction
,
hr
,
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
),
DEREF_WRL_OBJ
(
pMedEncProps
))
return
hr
;
}
#endif
long
videoDevice
::
setDeviceFormat
(
IMFMediaSource
*
pSource
,
unsigned
long
dwFormatIndex
)
{
_ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
...
...
@@ -2424,9 +1964,6 @@ bool videoDevice::isDeviceSetup()
RawImage
*
videoDevice
::
getRawImageOut
()
{
if
(
!
vd_IsSetuped
)
return
NULL
;
#ifdef WINRT
if
(
vd_pImGr
)
return
vd_pImGr
->
getRawImage
();
#endif
if
(
vd_pImGrTh
)
return
vd_pImGrTh
->
getImageGrabber
()
->
getRawImage
();
else
...
...
@@ -2446,27 +1983,6 @@ bool videoDevice::isFrameNew()
vd_LockOut
=
RawDataLock
;
//must already be closed
#ifdef WINRT
if
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
))
{
MAKE_WRL_REF
(
_AsyncAction
)
action
;
if
(
FAILED
(
ImageGrabberWinRT
::
CreateInstance
(
&
vd_pImGr
)))
return
false
;
if
(
FAILED
(
vd_pImGr
->
initImageGrabber
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
),
MFVideoFormat_RGB24
))
||
FAILED
(
vd_pImGr
->
startGrabbing
(
&
action
)))
{
delete
vd_pImGr
;
return
false
;
}
#ifdef HAVE_CONCURRENCY
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
vd_lock
);
MAKE_WRL_REF
(
_AsyncAction
)
pOldAction
=
vd_pAction
;
DEFINE_TASK
<
void
>
_task
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
action
);
vd_pAction
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
_task
,
pOldAction
,
this
)
HRESULT
hr
=
S_OK
;
if
(
pOldAction
)
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pOldAction
).
wait
();
_task
.
wait
();
END_CREATE_ASYNC
(
hr
));
#endif
return
true
;
}
#endif
HRESULT
hr
=
ImageGrabberThread
::
CreateInstance
(
&
vd_pImGrTh
,
vd_pSource
,
vd_CurrentNumber
);
if
(
FAILED
(
hr
))
{
...
...
@@ -2477,10 +1993,6 @@ bool videoDevice::isFrameNew()
vd_pImGrTh
->
start
();
return
true
;
}
#ifdef WINRT
if
(
vd_pImGr
)
return
vd_pImGr
->
getRawImage
()
->
isNew
();
#endif
if
(
vd_pImGrTh
)
return
vd_pImGrTh
->
getImageGrabber
()
->
getRawImage
()
->
isNew
();
}
...
...
@@ -2506,46 +2018,16 @@ bool videoDevice::setupDevice(unsigned int id)
HRESULT
hr
=
initDevice
();
if
(
SUCCEEDED
(
hr
))
{
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
vd_lock
);
MAKE_WRL_REF
(
_AsyncAction
)
pOldAction
=
vd_pAction
;
SAVE_CURRENT_CONTEXT
(
context
);
vd_pAction
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
pOldAction
,
context
,
id
,
this
)
HRESULT
hr
;
if
(
pOldAction
)
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pOldAction
).
wait
();
#endif
#endif
vd_Width
=
vd_CurrentFormats
[
id
].
width
;
vd_Height
=
vd_CurrentFormats
[
id
].
height
;
vd_FrameRate
=
vd_CurrentFormats
[
id
].
MF_MT_FRAME_RATE_NUMERATOR
/
vd_CurrentFormats
[
id
].
MF_MT_FRAME_RATE_DENOMINATOR
;
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
if
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
))
{
DEFINE_TASK
<
void
>
_task
;
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
id
,
&
_task
,
this
)
MAKE_WRL_REF
(
_AsyncAction
)
pAction
;
HRESULT
hr
=
setDeviceFormat
(
DEREF_AGILE_WRL_OBJ
(
vd_pMedCap
),
(
DWORD
)
id
,
&
pAction
);
if
(
SUCCEEDED
(
hr
))
_task
=
CREATE_TASK
DEFINE_RET_TYPE
(
void
)(
pAction
);
END_CALL_IN_CONTEXT
(
hr
)
if
(
SUCCEEDED
(
hr
))
_task
.
wait
();
}
else
#endif
#endif
hr
=
setDeviceFormat
(
vd_pSource
,
(
DWORD
)
id
);
vd_IsSetuped
=
(
SUCCEEDED
(
hr
));
if
(
vd_IsSetuped
)
DebugPrintOut
(
L"
\n\n
VIDEODEVICE %i: Device is setuped
\n
"
,
vd_CurrentNumber
);
vd_PrevParametrs
=
getParametrs
();
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
END_CREATE_ASYNC
(
hr
));
#endif
return
true
;
#else
return
vd_IsSetuped
;
#endif
}
else
{
...
...
@@ -2577,43 +2059,11 @@ wchar_t *videoDevice::getName()
videoDevice
::~
videoDevice
(
void
)
{
closeDevice
();
#ifdef WINRT
RELEASE_WRL
(
vd_pMedCap
)
#endif
SafeRelease
(
&
vd_pSource
);
if
(
vd_pFriendlyName
)
CoTaskMemFree
(
vd_pFriendlyName
);
}
#ifdef WINRT
HRESULT
videoDevice
::
enumerateCaptureFormats
(
MAKE_WRL_REF
(
_MediaCapture
)
pSource
)
{
HRESULT
hr
;
MAKE_WRL_OBJ
(
_VideoDeviceController
)
pDevCont
;
WRL_PROP_GET
(
pSource
,
VideoDeviceController
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
GET_WRL_OBJ_FROM_OBJ
(
_MediaDeviceController
,
pMedDevCont
,
pDevCont
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_OBJ
(
_VectorView
<
MAKE_WRL_REF
(
_MediaEncodingProperties
)
>
)
pVector
;
WRL_METHOD
(
pMedDevCont
,
GetAvailableMediaStreamProperties
,
pVector
,
hr
,
WRL_ENUM_GET
(
_MediaStreamType
,
MediaStreamType
,
VideoPreview
))
if
(
FAILED
(
hr
))
return
hr
;
UINT32
count
;
WRL_PROP_GET
(
pVector
,
Size
,
count
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
for
(
UINT32
i
=
0
;
i
<
count
;
i
++
)
{
MAKE_WRL_OBJ
(
_MediaEncodingProperties
)
pMedEncProps
;
WRL_METHOD
(
pVector
,
GetAt
,
pMedEncProps
,
hr
,
i
)
if
(
FAILED
(
hr
))
return
hr
;
_ComPtr
<
IMFMediaType
>
pType
=
NULL
;
hr
=
MediaSink
::
ConvertPropertiesToMediaType
(
DEREF_AS_NATIVE_WRL_OBJ
(
ABI
::
Windows
::
Media
::
MediaProperties
::
IMediaEncodingProperties
,
pMedEncProps
),
&
pType
);
if
(
FAILED
(
hr
))
return
hr
;
MediaType
MT
=
FormatReader
::
Read
(
pType
.
Get
());
vd_CurrentFormats
.
push_back
(
MT
);
}
return
hr
;
}
#endif
HRESULT
videoDevice
::
enumerateCaptureFormats
(
IMFMediaSource
*
pSource
)
{
HRESULT
hr
=
S_OK
;
...
...
@@ -2668,9 +2118,6 @@ done:
videoDevices
::
videoDevices
(
void
)
:
count
(
0
)
{
#ifdef WINRT
vds_enumTask
=
nullptr
;
#endif
}
void
videoDevices
::
clearDevices
()
...
...
@@ -2699,41 +2146,6 @@ videoDevice * videoDevices::getDevice(unsigned int i)
return
vds_Devices
[
i
];
}
#ifdef WINRT
long
videoDevices
::
initDevices
(
_DeviceClass
devClass
)
{
HRESULT
hr
=
S_OK
;
ACTIVATE_STATIC_OBJ
(
RuntimeClass_Windows_Devices_Enumeration_DeviceInformation
,
MAKE_WRL_OBJ
(
_DeviceInformationStatics
),
pDevStat
,
hr
)
if
(
FAILED
(
hr
))
return
hr
;
MAKE_WRL_REF
(
_AsyncOperation
<
MAKE_WRL_REF
(
_DeviceInformationCollection
)
>
)
pAction
;
WRL_METHOD
(
pDevStat
,
_FindAllAsyncDeviceClass
,
pAction
,
hr
,
devClass
)
if
(
SUCCEEDED
(
hr
))
{
#ifdef HAVE_CONCURRENCY
SAVE_CURRENT_CONTEXT
(
context
);
vds_enumTask
=
reinterpret_cast
<
MAKE_WRL_REF
(
_AsyncAction
)
>
(
BEGIN_CREATE_ASYNC
(
void
,
pAction
,
context
,
this
)
HRESULT
hr
=
S_OK
;
MAKE_WRL_OBJ
(
_VectorView
<
MAKE_WRL_REF
(
_DeviceInformation
)
>
)
pVector
=
CREATE_TASK
DEFINE_RET_TYPE
(
MAKE_WRL_REF
(
_VectorView
<
MAKE_WRL_REF
(
_DeviceInformation
)
>
))(
pAction
).
get
();
if
(
SUCCEEDED
(
hr
))
WRL_PROP_GET
(
pVector
,
Size
,
count
,
hr
)
if
(
SUCCEEDED
(
hr
)
&&
count
>
0
)
{
for
(
UINT32
i
=
0
;
i
<
count
;
i
++
)
{
videoDevice
*
vd
=
new
videoDevice
;
MAKE_WRL_OBJ
(
_IDeviceInformation
)
pDevice
;
WRL_METHOD
(
pVector
,
GetAt
,
pDevice
,
hr
,
i
)
if
(
SUCCEEDED
(
hr
))
{
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
vd
,
pDevice
,
i
)
vd
->
readInfoOfDevice
(
DEREF_WRL_OBJ
(
pDevice
),
i
);
END_CALL_IN_CONTEXT_BASE
vds_Devices
.
push_back
(
vd
);
}
}
}
END_CREATE_ASYNC
(
hr
));
#endif
}
return
hr
;
}
#else
long
videoDevices
::
initDevices
(
IMFAttributes
*
pAttributes
)
{
clearDevices
();
...
...
@@ -2761,7 +2173,6 @@ long videoDevices::initDevices(IMFAttributes *pAttributes)
}
return
hr
;
}
#endif
unsigned
int
videoDevices
::
getCount
()
{
...
...
@@ -2836,10 +2247,6 @@ videoInput::videoInput(void): MF(Media_Foundation::getInstance()), accessToDevic
void
videoInput
::
updateListOfDevices
()
{
HRESULT
hr
=
S_OK
;
#ifdef WINRT
videoDevices
*
vDs
=
&
videoDevices
::
getInstance
();
hr
=
vDs
->
initDevices
(
WRL_ENUM_GET
(
_DeviceClass
,
DeviceClass
,
VideoCapture
));
#else
_ComPtr
<
IMFAttributes
>
pAttributes
=
NULL
;
CoInitialize
(
NULL
);
hr
=
MFCreateAttributes
(
pAttributes
.
GetAddressOf
(),
1
);
...
...
@@ -2855,7 +2262,6 @@ void videoInput::updateListOfDevices()
videoDevices
*
vDs
=
&
videoDevices
::
getInstance
();
hr
=
vDs
->
initDevices
(
pAttributes
.
Get
());
}
#endif
if
(
FAILED
(
hr
))
{
DebugPrintOut
(
L"MEDIA FOUNDATION: The access to the video cameras denied
\n
"
);
...
...
@@ -3059,36 +2465,6 @@ bool videoInput::isFrameNew(int deviceID)
return
false
;
}
#ifdef WINRT
void
videoInput
::
waitForDevice
(
int
deviceID
)
{
if
(
deviceID
<
0
)
{
DebugPrintOut
(
L"VIDEODEVICE %i: Invalid device ID
\n
"
,
deviceID
);
return
;
}
if
(
accessToDevices
)
{
if
(
!
isDeviceSetup
(
deviceID
))
{
if
(
isDeviceMediaSource
(
deviceID
))
return
;
}
videoDevices
*
VDS
=
&
videoDevices
::
getInstance
();
videoDevice
*
VD
=
VDS
->
getDevice
(
deviceID
);
if
(
VD
)
{
VD
->
waitForDevice
();
}
}
else
{
DebugPrintOut
(
L"VIDEODEVICE(s): There is not any suitable video device
\n
"
);
}
return
;
}
#endif
unsigned
int
videoInput
::
getCountFormats
(
int
deviceID
)
const
{
if
(
deviceID
<
0
)
...
...
@@ -3268,9 +2644,6 @@ unsigned int videoInput::listDevices(bool silent)
if
(
accessToDevices
)
{
videoDevices
*
VDS
=
&
videoDevices
::
getInstance
();
#ifdef WINRT
VDS
->
waitInit
();
#endif
out
=
VDS
->
getCount
();
if
(
!
silent
)
DebugPrintOut
(
L"
\n
VIDEOINPUT SPY MODE!
\n\n
"
);
if
(
!
silent
)
DebugPrintOut
(
L"SETUP: Looking For Capture Devices
\n
"
);
...
...
@@ -3458,12 +2831,6 @@ protected:
int
index
,
width
,
height
,
fourcc
;
IplImage
*
frame
;
videoInput
VI
;
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
DEFINE_TASK
<
bool
>
openTask
;
Concurrency
::
critical_section
lock
;
#endif
#endif
};
#ifdef _DEBUG
...
...
@@ -3506,12 +2873,6 @@ void CvCaptureCAM_MSMF::close()
// Initialize camera input
bool
CvCaptureCAM_MSMF
::
open
(
int
_index
)
{
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
SAVE_CURRENT_CONTEXT
(
context
);
auto
func
=
[
_index
,
context
,
this
](
DEFINE_RET_VAL
(
bool
))
->
DEFINE_RET_FORMAL
(
bool
)
{
#endif
#endif
int
try_index
=
_index
;
int
devices
=
0
;
close
();
...
...
@@ -3519,37 +2880,10 @@ bool CvCaptureCAM_MSMF::open( int _index )
if
(
devices
==
0
)
return
false
;
try_index
=
try_index
<
0
?
0
:
(
try_index
>
devices
-
1
?
devices
-
1
:
try_index
);
#ifdef WINRT
HRESULT
hr
;
#ifdef HAVE_CONCURRENCY
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
this
,
try_index
)
#endif
#endif
VI
.
setupDevice
(
try_index
,
0
,
0
,
0
);
// With maximum frame size.
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
END_CALL_IN_CONTEXT_BASE
VI
.
waitForDevice
(
try_index
);
BEGIN_CALL_IN_CONTEXT
(
hr
,
context
,
this
,
try_index
)
HRESULT
hr
=
S_OK
;
#endif
#endif
if
(
!
VI
.
isFrameNew
(
try_index
)
)
#ifdef WINRT
hr
=
E_FAIL
;
#else
return
false
;
#endif
index
=
try_index
;
#ifdef WINRT
#ifdef HAVE_CONCURRENCY
END_CALL_IN_CONTEXT_BASE
RET_VAL
(
true
)
};
Concurrency
::
critical_section
::
scoped_lock
_LockHolder
(
lock
);
CREATE_OR_CONTINUE_TASK
(
openTask
,
bool
,
func
)
#endif
#endif
return
true
;
}
...
...
modules/videoio/src/cap_msmf.hpp
View file @
65c46d0c
#ifdef WINRT
#define ICustomStreamSink StreamSink
#ifndef __cplusplus_winrt
#include "wrl.h"
#endif
#else
EXTERN_C
const
IID
IID_ICustomStreamSink
;
class
DECLSPEC_UUID
(
"4F8A1939-2FD3-46DB-AE70-DB7E0DD79B73"
)
DECLSPEC_NOVTABLE
ICustomStreamSink
:
public
IUnknown
...
...
@@ -16,7 +10,6 @@ public:
virtual
HRESULT
Restart
()
=
0
;
virtual
HRESULT
Stop
()
=
0
;
};
#endif
#define MF_PROP_SAMPLEGRABBERCALLBACK L"samplegrabbercallback"
#define MF_PROP_VIDTYPE L"vidtype"
...
...
@@ -182,219 +175,6 @@ MAKE_ENUM(MFSTREAMSINK_MARKER_TYPE) StreamSinkMarkerTypePairs[] = {
};
MAKE_MAP
(
MFSTREAMSINK_MARKER_TYPE
)
StreamSinkMarkerTypeMap
(
StreamSinkMarkerTypePairs
,
StreamSinkMarkerTypePairs
+
sizeof
(
StreamSinkMarkerTypePairs
)
/
sizeof
(
StreamSinkMarkerTypePairs
[
0
]));
#ifdef WINRT
#ifdef __cplusplus_winrt
#define _ContextCallback Concurrency::details::_ContextCallback
#define BEGIN_CALL_IN_CONTEXT(hr, var, ...) hr = S_OK;\
var._CallInContext([__VA_ARGS__]() {
#define END_CALL_IN_CONTEXT(hr) if (FAILED(hr)) throw Platform::Exception::CreateException(hr);\
});
#define END_CALL_IN_CONTEXT_BASE });
#else
#define _ContextCallback Concurrency_winrt::details::_ContextCallback
#define BEGIN_CALL_IN_CONTEXT(hr, var, ...) hr = var._CallInContext([__VA_ARGS__]() -> HRESULT {
#define END_CALL_IN_CONTEXT(hr) return hr;\
});
#define END_CALL_IN_CONTEXT_BASE return S_OK;\
});
#endif
#define GET_CURRENT_CONTEXT _ContextCallback::_CaptureCurrent()
#define SAVE_CURRENT_CONTEXT(var) _ContextCallback var = GET_CURRENT_CONTEXT
#define COMMA ,
#ifdef __cplusplus_winrt
#define _Object Platform::Object^
#define _ObjectObj Platform::Object^
#define _String Platform::String^
#define _StringObj Platform::String^
#define _StringReference ref new Platform::String
#define _StringReferenceObj Platform::String^
#define _DeviceInformationCollection Windows::Devices::Enumeration::DeviceInformationCollection
#define _MediaCapture Windows::Media::Capture::MediaCapture
#define _MediaCaptureVideoPreview Windows::Media::Capture::MediaCapture
#define _MediaCaptureInitializationSettings Windows::Media::Capture::MediaCaptureInitializationSettings
#define _VideoDeviceController Windows::Media::Devices::VideoDeviceController
#define _MediaDeviceController Windows::Media::Devices::VideoDeviceController
#define _MediaEncodingProperties Windows::Media::MediaProperties::IMediaEncodingProperties
#define _VideoEncodingProperties Windows::Media::MediaProperties::VideoEncodingProperties
#define _MediaStreamType Windows::Media::Capture::MediaStreamType
#define _AsyncInfo Windows::Foundation::IAsyncInfo
#define _AsyncAction Windows::Foundation::IAsyncAction
#define _AsyncOperation Windows::Foundation::IAsyncOperation
#define _DeviceClass Windows::Devices::Enumeration::DeviceClass
#define _IDeviceInformation Windows::Devices::Enumeration::DeviceInformation
#define _DeviceInformation Windows::Devices::Enumeration::DeviceInformation
#define _DeviceInformationStatics Windows::Devices::Enumeration::DeviceInformation
#define _MediaEncodingProfile Windows::Media::MediaProperties::MediaEncodingProfile
#define _StreamingCaptureMode Windows::Media::Capture::StreamingCaptureMode
#define _PropertySet Windows::Foundation::Collections::PropertySet
#define _Map Windows::Foundation::Collections::PropertySet
#define _PropertyValueStatics Windows::Foundation::PropertyValue
#define _VectorView Windows::Foundation::Collections::IVectorView
#define _StartPreviewToCustomSinkIdAsync StartPreviewToCustomSinkAsync
#define _InitializeWithSettingsAsync InitializeAsync
#define _FindAllAsyncDeviceClass FindAllAsync
#define _MediaExtension Windows::Media::IMediaExtension
#define BEGIN_CREATE_ASYNC(type, ...) (Concurrency::create_async([__VA_ARGS__]() {
#define END_CREATE_ASYNC(hr) if (FAILED(hr)) throw Platform::Exception::CreateException(hr);\
}))
#define DEFINE_TASK Concurrency::task
#define CREATE_TASK Concurrency::create_task
#define CREATE_OR_CONTINUE_TASK(_task, rettype, func) _task = (_task == Concurrency::task<rettype>()) ? Concurrency::create_task(func) : _task.then([func](rettype) -> rettype { return func(); });
#define DEFINE_RET_VAL(x)
#define DEFINE_RET_TYPE(x)
#define DEFINE_RET_FORMAL(x) x
#define RET_VAL(x) return x;
#define RET_VAL_BASE
#define MAKE_STRING(str) str
#define GET_STL_STRING(str) std::wstring(str->Data())
#define GET_STL_STRING_RAW(str) std::wstring(str->Data())
#define MAKE_WRL_OBJ(x) x^
#define MAKE_WRL_REF(x) x^
#define MAKE_OBJ_REF(x) x^
#define MAKE_WRL_AGILE_REF(x) Platform::Agile<x^>
#define MAKE_PROPERTY_BACKING(Type, PropName) property Type PropName;
#define MAKE_PROPERTY(Type, PropName, PropValue)
#define MAKE_PROPERTY_STRING(Type, PropName, PropValue)
#define MAKE_READONLY_PROPERTY(Type, PropName, PropValue) property Type PropName\
{\
Type get() { return PropValue; }\
}
#define THROW_INVALID_ARG throw ref new Platform::InvalidArgumentException();
#define RELEASE_AGILE_WRL(x) x = nullptr;
#define RELEASE_WRL(x) x = nullptr;
#define GET_WRL_OBJ_FROM_REF(objtype, obj, orig, hr) objtype^ obj = orig;\
hr = S_OK;
#define GET_WRL_OBJ_FROM_OBJ(objtype, obj, orig, hr) objtype^ obj = safe_cast<objtype^>(orig);\
hr = S_OK;
#define WRL_ENUM_GET(obj, prefix, prop) obj::##prop
#define WRL_PROP_GET(obj, prop, arg, hr) arg = obj->##prop;\
hr = S_OK;
#define WRL_PROP_PUT(obj, prop, arg, hr) obj->##prop = arg;\
hr = S_OK;
#define WRL_METHOD_BASE(obj, method, ret, hr) ret = obj->##method();\
hr = S_OK;
#define WRL_METHOD(obj, method, ret, hr, ...) ret = obj->##method(__VA_ARGS__);\
hr = S_OK;
#define WRL_METHOD_NORET_BASE(obj, method, hr) obj->##method();\
hr = S_OK;
#define WRL_METHOD_NORET(obj, method, hr, ...) obj->##method(__VA_ARGS__);\
hr = S_OK;
#define REF_WRL_OBJ(obj) &obj
#define DEREF_WRL_OBJ(obj) obj
#define DEREF_AGILE_WRL_OBJ(obj) obj.Get()
#define DEREF_AS_NATIVE_WRL_OBJ(type, obj) reinterpret_cast<type*>(obj)
#define PREPARE_TRANSFER_WRL_OBJ(obj) obj
#define ACTIVATE_LOCAL_OBJ_BASE(objtype) ref new objtype()
#define ACTIVATE_LOCAL_OBJ(objtype, ...) ref new objtype(__VA_ARGS__)
#define ACTIVATE_EVENT_HANDLER(objtype, ...) ref new objtype(__VA_ARGS__)
#define ACTIVATE_OBJ(rtclass, objtype, obj, hr) MAKE_WRL_OBJ(objtype) obj = ref new objtype();\
hr = S_OK;
#define ACTIVATE_STATIC_OBJ(rtclass, objtype, obj, hr) objtype obj;\
hr = S_OK;
#else
#define _Object IInspectable*
#define _ObjectObj Microsoft::WRL::ComPtr<IInspectable>
#define _String HSTRING
#define _StringObj Microsoft::WRL::Wrappers::HString
#define _StringReference Microsoft::WRL::Wrappers::HStringReference
#define _StringReferenceObj Microsoft::WRL::Wrappers::HStringReference
#define _DeviceInformationCollection ABI::Windows::Devices::Enumeration::DeviceInformationCollection
#define _MediaCapture ABI::Windows::Media::Capture::IMediaCapture
#define _MediaCaptureVideoPreview ABI::Windows::Media::Capture::IMediaCaptureVideoPreview
#define _MediaCaptureInitializationSettings ABI::Windows::Media::Capture::IMediaCaptureInitializationSettings
#define _VideoDeviceController ABI::Windows::Media::Devices::IVideoDeviceController
#define _MediaDeviceController ABI::Windows::Media::Devices::IMediaDeviceController
#define _MediaEncodingProperties ABI::Windows::Media::MediaProperties::IMediaEncodingProperties
#define _VideoEncodingProperties ABI::Windows::Media::MediaProperties::IVideoEncodingProperties
#define _MediaStreamType ABI::Windows::Media::Capture::MediaStreamType
#define _AsyncInfo ABI::Windows::Foundation::IAsyncInfo
#define _AsyncAction ABI::Windows::Foundation::IAsyncAction
#define _AsyncOperation ABI::Windows::Foundation::IAsyncOperation
#define _DeviceClass ABI::Windows::Devices::Enumeration::DeviceClass
#define _IDeviceInformation ABI::Windows::Devices::Enumeration::IDeviceInformation
#define _DeviceInformation ABI::Windows::Devices::Enumeration::DeviceInformation
#define _DeviceInformationStatics ABI::Windows::Devices::Enumeration::IDeviceInformationStatics
#define _MediaEncodingProfile ABI::Windows::Media::MediaProperties::IMediaEncodingProfile
#define _StreamingCaptureMode ABI::Windows::Media::Capture::StreamingCaptureMode
#define _PropertySet ABI::Windows::Foundation::Collections::IPropertySet
#define _Map ABI::Windows::Foundation::Collections::IMap<HSTRING, IInspectable *>
#define _PropertyValueStatics ABI::Windows::Foundation::IPropertyValueStatics
#define _VectorView ABI::Windows::Foundation::Collections::IVectorView
#define _StartPreviewToCustomSinkIdAsync StartPreviewToCustomSinkIdAsync
#define _InitializeWithSettingsAsync InitializeWithSettingsAsync
#define _FindAllAsyncDeviceClass FindAllAsyncDeviceClass
#define _MediaExtension ABI::Windows::Media::IMediaExtension
#define BEGIN_CREATE_ASYNC(type, ...) Concurrency_winrt::create_async<type>([__VA_ARGS__]() -> HRESULT {
#define END_CREATE_ASYNC(hr) return hr;\
})
#define DEFINE_TASK Concurrency_winrt::task
#define CREATE_TASK Concurrency_winrt::create_task
#define CREATE_OR_CONTINUE_TASK(_task, rettype, func) _task = (_task == Concurrency_winrt::task<rettype>()) ? Concurrency_winrt::create_task<rettype>(func) : _task.then([func](rettype, rettype* retVal) -> HRESULT { return func(retVal); });
#define DEFINE_RET_VAL(x) x* retVal
#define DEFINE_RET_TYPE(x) <x>
#define DEFINE_RET_FORMAL(x) HRESULT
#define RET_VAL(x) *retVal = x;\
return S_OK;
#define RET_VAL_BASE return S_OK;
#define MAKE_STRING(str) Microsoft::WRL::Wrappers::HStringReference(L##str)
#define GET_STL_STRING(str) std::wstring(str.GetRawBuffer(NULL))
#define GET_STL_STRING_RAW(str) WindowsGetStringRawBuffer(str, NULL)
#define MAKE_WRL_OBJ(x) Microsoft::WRL::ComPtr<x>
#define MAKE_WRL_REF(x) x*
#define MAKE_OBJ_REF(x) x
#define MAKE_WRL_AGILE_REF(x) x*
#define MAKE_PROPERTY_BACKING(Type, PropName) Type PropName;
#define MAKE_PROPERTY(Type, PropName, PropValue) STDMETHODIMP get_##PropName(Type* pVal) { if (pVal) { *pVal = PropValue; } else { return E_INVALIDARG; } return S_OK; }\
STDMETHODIMP put_##PropName(Type Val) { PropValue = Val; return S_OK; }
#define MAKE_PROPERTY_STRING(Type, PropName, PropValue) STDMETHODIMP get_##PropName(Type* pVal) { if (pVal) { return ::WindowsDuplicateString(PropValue.Get(), pVal); } else { return E_INVALIDARG; } }\
STDMETHODIMP put_##PropName(Type Val) { return PropValue.Set(Val); }
#define MAKE_READONLY_PROPERTY(Type, PropName, PropValue) STDMETHODIMP get_##PropName(Type* pVal) { if (pVal) { *pVal = PropValue; } else { return E_INVALIDARG; } return S_OK; }
#define THROW_INVALID_ARG RoOriginateError(E_INVALIDARG, nullptr);
#define RELEASE_AGILE_WRL(x) if (x) { (x)->Release(); x = nullptr; }
#define RELEASE_WRL(x) if (x) { (x)->Release(); x = nullptr; }
#define GET_WRL_OBJ_FROM_REF(objtype, obj, orig, hr) Microsoft::WRL::ComPtr<objtype> obj;\
hr = orig->QueryInterface(__uuidof(objtype), &obj);
#define GET_WRL_OBJ_FROM_OBJ(objtype, obj, orig, hr) Microsoft::WRL::ComPtr<objtype> obj;\
hr = orig.As(&obj);
#define WRL_ENUM_GET(obj, prefix, prop) obj::prefix##_##prop
#define WRL_PROP_GET(obj, prop, arg, hr) hr = obj->get_##prop(&arg);
#define WRL_PROP_PUT(obj, prop, arg, hr) hr = obj->put_##prop(arg);
#define WRL_METHOD_BASE(obj, method, ret, hr) hr = obj->##method(&ret);
#define WRL_METHOD(obj, method, ret, hr, ...) hr = obj->##method(__VA_ARGS__, &ret);
#define WRL_METHOD_NORET_BASE(obj, method, hr) hr = obj->##method();
#define REF_WRL_OBJ(obj) obj.GetAddressOf()
#define DEREF_WRL_OBJ(obj) obj.Get()
#define DEREF_AGILE_WRL_OBJ(obj) obj
#define DEREF_AS_NATIVE_WRL_OBJ(type, obj) obj.Get()
#define PREPARE_TRANSFER_WRL_OBJ(obj) obj.Detach()
#define ACTIVATE_LOCAL_OBJ_BASE(objtype) Microsoft::WRL::Make<objtype>()
#define ACTIVATE_LOCAL_OBJ(objtype, ...) Microsoft::WRL::Make<objtype>(__VA_ARGS__)
#define ACTIVATE_EVENT_HANDLER(objtype, ...) Microsoft::WRL::Callback<objtype>(__VA_ARGS__).Get()
#define ACTIVATE_OBJ(rtclass, objtype, obj, hr) MAKE_WRL_OBJ(objtype) obj;\
{\
Microsoft::WRL::ComPtr<IActivationFactory> objFactory;\
hr = Windows::Foundation::GetActivationFactory(Microsoft::WRL::Wrappers::HStringReference(rtclass).Get(), objFactory.ReleaseAndGetAddressOf());\
if (SUCCEEDED(hr)) {\
Microsoft::WRL::ComPtr<IInspectable> pInsp;\
hr = objFactory->ActivateInstance(pInsp.GetAddressOf());\
if (SUCCEEDED(hr)) hr = pInsp.As(&obj);\
}\
}
#define ACTIVATE_STATIC_OBJ(rtclass, objtype, obj, hr) objtype obj;\
{\
Microsoft::WRL::ComPtr<IActivationFactory> objFactory;\
hr = Windows::Foundation::GetActivationFactory(Microsoft::WRL::Wrappers::HStringReference(rtclass).Get(), objFactory.ReleaseAndGetAddressOf());\
if (SUCCEEDED(hr)) {\
if (SUCCEEDED(hr)) hr = objFactory.As(&obj);\
}\
}
#endif
#define _ComPtr Microsoft::WRL::ComPtr
#else
#define _COM_SMARTPTR_DECLARE(T,var) T ## Ptr var
...
...
@@ -509,7 +289,6 @@ private:
};
#define _ComPtr ComPtr
#endif
template
<
class
TBase
=
IMFAttributes
>
class
CBaseAttributes
:
public
TBase
...
...
@@ -860,19 +639,10 @@ protected:
};
class
StreamSink
:
#ifdef WINRT
public
Microsoft
::
WRL
::
RuntimeClass
<
Microsoft
::
WRL
::
RuntimeClassFlags
<
Microsoft
::
WRL
::
RuntimeClassType
::
ClassicCom
>
,
IMFStreamSink
,
IMFMediaEventGenerator
,
IMFMediaTypeHandler
,
CBaseAttributes
<>
>
#else
public
IMFStreamSink
,
public
IMFMediaTypeHandler
,
public
CBaseAttributes
<>
,
public
ICustomStreamSink
#endif
{
public
:
// IUnknown methods
...
...
@@ -890,9 +660,6 @@ public:
if
(
riid
==
IID_IMarshal
)
{
return
MarshalQI
(
riid
,
ppv
);
}
else
{
#ifdef WINRT
hr
=
RuntimeClassT
::
QueryInterface
(
riid
,
ppv
);
#else
if
(
riid
==
IID_IUnknown
||
riid
==
IID_IMFStreamSink
)
{
*
ppv
=
static_cast
<
IMFStreamSink
*>
(
this
);
AddRef
();
...
...
@@ -910,15 +677,11 @@ public:
AddRef
();
}
else
hr
=
E_NOINTERFACE
;
#endif
}
return
hr
;
}
#ifdef WINRT
STDMETHOD
(
RuntimeClassInitialize
)()
{
return
S_OK
;
}
#else
ULONG
STDMETHODCALLTYPE
AddRef
()
{
return
InterlockedIncrement
(
&
m_cRef
);
...
...
@@ -932,7 +695,6 @@ public:
}
return
cRef
;
}
#endif
HRESULT
MarshalQI
(
REFIID
riid
,
LPVOID
*
ppv
)
{
HRESULT
hr
=
S_OK
;
...
...
@@ -967,11 +729,7 @@ public:
m_StartTime
(
0
),
m_fGetStartTimeFromSample
(
false
),
m_fWaitingForFirstSample
(
false
),
m_state
(
State_TypeNotSet
),
m_pParent
(
nullptr
),
m_imageWidthInPixels
(
0
),
m_imageHeightInPixels
(
0
)
{
#ifdef WINRT
m_token
.
value
=
0
;
#else
m_bConnected
=
false
;
#endif
InitializeCriticalSectionEx
(
&
m_critSec
,
3000
,
0
);
ZeroMemory
(
&
m_guiCurrentSubtype
,
sizeof
(
m_guiCurrentSubtype
));
CBaseAttributes
::
Initialize
(
0U
);
...
...
@@ -1646,17 +1404,11 @@ public:
return
hr
;
}
private
:
#ifdef WINRT
EventRegistrationToken
m_token
;
#else
bool
m_bConnected
;
#endif
bool
m_IsShutdown
;
// Flag to indicate if Shutdown() method was called.
CRITICAL_SECTION
m_critSec
;
#ifndef WINRT
long
m_cRef
;
#endif
IMFAttributes
*
m_pParent
;
_ComPtr
<
IMFMediaType
>
m_spCurrentType
;
_ComPtr
<
IMFMediaEventQueue
>
m_spEventQueue
;
// Event queue
...
...
@@ -2174,37 +1926,11 @@ protected:
}
};
/* Be sure to declare webcam device capability in manifest
For better media capture support, add the following snippet with correct module name to the project manifest
(videoio needs DLL activation class factoryentry points):
<Extensions>
<Extension Category="windows.activatableClass.inProcessServer">
<InProcessServer>
<Path>modulename</Path>
<ActivatableClass ActivatableClassId="cv.MediaSink" ThreadingModel="both" />
</InProcessServer>
</Extension>
</Extensions>*/
extern
const
__declspec
(
selectany
)
WCHAR
RuntimeClass_CV_MediaSink
[]
=
L"cv.MediaSink"
;
class
MediaSink
:
#ifdef WINRT
public
Microsoft
::
WRL
::
RuntimeClass
<
Microsoft
::
WRL
::
RuntimeClassFlags
<
Microsoft
::
WRL
::
RuntimeClassType
::
WinRtClassicComMix
>
,
Microsoft
::
WRL
::
Implements
<
ABI
::
Windows
::
Media
::
IMediaExtension
>
,
IMFMediaSink
,
IMFClockStateSink
,
Microsoft
::
WRL
::
FtmBase
,
CBaseAttributes
<>>
#else
public
IMFMediaSink
,
public
IMFClockStateSink
,
public
CBaseAttributes
<>
#endif
{
#ifdef WINRT
InspectableClass
(
RuntimeClass_CV_MediaSink
,
BaseTrust
)
public
:
#else
public
:
ULONG
STDMETHODCALLTYPE
AddRef
()
{
...
...
@@ -2246,7 +1972,6 @@ public:
return
hr
;
}
#endif
MediaSink
()
:
m_IsShutdown
(
false
),
m_llStartTime
(
0
)
{
CBaseAttributes
<>::
Initialize
(
0U
);
InitializeCriticalSectionEx
(
&
m_critSec
,
3000
,
0
);
...
...
@@ -2269,308 +1994,6 @@ public:
return
S_OK
;
}
}
#ifdef WINRT
STDMETHODIMP
SetProperties
(
ABI
::
Windows
::
Foundation
::
Collections
::
IPropertySet
*
pConfiguration
)
{
HRESULT
hr
=
S_OK
;
if
(
pConfiguration
)
{
Microsoft
::
WRL
::
ComPtr
<
IInspectable
>
spInsp
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
Collections
::
IMap
<
HSTRING
,
IInspectable
*>>
spSetting
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
IPropertyValue
>
spPropVal
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Media
::
MediaProperties
::
IMediaEncodingProperties
>
pMedEncProps
;
UINT32
uiType
=
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType_VideoPreview
;
hr
=
pConfiguration
->
QueryInterface
(
IID_PPV_ARGS
(
&
spSetting
));
if
(
FAILED
(
hr
))
{
hr
=
E_FAIL
;
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spSetting
->
Lookup
(
Microsoft
::
WRL
::
Wrappers
::
HStringReference
(
MF_PROP_SAMPLEGRABBERCALLBACK
).
Get
(),
spInsp
.
ReleaseAndGetAddressOf
());
if
(
FAILED
(
hr
))
{
hr
=
E_INVALIDARG
;
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
SetUnknown
(
MF_MEDIASINK_SAMPLEGRABBERCALLBACK
,
spInsp
.
Get
());
}
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spSetting
->
Lookup
(
Microsoft
::
WRL
::
Wrappers
::
HStringReference
(
MF_PROP_VIDTYPE
).
Get
(),
spInsp
.
ReleaseAndGetAddressOf
());
if
(
FAILED
(
hr
))
{
hr
=
E_INVALIDARG
;
}
if
(
SUCCEEDED
(
hr
))
{
if
(
SUCCEEDED
(
hr
=
spInsp
.
As
(
&
spPropVal
)))
{
hr
=
spPropVal
->
GetUInt32
(
&
uiType
);
}
}
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spSetting
->
Lookup
(
Microsoft
::
WRL
::
Wrappers
::
HStringReference
(
MF_PROP_VIDENCPROPS
).
Get
(),
spInsp
.
ReleaseAndGetAddressOf
());
if
(
FAILED
(
hr
))
{
hr
=
E_INVALIDARG
;
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spInsp
.
As
(
&
pMedEncProps
);
}
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
SetMediaStreamProperties
((
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType
)
uiType
,
pMedEncProps
.
Get
());
}
}
return
hr
;
}
static
DWORD
GetStreamId
(
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType
mediaStreamType
)
{
return
3
-
mediaStreamType
;
}
static
HRESULT
AddAttribute
(
_In_
GUID
guidKey
,
_In_
ABI
::
Windows
::
Foundation
::
IPropertyValue
*
pValue
,
_In_
IMFAttributes
*
pAttr
)
{
HRESULT
hr
=
S_OK
;
PROPVARIANT
var
;
ABI
::
Windows
::
Foundation
::
PropertyType
type
;
hr
=
pValue
->
get_Type
(
&
type
);
ZeroMemory
(
&
var
,
sizeof
(
var
));
if
(
SUCCEEDED
(
hr
))
{
switch
(
type
)
{
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_UInt8Array
:
{
UINT32
cbBlob
;
BYTE
*
pbBlog
=
nullptr
;
hr
=
pValue
->
GetUInt8Array
(
&
cbBlob
,
&
pbBlog
);
if
(
SUCCEEDED
(
hr
))
{
if
(
pbBlog
==
nullptr
)
{
hr
=
E_INVALIDARG
;
}
else
{
hr
=
pAttr
->
SetBlob
(
guidKey
,
pbBlog
,
cbBlob
);
}
}
CoTaskMemFree
(
pbBlog
);
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_Double
:
{
DOUBLE
value
;
hr
=
pValue
->
GetDouble
(
&
value
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
pAttr
->
SetDouble
(
guidKey
,
value
);
}
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_Guid
:
{
GUID
value
;
hr
=
pValue
->
GetGuid
(
&
value
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
pAttr
->
SetGUID
(
guidKey
,
value
);
}
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_String
:
{
Microsoft
::
WRL
::
Wrappers
::
HString
value
;
hr
=
pValue
->
GetString
(
value
.
GetAddressOf
());
if
(
SUCCEEDED
(
hr
))
{
UINT32
len
=
0
;
LPCWSTR
szValue
=
WindowsGetStringRawBuffer
(
value
.
Get
(),
&
len
);
hr
=
pAttr
->
SetString
(
guidKey
,
szValue
);
}
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_UInt32
:
{
UINT32
value
;
hr
=
pValue
->
GetUInt32
(
&
value
);
if
(
SUCCEEDED
(
hr
))
{
pAttr
->
SetUINT32
(
guidKey
,
value
);
}
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_UInt64
:
{
UINT64
value
;
hr
=
pValue
->
GetUInt64
(
&
value
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
pAttr
->
SetUINT64
(
guidKey
,
value
);
}
}
break
;
case
ABI
:
:
Windows
::
Foundation
::
PropertyType_Inspectable
:
{
Microsoft
::
WRL
::
ComPtr
<
IInspectable
>
value
;
hr
=
TYPE_E_TYPEMISMATCH
;
if
(
SUCCEEDED
(
hr
))
{
pAttr
->
SetUnknown
(
guidKey
,
value
.
Get
());
}
}
break
;
// ignore unknown values
}
}
return
hr
;
}
static
HRESULT
ConvertPropertiesToMediaType
(
_In_
ABI
::
Windows
::
Media
::
MediaProperties
::
IMediaEncodingProperties
*
pMEP
,
_Outptr_
IMFMediaType
**
ppMT
)
{
HRESULT
hr
=
S_OK
;
_ComPtr
<
IMFMediaType
>
spMT
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
Collections
::
IMap
<
GUID
,
IInspectable
*>>
spMap
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
Collections
::
IIterable
<
ABI
::
Windows
::
Foundation
::
Collections
::
IKeyValuePair
<
GUID
,
IInspectable
*>*>>
spIterable
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
Collections
::
IIterator
<
ABI
::
Windows
::
Foundation
::
Collections
::
IKeyValuePair
<
GUID
,
IInspectable
*>*>>
spIterator
;
if
(
pMEP
==
nullptr
||
ppMT
==
nullptr
)
{
return
E_INVALIDARG
;
}
*
ppMT
=
nullptr
;
hr
=
pMEP
->
get_Properties
(
spMap
.
GetAddressOf
());
if
(
SUCCEEDED
(
hr
))
{
hr
=
spMap
.
As
(
&
spIterable
);
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spIterable
->
First
(
&
spIterator
);
}
if
(
SUCCEEDED
(
hr
))
{
MFCreateMediaType
(
spMT
.
ReleaseAndGetAddressOf
());
}
boolean
hasCurrent
=
false
;
if
(
SUCCEEDED
(
hr
))
{
hr
=
spIterator
->
get_HasCurrent
(
&
hasCurrent
);
}
while
(
hasCurrent
)
{
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
Collections
::
IKeyValuePair
<
GUID
,
IInspectable
*>
>
spKeyValuePair
;
Microsoft
::
WRL
::
ComPtr
<
IInspectable
>
spValue
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
IPropertyValue
>
spPropValue
;
GUID
guidKey
;
hr
=
spIterator
->
get_Current
(
&
spKeyValuePair
);
if
(
FAILED
(
hr
))
{
break
;
}
hr
=
spKeyValuePair
->
get_Key
(
&
guidKey
);
if
(
FAILED
(
hr
))
{
break
;
}
hr
=
spKeyValuePair
->
get_Value
(
&
spValue
);
if
(
FAILED
(
hr
))
{
break
;
}
hr
=
spValue
.
As
(
&
spPropValue
);
if
(
FAILED
(
hr
))
{
break
;
}
hr
=
AddAttribute
(
guidKey
,
spPropValue
.
Get
(),
spMT
.
Get
());
if
(
FAILED
(
hr
))
{
break
;
}
hr
=
spIterator
->
MoveNext
(
&
hasCurrent
);
if
(
FAILED
(
hr
))
{
break
;
}
}
if
(
SUCCEEDED
(
hr
))
{
Microsoft
::
WRL
::
ComPtr
<
IInspectable
>
spValue
;
Microsoft
::
WRL
::
ComPtr
<
ABI
::
Windows
::
Foundation
::
IPropertyValue
>
spPropValue
;
GUID
guiMajorType
;
hr
=
spMap
->
Lookup
(
MF_MT_MAJOR_TYPE
,
spValue
.
GetAddressOf
());
if
(
SUCCEEDED
(
hr
))
{
hr
=
spValue
.
As
(
&
spPropValue
);
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
spPropValue
->
GetGuid
(
&
guiMajorType
);
}
if
(
SUCCEEDED
(
hr
))
{
if
(
guiMajorType
!=
MFMediaType_Video
&&
guiMajorType
!=
MFMediaType_Audio
)
{
hr
=
E_UNEXPECTED
;
}
}
}
if
(
SUCCEEDED
(
hr
))
{
*
ppMT
=
spMT
.
Detach
();
}
return
hr
;
}
//this should be passed through SetProperties!
HRESULT
SetMediaStreamProperties
(
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType
MediaStreamType
,
_In_opt_
ABI
::
Windows
::
Media
::
MediaProperties
::
IMediaEncodingProperties
*
mediaEncodingProperties
)
{
HRESULT
hr
=
S_OK
;
_ComPtr
<
IMFMediaType
>
spMediaType
;
if
(
MediaStreamType
!=
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType_VideoPreview
&&
MediaStreamType
!=
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType_VideoRecord
&&
MediaStreamType
!=
ABI
::
Windows
::
Media
::
Capture
::
MediaStreamType_Audio
)
{
return
E_INVALIDARG
;
}
RemoveStreamSink
(
GetStreamId
(
MediaStreamType
));
if
(
mediaEncodingProperties
!=
nullptr
)
{
_ComPtr
<
IMFStreamSink
>
spStreamSink
;
hr
=
ConvertPropertiesToMediaType
(
mediaEncodingProperties
,
&
spMediaType
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
AddStreamSink
(
GetStreamId
(
MediaStreamType
),
nullptr
,
spStreamSink
.
GetAddressOf
());
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
SetUnknown
(
MF_MEDIASINK_PREFERREDTYPE
,
spMediaType
.
Detach
());
}
}
return
hr
;
}
#endif
//IMFMediaSink
HRESULT
STDMETHODCALLTYPE
GetCharacteristics
(
/* [out] */
__RPC__out
DWORD
*
pdwCharacteristics
)
{
...
...
@@ -2609,14 +2032,6 @@ public:
if
(
SUCCEEDED
(
hr
))
{
#ifdef WINRT
pStream
=
Microsoft
::
WRL
::
Make
<
StreamSink
>
();
if
(
pStream
==
nullptr
)
{
hr
=
E_OUTOFMEMORY
;
}
if
(
SUCCEEDED
(
hr
))
hr
=
pStream
.
As
<
IMFStreamSink
>
(
&
spMFStream
);
#else
StreamSink
*
pSink
=
new
StreamSink
();
if
(
pSink
)
{
hr
=
pSink
->
QueryInterface
(
IID_IMFStreamSink
,
(
void
**
)
spMFStream
.
GetAddressOf
());
...
...
@@ -2625,7 +2040,6 @@ public:
}
if
(
FAILED
(
hr
))
delete
pSink
;
}
#endif
}
// Initialize the stream.
...
...
@@ -2721,12 +2135,7 @@ public:
{
hr
=
m_streams
.
Remove
(
pos
,
nullptr
);
_ComPtr
<
ICustomStreamSink
>
spCustomSink
;
#ifdef WINRT
spCustomSink
=
static_cast
<
StreamSink
*>
(
spStream
.
Get
());
hr
=
S_OK
;
#else
hr
=
spStream
.
As
(
&
spCustomSink
);
#endif
if
(
SUCCEEDED
(
hr
))
hr
=
spCustomSink
->
Shutdown
();
}
...
...
@@ -2945,12 +2354,8 @@ public:
{
_ComPtr
<
ICustomStreamSink
>
spCustomSink
;
HRESULT
hr
;
#ifdef WINRT
spCustomSink
=
static_cast
<
StreamSink
*>
(
pStream
);
#else
hr
=
pStream
->
QueryInterface
(
IID_PPV_ARGS
(
spCustomSink
.
GetAddressOf
()));
if
(
FAILED
(
hr
))
return
hr
;
#endif
hr
=
spCustomSink
->
Shutdown
();
return
hr
;
}
...
...
@@ -2968,12 +2373,8 @@ public:
{
_ComPtr
<
ICustomStreamSink
>
spCustomSink
;
HRESULT
hr
;
#ifdef WINRT
spCustomSink
=
static_cast
<
StreamSink
*>
(
pStream
);
#else
hr
=
pStream
->
QueryInterface
(
IID_PPV_ARGS
(
spCustomSink
.
GetAddressOf
()));
if
(
FAILED
(
hr
))
return
hr
;
#endif
hr
=
spCustomSink
->
Start
(
_llStartTime
);
return
hr
;
}
...
...
@@ -2988,12 +2389,8 @@ public:
{
_ComPtr
<
ICustomStreamSink
>
spCustomSink
;
HRESULT
hr
;
#ifdef WINRT
spCustomSink
=
static_cast
<
StreamSink
*>
(
pStream
);
#else
hr
=
pStream
->
QueryInterface
(
IID_PPV_ARGS
(
spCustomSink
.
GetAddressOf
()));
if
(
FAILED
(
hr
))
return
hr
;
#endif
hr
=
spCustomSink
->
Stop
();
return
hr
;
}
...
...
@@ -3098,16 +2495,10 @@ public:
return
hr
;
}
private
:
#ifndef WINRT
long
m_cRef
;
#endif
CRITICAL_SECTION
m_critSec
;
bool
m_IsShutdown
;
ComPtrList
<
IMFStreamSink
>
m_streams
;
_ComPtr
<
IMFPresentationClock
>
m_spClock
;
LONGLONG
m_llStartTime
;
};
#ifdef WINRT
ActivatableClass
(
MediaSink
);
#endif
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