Compartilhar via


Suporte ao dispositivo MFT (Perfil de Câmera V2)

Em cenários em que os IHV/OEMs precisam publicar Perfis de Câmera com base em informações de runtime (por exemplo, um conjunto de drivers usados para várias SKUs que estão utilizando sensores diferentes), os drivers de câmera precisam implementar um Dispositivo MFT para publicar os Perfis de Câmera.

Durante a chamada InitializeTransform do Dispositivo MFT, o DMFT pode publicar Perfis de Câmera fornecendo a interface IMFSensorProfileCollection por meio do seguinte atributo:

// 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 );")

Esse atributo deve ser definido no repositório de atributos do IMFTransform fornecido ao DMFT por meio do atributo MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL.

O código a seguir ilustra como o DMFT durante o método InitializeTransform pode fornecer um novo Perfil de Câmera.

Para este exemplo, vamos fazer algumas suposições:

  1. Esta é uma câmera de 4 pinos.

  2. Pin 0 – Capture, Pin 1 – Preview, Pin 2 – Photo and Pin 3 – IR stream.

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

O MF_DEVICEMFT_SENSORPROFILE_COLLECTION deve ser publicado no repositório de atributos do IMFTransform conectado antes que o método InitializeTransform() retorne.

DMFT encadeado

No cenário em que vários DMFTs são encadeados dentro da origem do dispositivo, a DMFT responsável por publicar o Perfil da Câmera deve ser configurada pelo IHV/OEM como a primeira transformação na cadeia após DevProxy ou DMFT de plataforma se a Plataforma DMFT estiver habilitada.

Por exemplo, há suporte para a publicação de Perfis de Câmera de IHV/OEM DMFT1 nas seguintes topologias:

D M F T encadeado.

Na Topologia 1 e 2, somente o DMFT1 pode publicar Perfis de Câmera. Qualquer Perfil de Câmera publicado pelo DMFT2 será ignorado.

M-in, N-out Device MFT

Um dos recursos com suporte dos MFTs do dispositivo é a capacidade de receber um número arbitrário de fluxos de entrada e expor um número diferente de fluxos de saída.

Como a lógica de perfil requer a ID do pino para identificar as informações de filtro de perfil, o mapeamento de pino deve ser consistente.

O IMFSensorProfileCollection publicado pelo Dispositivo MFT deve usar a numeração de Pino com base no pino de saída do DMFT. Nesse caso, a ID do Pino deve corresponder ao atributo MF_DEVICESTREAM_STREAM_ID apresentado no repositório de atributos do pino de saída.

Para evitar uma possível colisão de ID de pino, a DMFT DEVE remover o MF_DEVICESTREAM_TRANSFORM_STREAM_ID. O MF_DEVICESTREAM_TRANSFORM_STREAM_ID só é apresentado pelo DevProxy e só é significativo dentro do contexto do DevProxy. Para um M-in, N-out DMFT, o MF_DEVICESTREAM_TRANSFORM_STREAM_ID é indefinido.

Especificação do desenvolvedor do Perfil de Câmera V2