Partilhar via


Suporte do dispositivo MFT (Perfil de câmera V2)

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

Durante a chamada InitializeTransform do Device 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.

A parte de 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. Pino 0 – Captura, Pino 1 – Pré-visualização, Pino 2 – Foto e Pino 3 – Fluxo 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...
 }

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

CPOD encadeado

No cenário em que vários DMFTs estão encadeados na origem do dispositivo, o DMFT responsável pela publicação do Camera Profile deverá ser configurado pelo IHV/OEM como a primeira transformação na cadeia, após o DevProxy ou o Platform DMFT, se o Platform DMFT estiver habilitado.

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

encadeado D M F T.

Na topologia 1 e 2, somente DMFT1 pode publicar perfis de câmera. Qualquer perfil de câmera publicado pelo DMFT2 será ignorado.

M-in, N-out Dispositivo MFT

Um dos recursos suportados pelos dispositivos MFT é 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 o ID do pino para identificar as informações do filtro de perfil, o mapeamento de pinos deve ser consistente.

O IMFSensorProfileCollection publicado pelo MFT do Dispositivo deve usar a numeração dos pinos com base no pino de saída do DMFT. Neste caso, o ID do Pin deve corresponder ao atributo MF_DEVICESTREAM_STREAM_ID apresentado no armazenamento de atributos do pino de saída.

Para evitar uma possível colisão de ID de pino, o DMFT DEVE remover o MF_DEVICESTREAM_TRANSFORM_STREAM_ID. O MF_DEVICESTREAM_TRANSFORM_STREAM_ID é apresentado apenas pelo DevProxy e apenas 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 Camera Profile V2