다음을 통해 공유


디바이스 MFT 지원(카메라 프로필 V2)

IHV/OEM이 런타임 정보를 기반으로 카메라 프로필을 게시해야 하는 시나리오(예: 여러 센서를 활용하는 여러 SKU에 사용되는 드라이버 집합 하나)에서 카메라 드라이버는 디바이스 MFT를 구현하여 카메라 프로필을 게시해야 합니다.

디바이스 MFT의 InitializeTransform 호출 중에 DMFT는 다음 특성을 통해 IMFSensorProfileCollection 인터페이스를 제공하여 카메라 프로필을 게시할 수 있습니다.

// MF_DEVICEMFT_SENSORPROFILE_COLLECTION
// Data type: IUnknown
// IMFSensorProfileCollection interface that SGT Factory can provide to indicate new
// profiles available to the SG generation.
cpp_quote("EXTERN_GUID(MF_DEVICEMFT_SENSORPROFILE_COLLECTION, 0x36EBDC44, 0xB12C, 0x441B, 0x89, 0xF4, 0x08, 0xB2, 0xF4, 0x1A, 0x9C, 0xFC );")

이 특성은 MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL 특성을 통해 DMFT에 제공된 IMFTransform의 특성 저장소에서 설정해야 합니다.

다음 코드 조각에서는 InitializeTransform 메서드 중 DMFT가 새 카메라 프로필을 제공하는 방법을 보여 줍니다.

이 샘플에서는 다음과 같은 몇 가지 가정해 보겠습니다.

  1. 이것은 4 핀 카메라입니다.

  2. 핀 0 – 캡처, 핀 1 – 미리 보기, 핀 2 – 사진 및 핀 3 – IR 스트림.

IFACEMETHODIMP
SampleDMFT::InitializeTransform(
    _In_ IMFAttributes *pAttributes 
    )
{
    ComPtr<IMFTransform>                spTransform;
    ComPtr<IMFAttributes>               spAttributes;
    ComPtr<IMFSensorProfileCollection>  spProfileCollection;
    ComPtr<IMFSensorProfile>            spProfile;


    if (nullptr == pAttributes)
    {
        return E_INVALIDARG;
    }

    RETURN_IF_FAILED (pAttributes->GetUnknown(MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL, 
                                              IID_PPV_ARGS(&spTransform)));
    RETURN_IF_FAILED (spTransform->GetAttributes(&spAttributes));

    // Create an empty collection...
    RETURN_IF_FAILED (MFCreateSensorProfileCollection(&spProfileCollection));

    // Create various profiles we want to publish.
    // For the legacy profile, we don't want to expose the IR stream since
    // legacy apps will not be able to consume it.
    RETURN_IF_FAILED (MFCreateSensorProfile(KSCAMERAPROFILE_Legacy, 0, nullptr, &spProfile));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(0, L"((RES==;FRT<=30,1;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(1, L"((RES==;FRT<=30,1;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(2, L"((RES==;FRT<=30,1;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(3, L"(!)"));
    RETURN_IF_FAILED (spProfileCollection->AddProfile(spProfile));
    spProfile = nullptr;

    // For the High Frame Rate recording profile, we only support 60fps or
    // higher on the record pin and any on the preview (since preview only
    // exposes 30fps).
    RETURN_IF_FAILED (MFCreateSensorProfile(KSCAMERAPROFILE_HighFrameRate, 0, nullptr, &spProfile));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(0, L"((RES==;FRT>=60,1;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(1, L"((RES==;FRT==;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(2, L"(!)"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(3, L"(!)"));
    RETURN_IF_FAILED (spProfileCollection->AddProfile(spProfile));
    spProfile = nullptr;

    // For the Face Auth, we can handle any media type on the preview but we
    // want to remove the photo and record pins and allow the IR pin to only
    // expose one media type:  VGA@60fps with L8.
    RETURN_IF_FAILED (MFCreateSensorProfile(KSCAMERAPROFILE_FaceAuth_Mode, 0, nullptr, &spProfile));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(0, L"(!)"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(1, L"((RES==;FRT==;SUT==))"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(2, L"(!)"));
    RETURN_IF_FAILED (spProfile->AddProfileFilter(3, L"((RES==640,480;FRT==60,1;SUT==L8))"));
    RETURN_IF_FAILED (spProfileCollection->AddProfile(spProfile));
    spProfile = nullptr;

    // Set the profile collection to the attribute store of the IMFTransform.
    RETURN_IF_FAILED (spAttributes->SetUnknown(MF_DEVICEMFT_SENSORPROFILE_COLLECTION, 
                                               spProfileCollection));

    // ... Reset of the InitializeTransform logic...
 }

InitializeTransform() 메서드가 반환되기 전에 연결된 IMFTransform의 특성 저장소에 MF_DEVICEMFT_SENSORPROFILE_COLLECTION 게시해야 합니다.

연결된 DMFT

디바이스 원본 내에서 여러 DMFT가 연결된 시나리오에서 카메라 프로필 게시를 담당하는 DMFT는 플랫폼 DMFT가 사용하도록 설정된 경우 DevProxy 또는 Platform DMFT에 이어 체인의 첫 번째 변환으로 IHV/OEM에 의해 구성되어야 합니다.

예를 들어 다음 토폴로지의 IHV/OEM DMFT1에서 카메라 프로필을 게시할 수 있습니다.

연결된 DM F T.

토폴로지 1 및 2에서는 DMFT1만 카메라 프로필을 게시할 수 있습니다. DMFT2에서 게시한 모든 카메라 프로필은 무시됩니다.

M-in, N-out 디바이스 MFT

디바이스 MFT에서 지원하는 기능 중 하나는 임의의 수의 입력 스트림을 사용하고 다른 수의 출력 스트림을 노출하는 기능입니다.

프로필 논리에는 프로필 필터 정보를 식별하기 위해 핀 ID가 필요하므로 핀 매핑이 일관되어야 합니다.

디바이스 MFT에서 게시한 IMFSensorProfileCollection은 DMFT의 출력 핀에 따라 핀 번호 매기기를 사용해야 합니다. 이 경우 핀 ID는 출력 핀의 특성 저장소에 표시되는 MF_DEVICESTREAM_STREAM_ID 특성과 일치해야 합니다.

핀 ID 충돌이 발생하지 않도록 DMFT는 MF_DEVICESTREAM_TRANSFORM_STREAM_ID 제거해야 합니다. MF_DEVICESTREAM_TRANSFORM_STREAM_ID DevProxy에서만 제공되고 DevProxy의 컨텍스트 내에서만 의미가 있습니다. M-in, N-out DMFT의 경우 MF_DEVICESTREAM_TRANSFORM_STREAM_ID 정의되지 않습니다.

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