デバイス MFT のサポート (カメラ プロファイル V2)
IHV/OEM がランタイム情報に基づいてカメラプロファイルを公開する必要があるシナリオ (たとえば、異なるセンサーを使用する複数の SKU に使用されるドライバーのセット) では、カメラ ドライバーは、カメラ プロファイルを発行するためにデバイス MFT を実装する必要があります。
デバイス 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 );")
この属性は、MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL属性を使用して DMFT に提供される IMFTransform の属性ストアで設定する必要があります。
次のコードは、InitializeTransform メソッド中の DMFT が新しいカメラ プロファイルを提供する方法を示しています。
このサンプルでは、いくつかの前提条件を見てみましょう。
これは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...
}
InitializeTransform() メソッドが戻る前に、MF_DEVICEMFT_Standard Edition NSORPROFILE_COLLECTIONを接続済みの IMFTransform の属性ストアに発行する必要があります。
チェーン DMFT
デバイス ソース内で複数の DMFT がチェーンされているシナリオでは、プラットフォーム DMFT が有効になっている場合、カメラ プロファイルの公開を担当する DMFT を、DevProxy または Platform DMFT に続くチェーンの最初の変換として IHV/OEM によって構成する必要があります。
たとえば、次のトポロジで IHV/OEM DMFT1 から カメラ プロファイルを発行することがサポートされています。
トポロジ 1 とトポロジ 2 では、DMFT1 のみがカメラプロファイルを発行できます。 DMFT2 によって発行されたカメラ プロファイルは無視されます。
M-in、N-out デバイス MFT
Device MFT でサポートされている機能の 1 つは、任意の数の入力ストリームを取り込み、異なる数の出力ストリームを公開する機能です。
プロファイル ロジックでは、プロファイル フィルター情報を識別するためにピン ID が必要であるため、ピン マッピングは一貫している必要があります。
デバイス MFT によって発行された IMFSensorProfileCollection では、DMFT の出力ピンに基づいて Pin 番号を使用する必要があります。 この場合の Pin ID は、出力ピンの属性ストアに表示されるMF_DEVICESTREAM_STREAM_ID属性と一致する必要があります。
ピン ID の競合を回避するには、DMFT でMF_DEVICESTREAM_TRANSFORM_STREAM_IDを削除する必要があります。 MF_DEVICESTREAM_TRANSFORM_STREAM_IDは DevProxy によってのみ提示され、DevProxy のコンテキスト内でのみ意味があります。 M-in、N-out DMFT の場合、MF_DEVICESTREAM_TRANSFORM_STREAM_IDは未定義です。