Поддержка MFT устройства (профиль камеры версии 2)

В случаях, когда производителям аппаратного обеспечения (IHV) и оригинальным производителям оборудования (OEM) необходимо опубликовать профили камер на основе информации о среде выполнения (например, один комплект драйверов используется для нескольких SKU, которые используют разные датчики), драйверы камеры должны реализовать Device 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 может предоставить новый профиль камеры.

Для этого примера рассмотрим некоторые предположения:

  1. Это камера с 4 контактами.

  2. Пин 0 — захват, Пин 1 — предпросмотр, Пин 2 — фотография и Пин 3 — поток ИК.

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, отвечающий за публикацию профиля камеры, должен быть настроен производителем или OEM как первая трансформация в цепочке после DevProxy или Platform DMFT, если включен Platform DMFT.

Например, публикация профилей камеры из IHV/OEM DMFT1 в следующих топологиях поддерживается:

цепной D M F T.

В топологии 1 и 2 только DMFT1 может публиковать профили камеры. Любой профиль камеры, опубликованный DMFT2, будет игнорироваться.

M-in, N-out устройство 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 не определен.

спецификация разработчика профиля камеры версии 2