0

An alternative title could be: What happened to PIN_CATEGORY_STILL?

I am currently comparing images that were captured using DirectShow and PIN_CATEGORY_STILL with images that were captured using UWP MediaCapture.

On the device I am testing/playing around with DirectShow and MediaCapture, DirectShow detects a PIN_CATEGORY_STILL but I am not able to initialize an instance of MediaCapture with anything other than PhotoCaptureSource.VideoPreview.

MediaCaptureInitializationSettings settings = new()
{
    VideoDeviceId = someDeviceId,
    PhotoCaptureSource = PhotoCaptureSource.Photo
};

MediaCapture capture = new();

// this throws an exception
// "The capture source does not have an independent photo stream."
await capture.InitializeAsync(settings);

At this point I'm not even sure if PhotoCaptureSource.Photo is meant to be used as an equivalent to PIN_CATEGORY_STILL.

Images captured with PIN_CATEGORY_STILL are way brighter in a dark environment and have a much better quality (in file size and resolution) (which is clear to me, since I am using PhotoCaptureSource.VideoPreview for MediaCapture).

Considering this resource Win32 and COM for UWP apps, it seems like UWP MediaCapture does not use DirectShow underneath but MediaFoundation (which is meant to be a successor for DirectShow).

This article led me to this StackOverflow question Media Foundation is incorrectly marking still image capture stream descriptors as video capture, which basically states that MediaFoundation has no PIN_CATEGORY_STILL but returns 1 FPS as video capability for such devices (or profiles).

Since I am not directly using MediaFoundation nor C++, I tried testing this by querying GetAvailableMediaStreamProperties:

private void Foo()
{
    var videoPreviewProperties = GetEncodingProperties(MediaStreamType.VideoRecord);
    var photoProperties = GetEncodingProperties(MediaStreamType.Photo);
    var videoRecordProperties = GetEncodingProperties(MediaStreamType.VideoPreview);
}

private List<VideoEncodingProperties> GetEncodingProperties(MediaStreamType streamType)
{
    // MediaCapture was previously initialized with PhotoCaptureSource.VideoPreview
    return MediaCapture.VideoDeviceController
        .GetAvailableMediaStreamProperties(streamType)
        .OfType<VideoEncodingProperties>()
        .ToList();
}

None of these returns a VideoEncodingProperties with only 1 FPS.

To test MediaCapture any further I tried some of the sample applications from here UWP sample. I tried CameraAdvancedCapture, CameraOpenCV and CameraManualControls, but the results were not nearly as good as good old PIN_CATEGORY_STILL.

What happened to PIN_CATEGORY_STILL? Is there any way to capture images without DirectShow/PIN_CATEGORY_STILL and still keeping this level of quality?

Any enlightenment is much appricated.

Medkn
  • 1
  • 1

0 Answers0