Skip to content

Commit 7c369d7

Browse files
committed
Fixed msmf preview cleanup and bump to version 0.17.1
1 parent 8dbd350 commit 7c369d7

File tree

6 files changed

+80
-66
lines changed

6 files changed

+80
-66
lines changed

include/RealSenseID/Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
#define RSID_VER_MAJOR 0
1111
#define RSID_VER_MINOR 17
12-
#define RSID_VER_PATCH 0
12+
#define RSID_VER_PATCH 1
1313

1414
#define RSID_VERSION (RSID_VER_MAJOR * 10000 + RSID_VER_MINOR * 100 + RSID_VER_PATCH)
1515

release_notes.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Realsense ID version 0.17.1
2+
--------------------------
3+
Fixed preview resource cleanup in windows
4+
15
Realsense ID version 0.17.0
26
--------------------------
37
* Database import/export support [Device mode only]:

src/Capture/MSMFCapture.cc

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
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";
2324
static const DWORD STREAM_NUMBER = MF_SOURCE_READER_FIRST_VIDEO_STREAM;
2425
static 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

6259
static 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();

src/Capture/MSMFCapture.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ namespace RealSenseID
1010
{
1111
namespace Capture
1212
{
13-
class MsmfInitializer;
13+
class MsmfInitializer
14+
{
15+
public:
16+
MsmfInitializer();
17+
~MsmfInitializer();
18+
};
1419

1520
class CaptureHandle
1621
{
1722
public:
18-
explicit CaptureHandle(const PreviewConfig& config);
23+
explicit CaptureHandle(const PreviewConfig& config);
1924
~CaptureHandle();
2025
bool Read(RealSenseID::Image* res);
2126

@@ -25,11 +30,11 @@ class CaptureHandle
2530
void operator=(const CaptureHandle&) = delete;
2631

2732
private:
33+
MsmfInitializer _mf;
2834
IMFSourceReader* _video_src = nullptr;
2935
IMFMediaBuffer* _buf = nullptr;
3036
StreamConverter _stream_converter;
3137
PreviewConfig _config;
32-
MsmfInitializer& _mf;
3338
};
3439
} // namespace Capture
3540
} // namespace RealSenseID

src/PreviewImpl.cc

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,14 @@
66
#include "RealSenseID/DiscoverDevices.h"
77
#include <chrono>
88

9-
#ifdef ANDROID
10-
#include "AndroidCapture.h"
11-
#elif LINUX
12-
#include "LinuxCapture.h"
13-
#elif _WIN32
14-
#include "MSMFCapture.h"
15-
#endif
16-
179
static const char* LOG_TAG = "Preview";
1810

1911
namespace RealSenseID
2012
{
2113
PreviewImpl::PreviewImpl(const PreviewConfig& config) : _config(config)
2214
{
23-
if(config.cameraNumber == -1) {
15+
if (config.cameraNumber == -1)
16+
{
2417
std::vector<int> camera_numbers;
2518
try
2619
{
@@ -30,7 +23,7 @@ PreviewImpl::PreviewImpl(const PreviewConfig& config) : _config(config)
3023
{
3124
}
3225
_config.cameraNumber = (camera_numbers.size() > 0) ? camera_numbers[0] : 0;
33-
}
26+
}
3427
};
3528

3629
PreviewImpl::~PreviewImpl()
@@ -59,17 +52,18 @@ bool PreviewImpl::StartPreview(PreviewImageReadyCallback& callback)
5952
_worker_thread = std::thread([&]() {
6053
try
6154
{
55+
_capture = std::make_unique<Capture::CaptureHandle>(_config);
6256
unsigned int frameNumber = 0;
63-
Capture::CaptureHandle capture(_config);
6457
LOG_DEBUG(LOG_TAG, "Preview started!");
6558
while (!_canceled)
6659
{
67-
if (_paused) {
68-
std::this_thread::sleep_for(std::chrono::milliseconds{100});
60+
if (_paused)
61+
{
62+
std::this_thread::sleep_for(std::chrono::milliseconds {100});
6963
continue;
7064
}
7165
RealSenseID::Image container;
72-
bool res = capture.Read(&container);
66+
bool res = _capture->Read(&container);
7367
if (_canceled)
7468
{
7569
break;

src/PreviewImpl.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
#include <thread>
99
#include <atomic>
1010

11+
#ifdef ANDROID
12+
#include "AndroidCapture.h"
13+
#elif LINUX
14+
#include "LinuxCapture.h"
15+
#elif _WIN32
16+
#include "MSMFCapture.h"
17+
#endif
18+
1119
namespace RealSenseID
1220
{
1321
class PreviewImpl
@@ -26,5 +34,6 @@ class PreviewImpl
2634
std::atomic_bool _canceled {false};
2735
std::atomic_bool _paused {false};
2836
PreviewImageReadyCallback* _callback = nullptr;
37+
std::unique_ptr<Capture::CaptureHandle> _capture;
2938
};
3039
} // namespace RealSenseID

0 commit comments

Comments
 (0)