Sdílet prostřednictvím


Transformace skupin snímačů (profil kamery V2)

Transformace skupin snímačů můžou publikovat profily fotoaparátu pomocí podobného mechanismu jako DMFT. Atribut MF_DEVICEMFT_SENSORPROFILE_COLLECTION může být publikován prostřednictvím parametru IMFAttributes z IMFSensorTransformFactory::GetTransformInformation pro každou z podporovaných transformací skupin snímačů (SGT).

Během volání IMFSensorTransformFactory::InitializeFactory bude poskytnuta kolekce rozhraní IMFSensorDevice. SGT Factory může měnit dostupné profily fotoaparátu z těchto zařízení dotazováním rozhraní IMFSensorDevice na rozhraní IMFGetService. Z tohoto rozhraní může SGT Factory požádat o rozhraní IMFSensorProfileCollection.

SGT Factory pak může přidat, odebrat nebo aktualizovat dostupné profily fotoaparátu pro každý MMFSensorDevice, pokud se to rozhodne SGT Factory. Upravené profily fotoaparátu budou zachovány pouze pro skupinu snímačů, která obsahuje SGT. Profily fotoaparátu pro jednotlivá zařízení nebudou změněny s novými informacemi.

Ukázková transformace skupiny snímačů

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...
}

Specifikace pro vývojáře profilu kamery V2