@@ -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