Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
Esta é uma câmera de 4 pinos.
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:
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.