44#include < evr.h>
55#include < mfapi.h>
66#include < mfreadwrite.h>
7+ #include < stdexcept>
78
89#include < string>
910#include < sstream>
@@ -23,41 +24,37 @@ static const char* LOG_TAG = "MSMFCapture";
2324static const DWORD STREAM_NUMBER = MF_SOURCE_READER_FIRST_VIDEO_STREAM;
2425static const GUID W10_FORMAT = {FCC (' pBAA' ), 0x0000 , 0x0010 , {0x80 , 0x00 , 0x00 , 0xaa , 0x00 , 0x38 , 0x9b , 0x71 }};
2526
26- class MsmfInitializer
27+
28+ MsmfInitializer::MsmfInitializer ()
2729{
28- public:
29- ~MsmfInitializer ( )
30+ auto ok = SUCCEEDED ( CoInitializeEx ( nullptr , COINIT_APARTMENTTHREADED));
31+ if (!ok )
3032 {
31- try
32- {
33- if (startup)
34- MFShutdown ();
35- if (init)
36- CoUninitialize ();
37- }
38- catch (...)
39- {
40- LOG_ERROR (LOG_TAG, " uninit MSMFbackend failed" );
41- }
33+ throw std::runtime_error (" CoInitializeEx failed" );
4234 }
43- static MsmfInitializer& getInstance ()
35+
36+ ok = SUCCEEDED (MFStartup (MF_VERSION, MFSTARTUP_NOSOCKET));
37+ if (!ok)
4438 {
45- static MsmfInitializer Instance ;
46- return Instance ;
39+ CoUninitialize () ;
40+ throw std::runtime_error ( " init MSMFbackend failed " ) ;
4741 }
42+ }
43+
4844
49- private:
50- MsmfInitializer ()
45+ MsmfInitializer::~MsmfInitializer ()
46+ {
47+ try
5148 {
52- init = SUCCEEDED (CoInitializeEx (nullptr , COINIT_APARTMENTTHREADED));
53- startup = SUCCEEDED (MFStartup (MF_VERSION, MFSTARTUP_NOSOCKET));
54- if (!init || !startup)
55- LOG_ERROR (LOG_TAG, " init MSMFbackend failed" );
49+ MFShutdown ();
50+ CoUninitialize ();
5651 }
52+ catch (...)
53+ {
54+ LOG_ERROR (LOG_TAG, " uninit MSMFbackend failed" );
55+ }
56+ }
5757
58- bool init = false ;
59- bool startup = false ;
60- };
6158
6259static void ThrowIfFailed (const char * what, HRESULT hr)
6360{
@@ -75,7 +72,9 @@ bool CreateMediaSource(IMFMediaSource** media_device, IMFAttributes** cap_config
7572 UINT32 count = 0 ;
7673
7774 ThrowIfFailed (stage_tag, MFCreateAttributes (cap_config, 10 ));
78- ThrowIfFailed (stage_tag,(*cap_config)->SetGUID (MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID));
75+ ThrowIfFailed (
76+ stage_tag,
77+ (*cap_config)->SetGUID (MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID));
7978 ThrowIfFailed (stage_tag, MFEnumDeviceSources ((*cap_config), &ppDevices, &count));
8079
8180 if (capture_number < 0 || static_cast <UINT32>(capture_number) >= count)
@@ -93,7 +92,7 @@ bool CreateMediaSource(IMFMediaSource** media_device, IMFAttributes** cap_config
9392 return true ;
9493}
9594
96- CaptureHandle::CaptureHandle (const PreviewConfig& config) : _config(config), _mf(MsmfInitializer::getInstance())
95+ CaptureHandle::CaptureHandle (const PreviewConfig& config) : _config(config)
9796{
9897 IMFMediaSource* media_device = nullptr ;
9998 IMFAttributes* cap_config = nullptr ;
@@ -102,24 +101,26 @@ CaptureHandle::CaptureHandle(const PreviewConfig& config) : _config(config), _mf
102101
103102 try
104103 {
105- ThrowIfFailed (" create media source" , HRESULT (CreateMediaSource (&media_device, &cap_config, _config.cameraNumber )));
106- ThrowIfFailed (" create source reader" , MFCreateSourceReaderFromMediaSource (media_device, cap_config, &_video_src));
107-
108- GUID stream_format = _config.previewMode == PreviewMode::VGA ? MFVideoFormat_YUY2 : W10_FORMAT;
109-
110- ThrowIfFailed (" create mediatype " ,MFCreateMediaType (&mediaType));
111- ThrowIfFailed (" set mediaType guid" ,mediaType->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video));
112- ThrowIfFailed (" set mediaType minor type" , mediaType->SetGUID (MF_MT_SUBTYPE, stream_format));
113- if (_config.previewMode == PreviewMode::VGA)
114- ThrowIfFailed (" set size" , MFSetAttributeSize (mediaType, MF_MT_FRAME_SIZE, VGA_WIDTH, VGA_HEIGHT));
115- ThrowIfFailed (" set stream " , _video_src->SetCurrentMediaType (0 , NULL , mediaType));
116-
117- // save stream attributes
118- UINT64 width_height;
119- ThrowIfFailed (" get stream attributes " , _video_src->GetCurrentMediaType (STREAM_NUMBER, &mediaType));
120- mediaType->GetUINT64 (MF_MT_FRAME_SIZE, &width_height);
121-
122- _stream_converter.InitStream ((UINT32)(width_height >> 32 ), (UINT32)(width_height), _config.previewMode );
104+ ThrowIfFailed (" create media source" ,
105+ HRESULT (CreateMediaSource (&media_device, &cap_config, _config.cameraNumber )));
106+ ThrowIfFailed (" create source reader" ,
107+ MFCreateSourceReaderFromMediaSource (media_device, cap_config, &_video_src));
108+
109+ GUID stream_format = _config.previewMode == PreviewMode::VGA ? MFVideoFormat_YUY2 : W10_FORMAT;
110+
111+ ThrowIfFailed (" create mediatype " , MFCreateMediaType (&mediaType));
112+ ThrowIfFailed (" set mediaType guid" , mediaType->SetGUID (MF_MT_MAJOR_TYPE, MFMediaType_Video));
113+ ThrowIfFailed (" set mediaType minor type" , mediaType->SetGUID (MF_MT_SUBTYPE, stream_format));
114+ if (_config.previewMode == PreviewMode::VGA)
115+ ThrowIfFailed (" set size" , MFSetAttributeSize (mediaType, MF_MT_FRAME_SIZE, VGA_WIDTH, VGA_HEIGHT));
116+ ThrowIfFailed (" set stream " , _video_src->SetCurrentMediaType (0 , NULL , mediaType));
117+
118+ // save stream attributes
119+ UINT64 width_height;
120+ ThrowIfFailed (" get stream attributes " , _video_src->GetCurrentMediaType (STREAM_NUMBER, &mediaType));
121+ mediaType->GetUINT64 (MF_MT_FRAME_SIZE, &width_height);
122+
123+ _stream_converter.InitStream ((UINT32)(width_height >> 32 ), (UINT32)(width_height), _config.previewMode );
123124 }
124125 catch (const std::exception& ex)
125126 {
@@ -133,6 +134,7 @@ CaptureHandle::CaptureHandle(const PreviewConfig& config) : _config(config), _mf
133134 _video_src->Release ();
134135 throw ex;
135136 }
137+
136138 if (mediaType)
137139 mediaType->Release ();
138140 if (cap_config)
@@ -165,9 +167,9 @@ bool CaptureHandle::Read(RealSenseID::Image* res)
165167 {
166168 ThrowIfFailed (" ConvertToContiguousBuffer" , sample->ConvertToContiguousBuffer (&_buf));
167169 _buf->Lock (&tmpBuffer, &maxsize, &cursize);
168-
170+
169171 valid_read = _stream_converter.Buffer2Image (res, tmpBuffer, cursize);
170-
172+
171173 if (_buf)
172174 {
173175 _buf->Unlock ();
0 commit comments