+ // retreive acceptable media types supported by device
+
+ AM_MEDIA_TYPE media_types[MAX_MEDIA_TYPES];
+ size_t media_count = EnumDeviceCaps( p_this, p_device_filter, p_sys->i_chroma,
+ p_sys->i_width, p_sys->i_height,
+ 0, 0, 0, media_types, MAX_MEDIA_TYPES );
+
+ if( media_count > 0 )
+ {
+ mt = (AM_MEDIA_TYPE *)realloc( mt, sizeof(AM_MEDIA_TYPE)*(mt_count+media_count) );
+
+ // Order and copy returned media types according to arbitrary
+ // fourcc priority
+ for( size_t c = 0; c < media_count; c++ )
+ {
+ int slot_priority =
+ GetFourCCPriority(GetFourCCFromMediaType(media_types[c]));
+ size_t slot_copy = c;
+ for( size_t d = c+1; d < media_count; d++ )
+ {
+ int priority =
+ GetFourCCPriority(GetFourCCFromMediaType(media_types[d]));
+ if( priority > slot_priority )
+ {
+ slot_priority = priority;
+ slot_copy = d;
+ }
+ }
+ if( slot_copy != c )
+ {
+ mt[c+mt_count] = media_types[slot_copy];
+ media_types[slot_copy] = media_types[c];
+ }
+ else
+ {
+ mt[c+mt_count] = media_types[c];
+ }
+ }
+ mt_count += media_count;
+ }
+