Поддержка MFT устройства (профиль камеры версии 2)
В сценариях, когда изготовителям оборудования и изготовителям оборудования требуется публиковать профили камеры на основе сведений о времени выполнения (например, один набор драйверов, используемых для нескольких номеров SKU, использующих разные датчики), драйверы камеры должны реализовать MFT устройства для публикации профилей камеры.
Во время вызова Device 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 );")
Этот атрибут должен быть задан в хранилище атрибутов IMFTransform, предоставленном DMFT через атрибут MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL.
В следующем фрагменте кода показано, как DMFT во время метода InitializeTransform может предоставить новый профиль камеры.
Для этого примера давайте выберем некоторые предположения:
Это 4-контактная камера.
Закрепление 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...
}
MF_DEVICEMFT_SENSORPROFILE_COLLECTION необходимо опубликовать в подключенном хранилище атрибутов IMFTransform до возврата метода InitializeTransform().
Цепочка DMFT
В сценарии, когда несколько DMFT связаны в источнике устройства, DMFT, ответственный за публикацию профиля камеры, должен быть настроен IHV/OEM в качестве первого преобразования в цепочке после DevProxy или DMFT платформы, если платформа DMFT включена.
Например, поддерживается публикация профилей камеры из IHV/OEM DMFT1 в следующих топологиях:
В топологии 1 и 2 только DMFT1 может публиковать профили камеры. Любой профиль камеры, опубликованный DMFT2, игнорируется.
M-in, N-out Device MFT
Одна из функций, поддерживаемых MFT устройства, — возможность принимать произвольное количество входных потоков и предоставлять другое количество выходных потоков.
Так как логика профиля требует идентификатора пин-кода для идентификации сведений о фильтре профиля, сопоставление контактов должно быть согласованным.
Коллекция IMFSensorProfileCollection, опубликованная MFT устройства, должна использовать нумерирование контактов на основе выходного контакта DMFT. Идентификатор пин-кода в этом случае должен соответствовать атрибуту MF_DEVICESTREAM_STREAM_ID, представленному в хранилище атрибутов выходного пин-кода.
Чтобы избежать возможного конфликта идентификаторов контактов, DMFT должен удалить MF_DEVICESTREAM_TRANSFORM_STREAM_ID. MF_DEVICESTREAM_TRANSFORM_STREAM_ID представлено только DevProxy и имеет смысл только в контексте DevProxy. Для M-in, N-out DMFT MF_DEVICESTREAM_TRANSFORM_STREAM_ID не определен.