IMFTrackedSample interface is available/allowed in UWP applications. The interface is a useful one when one implements a pool of samples and needs a notification when certain instance can be recycled.
Use this interface to determine whether it is safe to delete or re-use the buffer contained in a sample. One object assigns itself as the owner of the video sample by calling
SetAllocator. When all objects release their reference counts on the sample, the owner’s callback method is invoked.
The notification is asynchronous meaning that when a sample is available the notification is scheduled for delivery via standard (for Media Foundation)
IMFAsyncCallback::Invoke call. This is quite convenient.
When this method is called, the sample holds an additional reference count on itself. When every other object releases its reference counts on the sample, the sample invokes the pSampleAllocator callback method. To get a pointer to the sample, call IMFAsyncResult::GetObject on the asynchronous result object given to the callback’s IMFAsyncCallback::Invoke method.
I would not have mentioned this if it was that simple, would I?
One could start feeling problems already while looking at MSDN page:
Minimum supported client – Windows Vista [desktop apps | UWP apps]
Minimum supported server – Windows Server 2008 [desktop apps | UWP apps]
Header – Evr.h
Library – Strmiids.lib
Oh really, Strmiids.lib?
So the problem is that even though the interface itself is whitelisted for UWP and is a Media Foundation interface in its nature, it is implemented along with EVR and is effectively exposed to public via
MFCreateVideoSampleFromSurface API. That is, the only API function that provides access to UWP-friendly interface is a UWP-unfriendly function. Bummer.
It took me less than 300 lines of code to implement a video sample class with
IMFTrackedSample implementation that mimics standard (good bye stock implementation!), so it is not difficult. However it would be better if OS implementation is available nicely in first place.