Sensorgruppentransformationen (Kameraprofil V2)
Sensorgruppentransformationen können Kameraprofile mit einem ähnlichen Mechanismus wie DMFT veröffentlichen. Das MF_DEVICEMFT_SENSORPROFILE_COLLECTION-Attribut kann über den IMFAttributes-Parameter aus der IMFSensorTransformFactory::GetTransformInformation für jede der unterstützten Sensorgruppentransformationen (SGT) veröffentlicht werden.
Während des IMFSensorTransformFactory::InitializeFactory-Aufrufs wird eine Sammlung von IMSensorDevice-Schnittstellen bereitgestellt. SGT Factory kann die verfügbaren Kameraprofile von den verfügbaren Geräten ändern, indem die IMFSensorDevice-Schnittstelle für die IMFGetService-Schnittstelle QI-ingt. Über diese Schnittstelle kann die SGT Factory die IMFSensorProfileCollection-Schnittstelle anfordern.
SGT Factory kann dann die verfügbaren Kameraprofile für jedes IMFSensorDevice hinzufügen/entfernen/aktualisieren, wenn die SGT Factory dies wählt. Die geänderten Kameraprofile werden nur für die Sensorgruppe beibehalten, die den SGT enthält. Die Kameraprofile für die einzelnen Geräte werden nicht mit den neuen Informationen geändert.
Beispieltransformation für Sensorgruppen
IFACEMETHODIMP
SampleSensorTransformFactory::InitializeFactory(
_In_ DWORD dwMaxTransformCount,
_In_ IMFCollection* sensorDevices,
_In_opt_ IMFAttributes* pAttributes
)
{
DWORD sensorDeviceCount = 0;
ComPtr<IUnknown> unknown;
if (nullptr == sensorDevices)
{
return E_INVALIDARG;
}
// For this example, the IHV/OEM added a SGT to a multi-camera
// setup. And the SGT is responsible for updating the profile
// information available from each of the physical cameras, and
// leave it's own profile as "blank". This has the net effect
// of having the SGT support any profile the physical devices
// expose.
RETURN_IF_FAILED (sensorDevices->GetElementCount(&sensorDeviceCount));
for (DWORD idx = 0; idx < sensorDeviceCount; idx++)
{
ComPtr<IMFGetService> service;
ComPtr<IMFSensorProfileCollection> profileCollection;
SENSORPROFILEID sensorProfileId;
RETURN_IF_FAILED (sensorDevices->GetElement(idx,
unknown.ReleaseAndGetAddressOf()));
RETURN_IF_FAILED (unknown.As(service.ReleaseAndGetAddressOf()));
RETURN_IF_FAILED (service->GetService(GUID_NULL,
ID_PPV_ARGS(profileCollection.ReleaseAndGetAddressOf())));
// Let's assume that for this ISP/sensor, we cannot support
// photo sequence but our reference driver published a single
// photo sequence profile whose ID is hardcoded to a static
// variable s_PhotoSequenceProfileId.
RETURN_IF_FAILED (profileCollection->RemoveProfile(&s_PhotoSequenceProfileId));
// Let's also assume this is a low cost ISP/sensor so our driver
// cannot support Video HDR (VHDR) control for high frame rate
// recording and our reference implementation published multiple
// high frame rate recording profile.
//
// Also for this combination of ISP/sensor, we cannot support
// Face Auth (IR doesn't support alternate illumination option).
// So we need to remove all Face Auth from our collection.
for (DWORD profileIdx = 0;
profileIdx < profileCollection->GetProfileCount();)
{
ComPtr<IMFSensorProfile> profile;
RETURN_IF_FAILED (profileCollection->GetProfile(profileIdx,
profile.ReleaseAndGetAddressOf()));
RETURN_IF_FAILED (profile->GetProfileId(&profileId));
if (profileId.Type == KSCAMERAPROFILE_HighFrameRate)
{
RETURN_IF_FAILED (profile->AddBlockedControl(L"VHDR"));
}
if (profileId.Type == KSCAMERAPROFILE_FaceAuth_Mode)
{
RETURN_IF_FAILED (profileCollection->RemoveProfileByIndex(profileIdx));
}
else
{
profileIdx++;
}
}
}
// Set the profile collection to the attribute store that will be returned when
// IMFSensorTransformFactory::GetTransformInformation is called.
RETURN_IF_FAILED (m_spAttributes->SetUnknown(MF_DEVICEMFT_SENSORPROFILE_COLLECTION,
spProfileCollection));
// ... Rest of the InitializeFactory logic...
}