Partager via


Transformations de groupe de capteurs (profil d’appareil photo V2)

Les transformations de groupe de capteurs peuvent publier des profils d’appareil photo à l’aide d’un mécanisme similaire à DMFT. L’attribut MF_DEVICEMFT_SENSORPROFILE_COLLECTION peut être publié via le paramètre IMFAttributes à partir de IMFSensorTransformFactory ::GetTransformInformation pour chacune des transformations de groupe de capteurs (SGT) prises en charge.

Lors de l’appel IMFSensorTransformFactory ::InitializeFactory, une collection d’interfaces IMSensorDevice sera fournie. SGT Factory peut modifier les profils d’appareil photo disponibles à partir des appareils disponibles en qi-ing de l’interface IMFSensorDevice pour l’interface IMFGetService. À partir de cette interface, la fabrique SGT peut demander l’interface IMFSensorProfileCollection.

SGT Factory peut ensuite ajouter/supprimer/mettre à jour les profils d’appareil photo disponibles pour chaque IMFSensorDevice si la fabrique SGT choisit de le faire. Les profils d’appareil photo modifiés sont conservés uniquement pour le groupe de capteurs qui contient le SGT. Les profils d’appareil photo des appareils individuels ne seront pas modifiés avec les nouvelles informations.

Exemple de transformation de groupe de capteurs

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

Spécification du développeur Du profil d’appareil photo V2