Skip to content

Commit fd06396

Browse files
committed
Ignore errors in case MF device can't be opened
1 parent 1fe8766 commit fd06396

File tree

1 file changed

+39
-31
lines changed

1 file changed

+39
-31
lines changed

src/VideoInInfo.cs

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -86,49 +86,57 @@ internal static void EnumerateCaptureDevicesMF(ImmutableArray<VideoDeviceInfo>.B
8686
static unsafe ImmutableArray<Format> GetVideoFormats(IMFActivate* device)
8787
{
8888
var formats = ImmutableArray.CreateBuilder<Format>();
89-
var mediaSource = (IMFMediaSource*)device->ActivateObject(in IMFMediaSource.IID_Guid);
90-
91-
IMFPresentationDescriptor* descriptor = null;
92-
IMFStreamDescriptor* streamDescriptor = null;
93-
IMFMediaTypeHandler* handler = null;
9489

9590
try
9691
{
97-
mediaSource->CreatePresentationDescriptor(&descriptor);
98-
descriptor->GetStreamDescriptorByIndex(0, out _, &streamDescriptor);
99-
streamDescriptor->GetMediaTypeHandler(&handler);
100-
handler->GetMediaTypeCount(out var mediaTypeCount);
92+
var mediaSource = (IMFMediaSource*)device->ActivateObject(in IMFMediaSource.IID_Guid);
93+
94+
IMFPresentationDescriptor* descriptor = null;
95+
IMFStreamDescriptor* streamDescriptor = null;
96+
IMFMediaTypeHandler* handler = null;
10197

102-
for (uint i = 0; i < mediaTypeCount; i++)
98+
try
10399
{
104-
IMFMediaType* mediaType;
105-
handler->GetMediaTypeByIndex(i, &mediaType);
106-
try
100+
mediaSource->CreatePresentationDescriptor(&descriptor);
101+
descriptor->GetStreamDescriptorByIndex(0, out _, &streamDescriptor);
102+
streamDescriptor->GetMediaTypeHandler(&handler);
103+
handler->GetMediaTypeCount(out var mediaTypeCount);
104+
105+
for (uint i = 0; i < mediaTypeCount; i++)
107106
{
108-
mediaType->GetMajorType(out var majorType);
109-
if (majorType == MFMediaType_Video)
107+
IMFMediaType* mediaType;
108+
handler->GetMediaTypeByIndex(i, &mediaType);
109+
try
110110
{
111-
mediaType->GetUINT64(MF_MT_FRAME_RATE, out var fr);
112-
var frameRate = ParseFrameRate(fr);
113-
mediaType->GetUINT64(MF_MT_FRAME_SIZE, out var fs);
114-
ParseSize(fs, out int width, out int height);
115-
116-
var format = GetVideoFormat(mediaType);
117-
118-
formats.Add(new Format(width, height, frameRate, format));
111+
mediaType->GetMajorType(out var majorType);
112+
if (majorType == MFMediaType_Video)
113+
{
114+
mediaType->GetUINT64(MF_MT_FRAME_RATE, out var fr);
115+
var frameRate = ParseFrameRate(fr);
116+
mediaType->GetUINT64(MF_MT_FRAME_SIZE, out var fs);
117+
ParseSize(fs, out int width, out int height);
118+
119+
var format = GetVideoFormat(mediaType);
120+
121+
formats.Add(new Format(width, height, frameRate, format));
122+
}
123+
}
124+
finally
125+
{
126+
mediaType->Release();
119127
}
120128
}
121-
finally
122-
{
123-
mediaType->Release();
124-
}
129+
}
130+
finally
131+
{
132+
handler->Release();
133+
streamDescriptor->Release();
134+
descriptor->Release();
125135
}
126136
}
127-
finally
137+
catch (Exception)
128138
{
129-
handler->Release();
130-
streamDescriptor->Release();
131-
descriptor->Release();
139+
// Ignore errors - if the device can't be opened, it will be skipped
132140
}
133141

134142
return formats.ToImmutable();

0 commit comments

Comments
 (0)