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
0c9d7760
Commit
0c9d7760
authored
May 15, 2013
by
Alexander Smorkalov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Media Foundation-based code refactoring.
I* + SafeRelease -> ComPtr.
parent
e94cc0b5
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
86 additions
and
105 deletions
+86
-105
cap_msmf.cpp
modules/highgui/src/cap_msmf.cpp
+86
-105
No files found.
modules/highgui/src/cap_msmf.cpp
View file @
0c9d7760
...
...
@@ -53,7 +53,7 @@
#include <Mfapi.h>
#include <mfplay.h>
#include <mfobjects.h>
#include
"Strsafe.h"
#include
<strsafe.h>
#include <wrl/client.h>
#include <Mfreadwrite.h>
#include <new>
...
...
@@ -72,6 +72,8 @@
#pragma comment(lib, "Mfreadwrite")
#pragma comment(lib, "MinCore_Downlevel")
using
namespace
Microsoft
::
WRL
;
struct
IMFMediaType
;
struct
IMFActivate
;
struct
IMFMediaSource
;
...
...
@@ -894,12 +896,12 @@ ImageGrabber::~ImageGrabber(void)
HRESULT
ImageGrabber
::
initImageGrabber
(
IMFMediaSource
*
pSource
,
GUID
VideoFormat
)
{
IMFActivate
*
pSinkActivate
=
NULL
;
IMFMediaType
*
pType
=
NULL
;
IMFPresentationDescriptor
*
pPD
=
NULL
;
IMFStreamDescriptor
*
pSD
=
NULL
;
IMFMediaTypeHandler
*
pHandler
=
NULL
;
IMFMediaType
*
pCurrentType
=
NULL
;
ComPtr
<
IMFActivate
>
pSinkActivate
=
NULL
;
ComPtr
<
IMFMediaType
>
pType
=
NULL
;
ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
ComPtr
<
IMFStreamDescriptor
>
pSD
=
NULL
;
ComPtr
<
IMFMediaTypeHandler
>
pHandler
=
NULL
;
ComPtr
<
IMFMediaType
>
pCurrentType
=
NULL
;
HRESULT
hr
=
S_OK
;
MediaType
MT
;
// Clean up.
...
...
@@ -940,13 +942,9 @@ HRESULT ImageGrabber::initImageGrabber(IMFMediaSource *pSource, GUID VideoFormat
printf
(
"Error GetCurrentMediaType()
\n
"
);
goto
err
;
}
MT
=
FormatReader
::
Read
(
pCurrentType
);
MT
=
FormatReader
::
Read
(
pCurrentType
.
Get
()
);
}
err
:
SafeRelease
(
&
pPD
);
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
SafeRelease
(
&
pCurrentType
);
unsigned
int
sizeRawImage
=
0
;
if
(
VideoFormat
==
MFVideoFormat_RGB24
)
{
...
...
@@ -966,17 +964,17 @@ err:
// Configure the media type that the Sample Grabber will receive.
// Setting the major and subtype is usually enough for the topology loader
// to resolve the topology.
CHECK_HR
(
hr
=
MFCreateMediaType
(
&
pType
));
CHECK_HR
(
hr
=
MFCreateMediaType
(
pType
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pType
->
SetGUID
(
MF_MT_MAJOR_TYPE
,
MFMediaType_Video
));
CHECK_HR
(
hr
=
pType
->
SetGUID
(
MF_MT_SUBTYPE
,
VideoFormat
));
// Create the sample grabber sink.
CHECK_HR
(
hr
=
MFCreateSampleGrabberSinkActivate
(
pType
,
this
,
&
pSinkActivate
));
CHECK_HR
(
hr
=
MFCreateSampleGrabberSinkActivate
(
pType
.
Get
(),
this
,
pSinkActivate
.
GetAddressOf
()
));
// To run as fast as possible, set this attribute (requires Windows 7):
CHECK_HR
(
hr
=
pSinkActivate
->
SetUINT32
(
MF_SAMPLEGRABBERSINK_IGNORE_CLOCK
,
TRUE
));
// Create the Media Session.
CHECK_HR
(
hr
=
MFCreateMediaSession
(
NULL
,
&
ig_pSession
));
// Create the topology.
CHECK_HR
(
hr
=
CreateTopology
(
pSource
,
pSinkActivate
,
&
ig_pTopology
));
CHECK_HR
(
hr
=
CreateTopology
(
pSource
,
pSinkActivate
.
Get
()
,
&
ig_pTopology
));
done
:
// Clean up.
if
(
FAILED
(
hr
))
...
...
@@ -988,8 +986,7 @@ done:
SafeRelease
(
&
ig_pSession
);
SafeRelease
(
&
ig_pTopology
);
}
SafeRelease
(
&
pSinkActivate
);
SafeRelease
(
&
pType
);
return
hr
;
}
...
...
@@ -1004,7 +1001,7 @@ void ImageGrabber::stopGrabbing()
HRESULT
ImageGrabber
::
startGrabbing
(
void
)
{
DebugPrintOut
*
DPO
=
&
DebugPrintOut
::
getInstance
();
IMFMediaEvent
*
pEvent
=
NULL
;
ComPtr
<
IMFMediaEvent
>
pEvent
=
NULL
;
PROPVARIANT
var
;
PropVariantInit
(
&
var
);
HRESULT
hr
=
S_OK
;
...
...
@@ -1058,7 +1055,6 @@ HRESULT ImageGrabber::startGrabbing(void)
DPO
->
printOut
(
L"IMAGEGRABBER VIDEODEVICE %i: MEVideoCaptureDeviceRemoved
\n
"
,
ig_DeviceID
);
break
;
}
SafeRelease
(
&
pEvent
);
}
if
(
ig_Synchronous
)
...
...
@@ -1069,7 +1065,6 @@ HRESULT ImageGrabber::startGrabbing(void)
DPO
->
printOut
(
L"IMAGEGRABBER VIDEODEVICE %i: Finish startGrabbing
\n
"
,
ig_DeviceID
);
done
:
SafeRelease
(
&
pEvent
);
SafeRelease
(
&
ig_pSession
);
SafeRelease
(
&
ig_pTopology
);
...
...
@@ -1086,16 +1081,16 @@ void ImageGrabber::resumeGrabbing()
HRESULT
ImageGrabber
::
CreateTopology
(
IMFMediaSource
*
pSource
,
IMFActivate
*
pSinkActivate
,
IMFTopology
**
ppTopo
)
{
IMFTopology
*
pTopology
=
NULL
;
IMFPresentationDescriptor
*
pPD
=
NULL
;
IMFStreamDescriptor
*
pSD
=
NULL
;
IMFMediaTypeHandler
*
pHandler
=
NULL
;
IMFTopologyNode
*
pNode1
=
NULL
;
IMFTopologyNode
*
pNode2
=
NULL
;
ComPtr
<
IMFTopology
>
pTopology
=
NULL
;
ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
ComPtr
<
IMFStreamDescriptor
>
pSD
=
NULL
;
ComPtr
<
IMFMediaTypeHandler
>
pHandler
=
NULL
;
ComPtr
<
IMFTopologyNode
>
pNode1
=
NULL
;
ComPtr
<
IMFTopologyNode
>
pNode2
=
NULL
;
HRESULT
hr
=
S_OK
;
DWORD
cStreams
=
0
;
CHECK_HR
(
hr
=
MFCreateTopology
(
&
pTopology
));
CHECK_HR
(
hr
=
pSource
->
CreatePresentationDescriptor
(
&
pPD
));
CHECK_HR
(
hr
=
MFCreateTopology
(
pTopology
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pSource
->
CreatePresentationDescriptor
(
pPD
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pPD
->
GetStreamDescriptorCount
(
&
cStreams
));
for
(
DWORD
i
=
0
;
i
<
cStreams
;
i
++
)
{
...
...
@@ -1107,29 +1102,20 @@ HRESULT ImageGrabber::CreateTopology(IMFMediaSource *pSource, IMFActivate *pSink
CHECK_HR
(
hr
=
pHandler
->
GetMajorType
(
&
majorType
));
if
(
majorType
==
MFMediaType_Video
&&
fSelected
)
{
CHECK_HR
(
hr
=
AddSourceNode
(
pTopology
,
pSource
,
pPD
,
pSD
,
&
pNode1
));
CHECK_HR
(
hr
=
AddOutputNode
(
pTopology
,
pSinkActivate
,
0
,
&
pNode2
));
CHECK_HR
(
hr
=
pNode1
->
ConnectOutput
(
0
,
pNode2
,
0
));
CHECK_HR
(
hr
=
AddSourceNode
(
pTopology
.
Get
(),
pSource
,
pPD
.
Get
(),
pSD
.
Get
(),
pNode1
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
AddOutputNode
(
pTopology
.
Get
(),
pSinkActivate
,
0
,
pNode2
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pNode1
->
ConnectOutput
(
0
,
pNode2
.
Get
()
,
0
));
break
;
}
else
{
CHECK_HR
(
hr
=
pPD
->
DeselectStream
(
i
));
}
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
}
*
ppTopo
=
pTopology
;
*
ppTopo
=
pTopology
.
Get
()
;
(
*
ppTopo
)
->
AddRef
();
done
:
SafeRelease
(
&
pTopology
);
SafeRelease
(
&
pNode1
);
SafeRelease
(
&
pNode2
);
SafeRelease
(
&
pPD
);
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
return
hr
;
}
...
...
@@ -1140,20 +1126,18 @@ HRESULT ImageGrabber::AddSourceNode(
IMFStreamDescriptor
*
pSD
,
// Stream descriptor.
IMFTopologyNode
**
ppNode
)
// Receives the node pointer.
{
IMFTopologyNode
*
pNode
=
NULL
;
ComPtr
<
IMFTopologyNode
>
pNode
=
NULL
;
HRESULT
hr
=
S_OK
;
CHECK_HR
(
hr
=
MFCreateTopologyNode
(
MF_TOPOLOGY_SOURCESTREAM_NODE
,
&
pNode
));
CHECK_HR
(
hr
=
MFCreateTopologyNode
(
MF_TOPOLOGY_SOURCESTREAM_NODE
,
pNode
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pNode
->
SetUnknown
(
MF_TOPONODE_SOURCE
,
pSource
));
CHECK_HR
(
hr
=
pNode
->
SetUnknown
(
MF_TOPONODE_PRESENTATION_DESCRIPTOR
,
pPD
));
CHECK_HR
(
hr
=
pNode
->
SetUnknown
(
MF_TOPONODE_STREAM_DESCRIPTOR
,
pSD
));
CHECK_HR
(
hr
=
pTopology
->
AddNode
(
pNode
));
CHECK_HR
(
hr
=
pTopology
->
AddNode
(
pNode
.
Get
()
));
// Return the pointer to the caller.
*
ppNode
=
pNode
;
*
ppNode
=
pNode
.
Get
()
;
(
*
ppNode
)
->
AddRef
();
done
:
SafeRelease
(
&
pNode
);
return
hr
;
}
...
...
@@ -1163,20 +1147,18 @@ HRESULT ImageGrabber::AddOutputNode(
DWORD
dwId
,
// Identifier of the stream sink.
IMFTopologyNode
**
ppNode
)
// Receives the node pointer.
{
IMFTopologyNode
*
pNode
=
NULL
;
ComPtr
<
IMFTopologyNode
>
pNode
=
NULL
;
HRESULT
hr
=
S_OK
;
CHECK_HR
(
hr
=
MFCreateTopologyNode
(
MF_TOPOLOGY_OUTPUT_NODE
,
&
pNode
));
CHECK_HR
(
hr
=
MFCreateTopologyNode
(
MF_TOPOLOGY_OUTPUT_NODE
,
pNode
.
GetAddressOf
()
));
CHECK_HR
(
hr
=
pNode
->
SetObject
(
pActivate
));
CHECK_HR
(
hr
=
pNode
->
SetUINT32
(
MF_TOPONODE_STREAMID
,
dwId
));
CHECK_HR
(
hr
=
pNode
->
SetUINT32
(
MF_TOPONODE_NOSHUTDOWN_ON_REMOVE
,
FALSE
));
CHECK_HR
(
hr
=
pTopology
->
AddNode
(
pNode
));
CHECK_HR
(
hr
=
pTopology
->
AddNode
(
pNode
.
Get
()
));
// Return the pointer to the caller.
*
ppNode
=
pNode
;
*
ppNode
=
pNode
.
Get
()
;
(
*
ppNode
)
->
AddRef
();
done
:
SafeRelease
(
&
pNode
);
return
hr
;
}
...
...
@@ -1457,9 +1439,9 @@ Media_Foundation::~Media_Foundation(void)
bool
Media_Foundation
::
buildListOfDevices
()
{
HRESULT
hr
=
S_OK
;
IMFAttributes
*
pAttributes
=
NULL
;
ComPtr
<
IMFAttributes
>
pAttributes
=
NULL
;
CoInitialize
(
NULL
);
hr
=
MFCreateAttributes
(
&
pAttributes
,
1
);
hr
=
MFCreateAttributes
(
pAttributes
.
GetAddressOf
()
,
1
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
pAttributes
->
SetGUID
(
...
...
@@ -1470,14 +1452,14 @@ bool Media_Foundation::buildListOfDevices()
if
(
SUCCEEDED
(
hr
))
{
videoDevices
*
vDs
=
&
videoDevices
::
getInstance
();
hr
=
vDs
->
initDevices
(
pAttributes
);
hr
=
vDs
->
initDevices
(
pAttributes
.
Get
()
);
}
else
{
DebugPrintOut
*
DPO
=
&
DebugPrintOut
::
getInstance
();
DPO
->
printOut
(
L"MEDIA FOUNDATION: The access to the video cameras denied
\n
"
);
}
SafeRelease
(
&
pAttributes
);
return
(
SUCCEEDED
(
hr
));
}
...
...
@@ -1721,14 +1703,15 @@ long videoDevice::checkDevice(IMFAttributes *pAttributes, IMFActivate **pDevice)
}
return
hr
;
}
long
videoDevice
::
initDevice
()
{
HRESULT
hr
=
-
1
;
IMFAttributes
*
pAttributes
=
NULL
;
IMFActivate
*
vd_pActivate
=
NULL
;
ComPtr
<
IMFAttributes
>
pAttributes
=
NULL
;
IMFActivate
*
vd_pActivate
=
NULL
;
DebugPrintOut
*
DPO
=
&
DebugPrintOut
::
getInstance
();
CoInitialize
(
NULL
);
hr
=
MFCreateAttributes
(
&
pAttributes
,
1
);
hr
=
MFCreateAttributes
(
pAttributes
.
GetAddressOf
()
,
1
);
if
(
SUCCEEDED
(
hr
))
{
hr
=
pAttributes
->
SetGUID
(
...
...
@@ -1738,7 +1721,7 @@ long videoDevice::initDevice()
}
if
(
SUCCEEDED
(
hr
))
{
hr
=
checkDevice
(
pAttributes
,
&
vd_pActivate
);
hr
=
checkDevice
(
pAttributes
.
Get
()
,
&
vd_pActivate
);
if
(
SUCCEEDED
(
hr
)
&&
vd_pActivate
)
{
SafeRelease
(
&
vd_pSource
);
...
...
@@ -1760,9 +1743,10 @@ long videoDevice::initDevice()
{
DPO
->
printOut
(
L"VIDEODEVICE %i: The attribute of video cameras cannot be getting
\n
"
,
vd_CurrentNumber
);
}
SafeRelease
(
&
pAttributes
);
return
hr
;
}
MediaType
videoDevice
::
getFormat
(
unsigned
int
id
)
{
if
(
id
<
vd_CurrentFormats
.
size
())
...
...
@@ -1887,45 +1871,45 @@ void videoDevice::buildLibraryofTypes()
count
++
;
}
}
long
videoDevice
::
setDeviceFormat
(
IMFMediaSource
*
pSource
,
unsigned
long
dwFormatIndex
)
{
IMFPresentationDescriptor
*
pPD
=
NULL
;
IMFStreamDescriptor
*
pSD
=
NULL
;
IMFMediaTypeHandler
*
pHandler
=
NULL
;
IMFMediaType
*
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
&
pPD
);
ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
ComPtr
<
IMFStreamDescriptor
>
pSD
=
NULL
;
ComPtr
<
IMFMediaTypeHandler
>
pHandler
=
NULL
;
ComPtr
<
IMFMediaType
>
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
pPD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
BOOL
fSelected
;
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
&
pSD
);
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
pSD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
hr
=
pSD
->
GetMediaTypeHandler
(
&
pHandler
);
hr
=
pSD
->
GetMediaTypeHandler
(
pHandler
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
hr
=
pHandler
->
GetMediaTypeByIndex
((
DWORD
)
dwFormatIndex
,
&
pType
);
hr
=
pHandler
->
GetMediaTypeByIndex
((
DWORD
)
dwFormatIndex
,
pType
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
hr
=
pHandler
->
SetCurrentMediaType
(
pType
);
hr
=
pHandler
->
SetCurrentMediaType
(
pType
.
Get
());
done
:
SafeRelease
(
&
pPD
);
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
SafeRelease
(
&
pType
);
return
hr
;
}
bool
videoDevice
::
isDeviceSetup
()
{
return
vd_IsSetuped
;
}
RawImage
*
videoDevice
::
getRawImageOut
()
{
if
(
!
vd_IsSetuped
)
return
NULL
;
...
...
@@ -1938,6 +1922,7 @@ RawImage * videoDevice::getRawImageOut()
}
return
NULL
;
}
bool
videoDevice
::
isFrameNew
()
{
if
(
!
vd_IsSetuped
)
return
false
;
...
...
@@ -1962,16 +1947,19 @@ bool videoDevice::isFrameNew()
}
return
false
;
}
bool
videoDevice
::
isDeviceMediaSource
()
{
if
(
vd_LockOut
==
MediaSourceLock
)
return
true
;
return
false
;
}
bool
videoDevice
::
isDeviceRawDataSource
()
{
if
(
vd_LockOut
==
RawDataLock
)
return
true
;
return
false
;
}
bool
videoDevice
::
setupDevice
(
unsigned
int
id
)
{
DebugPrintOut
*
DPO
=
&
DebugPrintOut
::
getInstance
();
...
...
@@ -2002,15 +1990,18 @@ bool videoDevice::setupDevice(unsigned int id)
return
false
;
}
}
bool
videoDevice
::
setupDevice
(
unsigned
int
w
,
unsigned
int
h
,
unsigned
int
idealFramerate
)
{
unsigned
int
id
=
findType
(
w
*
h
,
idealFramerate
);
return
setupDevice
(
id
);
}
wchar_t
*
videoDevice
::
getName
()
{
return
vd_pFriendlyName
;
}
videoDevice
::~
videoDevice
(
void
)
{
closeDevice
();
...
...
@@ -2018,24 +2009,25 @@ videoDevice::~videoDevice(void)
if
(
vd_pFriendlyName
)
CoTaskMemFree
(
vd_pFriendlyName
);
}
long
videoDevice
::
enumerateCaptureFormats
(
IMFMediaSource
*
pSource
)
{
IMFPresentationDescriptor
*
pPD
=
NULL
;
IMFStreamDescriptor
*
pSD
=
NULL
;
IMFMediaTypeHandler
*
pHandler
=
NULL
;
IMFMediaType
*
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
&
pPD
);
ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
ComPtr
<
IMFStreamDescriptor
>
pSD
=
NULL
;
ComPtr
<
IMFMediaTypeHandler
>
pHandler
=
NULL
;
ComPtr
<
IMFMediaType
>
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
pPD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
BOOL
fSelected
;
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
&
pSD
);
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
pSD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
hr
=
pSD
->
GetMediaTypeHandler
(
&
pHandler
);
hr
=
pSD
->
GetMediaTypeHandler
(
pHandler
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
...
...
@@ -2048,20 +2040,16 @@ long videoDevice::enumerateCaptureFormats(IMFMediaSource *pSource)
}
for
(
DWORD
i
=
0
;
i
<
cTypes
;
i
++
)
{
hr
=
pHandler
->
GetMediaTypeByIndex
(
i
,
&
pType
);
hr
=
pHandler
->
GetMediaTypeByIndex
(
i
,
pType
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
MediaType
MT
=
FormatReader
::
Read
(
pType
);
MediaType
MT
=
FormatReader
::
Read
(
pType
.
Get
()
);
vd_CurrentFormats
.
push_back
(
MT
);
SafeRelease
(
&
pType
);
}
done
:
SafeRelease
(
&
pPD
);
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
SafeRelease
(
&
pType
);
return
hr
;
}
...
...
@@ -3366,11 +3354,11 @@ void CvCaptureFile_MSMF::processPixels(unsigned char * src, unsigned char * dst,
long
CvCaptureFile_MSMF
::
enumerateCaptureFormats
(
IMFMediaSource
*
pSource
)
{
IMFPresentationDescriptor
*
pPD
=
NULL
;
IMFStreamDescriptor
*
pSD
=
NULL
;
IMFMediaTypeHandler
*
pHandler
=
NULL
;
IMFMediaType
*
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
&
pPD
);
ComPtr
<
IMFPresentationDescriptor
>
pPD
=
NULL
;
ComPtr
<
IMFStreamDescriptor
>
pSD
=
NULL
;
ComPtr
<
IMFMediaTypeHandler
>
pHandler
=
NULL
;
ComPtr
<
IMFMediaType
>
pType
=
NULL
;
HRESULT
hr
=
pSource
->
CreatePresentationDescriptor
(
pPD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
...
...
@@ -3383,12 +3371,12 @@ long CvCaptureFile_MSMF::enumerateCaptureFormats(IMFMediaSource *pSource)
printf
(
"Stream count: %d
\n
"
,
cnt
);
BOOL
fSelected
;
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
&
pSD
);
hr
=
pPD
->
GetStreamDescriptorByIndex
(
0
,
&
fSelected
,
pSD
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
hr
=
pSD
->
GetMediaTypeHandler
(
&
pHandler
);
hr
=
pSD
->
GetMediaTypeHandler
(
pHandler
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
...
...
@@ -3401,21 +3389,16 @@ long CvCaptureFile_MSMF::enumerateCaptureFormats(IMFMediaSource *pSource)
}
for
(
DWORD
i
=
0
;
i
<
cTypes
;
i
++
)
{
hr
=
pHandler
->
GetMediaTypeByIndex
(
i
,
&
pType
);
hr
=
pHandler
->
GetMediaTypeByIndex
(
i
,
pType
.
GetAddressOf
()
);
if
(
FAILED
(
hr
))
{
goto
done
;
}
MediaType
MT
=
FormatReader
::
Read
(
pType
);
MediaType
MT
=
FormatReader
::
Read
(
pType
.
Get
()
);
captureFormats
.
push_back
(
MT
);
SafeRelease
(
&
pType
);
}
done
:
SafeRelease
(
&
pPD
);
SafeRelease
(
&
pSD
);
SafeRelease
(
&
pHandler
);
SafeRelease
(
&
pType
);
return
hr
;
}
...
...
@@ -3452,8 +3435,6 @@ CvCapture* cvCreateFileCapture_MSMF (const char* filename)
//
//
using
namespace
Microsoft
::
WRL
;
class
CvVideoWriter_MSMF
:
public
CvVideoWriter
{
public
:
...
...
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