다음을 통해 공유


센서 그룹 변환(카메라 프로필 V2)

센서 그룹 변환은 DMFT와 유사한 메커니즘을 사용하여 카메라 프로필을 게시할 수 있습니다. MF_DEVICEMFT_SENSORPROFILE_COLLECTION 특성은 지원되는 각 SGT(센서 그룹 변환)에 대해 IMFSensorTransformFactory::GetTransformInformation의 IMFAttributes 매개 변수를 통해 게시할 수 있습니다.

IMFSensorTransformFactory::InitializeFactory 호출 중에 IMSensorDevice 인터페이스 컬렉션이 제공되고, SGT 팩터리는 IMFGetService 인터페이스에 대한 IMFSensorDevice 인터페이스를 QI-ing하여 사용 가능한 디바이스에서 사용 가능한 카메라 프로필을 변경할 수 있습니다. 이 인터페이스에서 SGT 팩터리는 IMFSensorProfileCollection 인터페이스를 요청할 수 있습니다.

그런 다음, SGT 팩터리에서 선택한 경우 각 IMFSensorDevice에 대해 사용 가능한 카메라 프로필을 추가/제거/업데이트할 수 있습니다. 수정된 카메라 프로필은 SGT를 포함하는 센서 그룹에 대해서만 유지됩니다. 개별 디바이스의 카메라 프로필은 새 정보로 수정되지 않습니다.

샘플 센서 그룹 변환

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

카메라 프로필 V2 개발자 사양