次の方法で共有


IHV および OEM 向けの詳細な設計 (カメラ プロファイルV2)

新しいカメラ プロファイルV 2スキーマを理解するため、まず簡単なプロファイル宣言から始め、これを分析して、個々のセクションの理解に努めます。

新しい高フレーム レート プロファイルをサポートする仮想カメラを使用します。 まず、デバイスに対していくつかの架空のハードウェア制約を定義します。

  1. プレビューピンはピン 0 です。 カメラ ドライバーによって宣言される KSFILTER_DESCRIPTOR では、KSPIN_DESCRIPTOR_EX の配列が定義されている場合、最初の KSPIN_DESCRIPTOR_EX がプレビュー ピンの記述子になります。 同様に、ピン 1 はキャプチャー ピン、ピン 2 は写真ピンです。

  2. ハードウェアの制限により、該当のデバイスは 60 fps 以上のフレーム レートでのスケーリングを処理できません。 したがって、プレビュー ストリームとキャプチャ ストリームの両方に同じ解像度が必要です。

  3. 同様に、デバイスでは 60 fps 以上の色空間変換も処理できません。そのため、サブタイプはプレビューとキャプチャの間で同じである必要があります。

  4. カメラは 4K 16x9 ビデオを 60 fps でストリーミング可能です。 カメラは 3840x2880@60fps (60 fps で 4:3 ビデオ) も可能です 。

  5. カメラは60 fps で動作している場合、写真操作を提供することができません。

  6. 高フレーム レート プロファイルに加えて、ビデオ録画プロファイルを宣言します。

  7. ビデオ録画プロファイルにより、メディア タイプを任意に組み合わせることができます。ただし、30 fps を超えるメディア タイプはできません。

  8. ビデオ録画プロファイルでは、単一の写真操作 (写真シーケンス以外など) もサポートされています。

INF ベースの宣言では、DDInstall.Interfaces セクションで、AddReg ディレクティブを使用してプロファイル情報を発行します。

すべてのピン メディア タイプ フィルターには、レジストリ エントリ名を割り当てる必要があります。 この名前は MTF# でなければならず、# は整数値を表します。 整数値は、OS レジストリ内の名前付き値を表すので、単に一意である必要はありません。

これらの制約を考えると、次のプロファイルを宣言できます。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;VPS;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

OEMCameraProfileVersion

カメラ プロファイル V2 のサポートを有効にするには、プロファイルのバージョンを宣言します。

OEMCameraProfileVersion エントリは、プロファイルのバージョンを定義し、仕様のこのリビジョンでは、2 である必要があります。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2

OEMCameraProfileVersion レジストリ エントリが存在せず、OEMCameraProfile エントリが存在する場合、パイプラインはカメラ プロファイル 1507 スキーマにフォールバックします。

これにより、既存のカメラ プロファイルとの下位互換性が確保されます。

OEMCameraProfileVersion エントリが使用可能な場合、既存の カメラ プロファイル 1507 情報はすべて無視され、カメラ プロファイル V2 のみが処理されます。

注記: OEMCameraProfileVersion エントリが 2 に設定されていても、カメラ プロファイル V2 宣言が見つからなければ、プロファイルは発行されません。

宣言したら、すべてのプロファイルをデバイス インターフェイス ノードのプロファイル レジストリ キーの下に保存する必要があります。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"

各プロファイルは、プロファイル ID を使用するプロファイル キーの下のサブキーである必要があります。

プロファイル ID は、プロファイル タイプ、プロファイル インデックスの組み合わせです。

プロファイル タイプには、次のいずれかの文字列を指定するか、{GUID} 文字列を指定できます。

  • KSCAMERAPROFILE_VideoRecording

  • KSCAMERAPROFILE_HighQualityPhoto

  • KSCAMERAPROFILE_BalancedVideoAndPhoto

  • KSCAMERAPROFILE_VideoConferencing

  • KSCAMERAPROFILE_PhotoSequence

  • KSCAMERAPROFILE_FaceAuth_Mode

  • KSCAMERAPROFILE_HighFrameRate

  • KSCAMERAPROFILE_HDRWithWCGVideo

  • KSCAMERAPROFILE_HDRWithWCGPhoto

  • KSCAMERAPROFILE_VariablePhotoSequence

  • KSCAMERAPROFILE_VideoHDR8

プロファイル インデックスには、0 ~ 0x7FFFFFFF の任意の値を指定できます。 上位ビットがセットされたインデックス値は、内部使用のために予約されています。

カメラ プロファイル V2 の基礎は、次の 2 つのメイン スキーマ エントリに分類されます。

  • プロファイル制約

  • ピン メディア タイプ フィルター

プロファイル制約

プロファイル制約は、ピン メディア タイプ フィルターの処理に影響を与えるプロファイル全体の宣言です。 これらは、サポートされている 6 つのタグです。 「;」で区切られた任意の順序で表示できます。

プロファイル制約 説明
LRS すべてのピンの解像度をロックします。 プロファイルで宣言されているすべてのピンは、アクティブなときに同じ解像度になる必要があります。
LFR すべてのピンでフレーム レートをロックします。 プロファイルで宣言されているすべてのピンは、アクティブなときに同じフレーム レートになる必要があります。
LST すべてのピンでサブタイプをロックします。 プロファイルで宣言されているすべてのピンは、アクティブなときに同じサブタイプになる必要があります。
AAR すべての縦横比にピン レベル プロファイル宣言を適用します。

解像度ベースのフィルター処理は、解像度の幅 * 高さの積を使用して行われ、その積は比較の値として使用されます。 ただし、AAR タグが設定されていない場合、この比較は同じ縦横比の解像度に対してのみ行われます。
DIS 無効。 この制約がプロファイル制約に使用されている場合、ピン メディア タイプ フィルターは無視され、無効なプロファイル構文として扱われます。

このタグは、他のプロファイル制約タグと組み合わせられない場合があります。
UAR ピン間の解像度縦横比の任意の組み合わせを許可します。

デフォルトでは、ピン間の縦横比は同じである必要があります。 このタグは、そのデフォルトの制約を排除します。

注記: アプリケーションは、使用可能なピン全体で同じ縦横比を維持することが推奨されます。

プロファイル宣言で UAR タグが設定されていない場合は、ピン間のすべての縦横比が同じである必要があります。 具体的には、16:9 でのキャプチャ ピンからの写真の撮影またはストリーミング中の 4:3 のストリーミング プレビューはサポートされていません。 これを試みると、エラーが発生します。

上記のサンプル プロファイルの処理:

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"

このプロファイル制約は、[KSCAMERAPROFILE_HighFrameRate,0] プロファイルの場合は、すべてのピンの解像度とサブタイプが同じである必要があることを示しています。 これは、仮定のカメラの HW 制約と一致します (60 fps 以上で実行する場合、スケーリング/色空間変換は行われません)。

エンコーダーの制約

オプションのプロファイル制約のセットには、ビデオ エンコード操作用のプロファイルを選択するアプリケーションに推奨されるエンコーダー パラメーターが含まれている場合があります。 たとえば、IHV/OEM では、メディア タイプが解像度やフレーム レートの面で事前に定義されたしきい値を超えた場合に、H264 経由で HEVC を使用することを選択できます。

さらに、コンピューターに存在する HW エンコーダーは、エンコード パラメーターを使用して構成すると、より最適な操作を実現できる可能性があります。そのため、OEM は、アプリケーションに対してより多くの「ヒント」を持つプロファイルを作成することを選択できます。

このサポートを容易にするために、次の制約を任意のプロファイルに追加できます。

優先エンコード サブタイプ

次のサブタイプの一覧は、エンコーダーの優先エンコード サブタイプです。

  • eSPSubtype_H264

  • eSPSubtype_HEVC

これら 2 つのオプションを同時に使用することはできません。 宣言できるのは 1 つのみです。 両方を宣言すると、無効なプロファイルが生成され、拒否されます。

優先エンコード サブタイプ制約が宣言されている場合、IMFSensorProfile の MF 属性ストアは、宣言された優先エンコード サブタイプを MF_MT_SUBTYPE 属性で公開します。

優先エンコーダー プロファイル

次の優先エンコーダー プロファイルの一覧は、eAVEncH264VProfile リストに対応します。

  • eSPProfile_Simple

  • eSPProfile_Base

  • eSPProfile_Main

  • eSPProfile_High

  • eSPProfile_422

  • eSPProfile_High10

  • eSPProfile_444

  • eSPProfile_Extended

  • eSPProfile_ScalableBase

  • eSPProfile_ScalableHigh

  • eSPProfile_MultiviewHigh

  • eSPProfile_StereoHigh

  • eSPProfile_ConstrainedBase

  • eSPProfile_UCConstrainedHigh

  • eSPProfile_UCScalableConstrainedBase

  • eSPProfile_UCScalableConstrainedHigh

  • eSPProfileH265_Main_420_8

  • eSPProfileH265_Main_420_10

  • eSPProfileH265_Main_420_12

  • eSPProfileH265_Main_422_10

  • eSPProfileH265_Main_422_12

  • eSPProfileH265_Main_444_8

  • eSPProfileH265_Main_444_10

  • eSPProfileH265_Main_444_12

  • eSPProfileH265_Monochrome_12

  • eSPProfileH265_Monochrome_16

  • eSPProfileH265_MainIntra_420_8

  • eSPProfileH265_MainIntra_420_10

  • eSPProfileH265_MainIntra_420_12

  • eSPProfileH265_MainIntra_422_10

  • eSPProfileH265_MainIntra_422_12

  • eSPProfileH265_MainIntra_444_8

  • eSPProfileH265_MainIntra_444_10

  • eSPProfileH265_MainIntra_444_12

  • eSPProfileH265_MainIntra_444_12

  • eSPProfileH265_MainStill_420_8

  • eSPProfileH265_MainStill_444_8

  • eSPProfileH265_MainStill_444_16

上記の優先エンコーダー プロファイル宣言は相互に排他的です。 宣言できるのは 1 つのみです。 複数のプロファイルを宣言すると、無効なプロファイルが生成され、拒否されます。

優先エンコーダー プロファイル制約を宣言すると、IMFSensorProfile の MF 属性ストアは、MF_MT_MPEG2_PROFILE 属性とともに、宣言された優先エンコーダー プロファイルを公開します。

注記: eSPProfileH265 プロファイルは、HEVC でエンコードされたサブタイプに対してのみ有効です。

推奨 BFrame カウント制約により、エンコードされたビデオの推奨 B フレーム数を OEM が示すことができるようになります。

  • eSPBFCount_X

ここで、X は BFrame カウントを表します。たとえば、eSPBFCount_0 は 0 B フレーム カウントを示します。

推奨 BFrame カウント制約が宣言されると、IMFSensorProfile の MF 属性ストアは、宣言された推奨 BFrame カウントを CODECAPI_AVEncMPVDefaultBPictureCount 属性とともに公開します。

推奨ビット レート制約により、OEM が平均エンコード ビット レート (適切なエンコード レート制御モードを使用する場合) と最大ビット レートの両方を指定することができるようになります。

  • eSPBitRate_XXXXX

  • eSPMaxBitRate_XXXXX

これら 2 つの制約は、個別あるいは一緒に指定できます。 XXXXX はビット レートを Kbps 単位で表します。 たとえば、eSPBitRate_5000 は 5,000,000 ビット/秒を表します。

OEM によって指定された eSPBitRate_XXXXX は、CODECAPI_AVENCCOMMONMEANBITRATE 属性を介して IMFSensorProfile の MF 属性ストアを介して公開されます。

OEM によって指定されると eSPBitRate_XXXXX は、CODECAPI_AVENCCOMMONMEANBITRATE 属性を介して IMFSensorProfile の MF 属性ストアから公開されます。

サンプル エンコーダー制約

次のサンプル INF は、OEM がどのようにエンコーダー制約を宣言しているのかを示しています。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","Constraint",0,"eSPSubtype_HEVC;eSPProfile_Main;eSPBFCount_1;eSPBitRate_20000;eSPMaxBitRate_50000"

上記のエンコーダー制約の例では、次のようにさまざまなエンコーダー属性を含む、KSCAMERAPROFILE_VideoRecording,0 プロファイルの IMFSensorProfile (以下の API の説明を参照) MF 属性ストアが生成されます。

HRESULT
CheckEncoderParameters(
    _In_ IMFSensorProfile* pProfile
    )
{
    HRESULT hr = S_OK;
    ComPtr<IMFAttributes> spAttributes;
    GUID guidSubtype = GUID_NULL;
    UINT32 eProfile = eAVEncH264VProfile_unknown;
    UINT32 uiBFrameCount = 0;
    UINT32 uiBitRate = 0;
    UINT32 uiMaxBitRate = 0;

    if (nullptr == pProfile)
    {
        return E_INVALIDARG;
    }

    RETURN_IF_FAILED (pProfile->QueryInterface(IID_PPV_ARGS(&spAttributes)));
    if (SUCCEEDED(spAttributes->GetGUID(MF_MT_SUBTYPE, &guidSubtype)))
    {
        if (guidSubtype == MFVideoFormat_HEVC)
        {
            // Use HEVC codec.
        }
        else
        {
            // Use H264 codec.
        }
    }
    if (SUCCEEDED(spAttributes->GetUINT32(MF_MT_MPEG2_PROFILE, &eProfile)))
    {
        // Use the eProfile provided for encoder profile.
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncMPVDefaultBPictureCount, &uiBFrameCount)))
    {
        // This is the BFrame count...
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMeanBitRate, &uiBitRate)))
    {
        // This is the average bit rate...
    }
    if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMaxBitRate, &uiMaxBitRate)))
    {
        // This is the max bit rate...
    }

    return hr;
}

WinRT API サーフェイスでは、これらの同じ属性を CameraProfile.Properties を使用して取得できます (以下の WinRT API の説明を参照)。

ブロックされたコントロール

ブロックされたコントロールを使用すると、OEM/IHV は、選択したプロファイルに基づいて特定のカメラ コントロールを選択的に無効にすることができます。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;PHSEQ;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"

上の例では、KSCAMERAPROFILE_HighFrameRate,0 が、ビデオ HDR (VHDR)、フォト シーケンス (PHSEQ)、カスタム コントロール (KSPROPERTY.Set = {E0766E84-36A2-4945-906D-092ECBD87445}およびKSPROPERTY.Id = 2)、そして Pin1 でのウォーム スタートがサポートされていないことを宣言しています。

このプロファイルを選択すると、パイプラインは、これらのコントロールが DMFT/カメラ ドライバーに発行されないように明示的にブロックします。 これにより、DMFT/カメラ ドライバーは、すべてのカメラ コントロールのサポートを公開します。また、パイプラインによって、カメラ プロファイルを使用するアプリケーションがブロックされたコントロールにタッチしないようにします。

ブロックされたコントロールは、定義されたカメラ コントロールに対して以下のいずれかのタグを使用して定義することや、{GUID},Id 形式を使用することもできます。

Tag コントロールの説明
PHSEQ 拡張カメラ コントロール - フォト シーケンス

注記: フォト シーケンスをブロックすると、可変フォト シーケンスもブロックされます。
WARM# 拡張カメラコントロール - ウォーム スタート コントロール。

# は、ウォーム スタート コントロールを無効にする Pin ID を表します。
シーン 拡張カメラ コントロール - シーン モード。
トーチ 拡張カメラ制御 - トーチ モード。
フラッシュ 拡張カメラ コントロール - フラッシュ モード。
ISO 拡張カメラ コントロール - ISO
EVCOMP 拡張カメラ コントロール - EV 補正
WBAL 拡張カメラ コントロール - ホワイト バランス
EXPOS 拡張カメラ コントロール - 露出
フォーカス 拡張カメラ コントロール - フォーカス
ROI 拡張カメラ コントロール - ROI
EXTZOOM 拡張カメラ コントロール - ズーム
ADVISO 拡張カメラ コントロール - ISO 詳細
VIDST 拡張カメラ コントロール - Video Stabilization
FACEDT 拡張カメラ コントロール - 顔検出
VHDR 拡張カメラ コントロール - ビデオ HDR
OIS 拡張カメラ コントロール - 光学式手ブレ補正
ADVPHOTO 拡張カメラ コントロール - アドバンスド フォト
FACEAUTH 拡張カメラ コントロール - 顔認証
安全 拡張カメラ コントロール - セキュア モード
VFP 拡張カメラ コントロール - VFR

拡張カメラ コントロールに加えて、プロファイルは PROP Standard Edition TID_VIDCAP_VIDEOPROCAMP および PROP Standard Edition TID_VIDCAP_CAMERACONTROL コントロール セットの下のレガシ コントロールをブロックすることもできます。 PROPSETID_VIDCAP_VIDEOPROCAMP コントロールは、次を使用してブロックできます。

VIDPROC#

ここで、# はコントロール ID を表します。

KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS // 0
KSPROPERTY_VIDEOPROCAMP_CONTRAST // 1
KSPROPERTY_VIDEOPROCAMP_HUE // 2
KSPROPERTY_VIDEOPROCAMP_SATURATION // 3
KSPROPERTY_VIDEOPROCAMP_SHARPNESS // 4
KSPROPERTY_VIDEOPROCAMP_GAMMA // 5
KSPROPERTY_VIDEOPROCAMP_COLORENABLE // 6
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE // 7
KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION // 8
KSPROPERTY_VIDEOPROCAMP_GAIN // 9
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER // 10
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER_LIMIT // 11
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT // 12
KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY // 13

たとえば、VIDPROC13 は電源ライン周波数コントロールをブロックします。

同様に、PROPSETID_VIDCAP_CAMERACONTROL は次のようにブロックできます。

CAMCTRL#

ここで、# はコントロール ID を表します。

KSPROPERTY_CAMERACONTROL_PAN // 0
KSPROPERTY_CAMERACONTROL_TILT // 1
KSPROPERTY_CAMERACONTROL_ROLL // 2
KSPROPERTY_CAMERACONTROL_ZOOM // 3
KSPROPERTY_CAMERACONTROL_EXPOSURE // 4
KSPROPERTY_CAMERACONTROL_IRIS // 5
KSPROPERTY_CAMERACONTROL_FOCUS // 6
KSPROPERTY_CAMERACONTROL_SCANMODE // 7
KSPROPERTY_CAMERACONTROL_PRIVACY // 8
KSPROPERTY_CAMERACONTROL_PANTILT // 9
KSPROPERTY_CAMERACONTROL_PAN_RELATIVE // 10
KSPROPERTY_CAMERACONTROL_TILT_RELATIVE // 11
KSPROPERTY_CAMERACONTROL_ROLL_RELATIVE // 12
KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE // 13
KSPROPERTY_CAMERACONTROL_EXPOSURE_RELATIVE // 14
KSPROPERTY_CAMERACONTROL_IRIS_RELATIVE // 15
KSPROPERTY_CAMERACONTROL_FOCUS_RELATIVE // 16
KSPROPERTY_CAMERACONTROL_PANTILT_RELATIVE // 17
KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH // 18
KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY // 19

ピン メディア タイプ フィルター

サンプル プロファイルに移動すると、高フレーム レート プロファイルのピン メディア タイプ フィルターが表示されます。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

上記のセクションでは、高フレーム レート プロファイルの Pin0 (プレビュー ピン) で、ピンで使用可能な任意の解像度/フレーム レートを許可しています。 この架空のデバイスでは、ドライバーはプレビュー ピンのフレーム レートが 30 fps を超えることはありません。

INF を使用して宣言された場合のピン番号は、AVStream ミニ ポート ドライバーがアドバタイズする KSFILTER_DESCRIPTOR 構造体で定義されている KSPIN_DESCRIPTOR_EX 構造体の 0 から始まるインデックス序数に対応します。

ピン メディア タイプ フィルターと、対応するフィルター セットを解釈するには、構文スキーマを定義する必要があります。

この文字列定義では、次のピン メディア タイプ フィルター スキーマを使用します。 [] が表示されているところでは、含まれる文字列は省略可能です。それ以外の場合は、構文で宣言されているすべての文字列が必須です (制約構文では大文字と小文字が区別されません)。

PinMediaTypeFilter     : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet              : [!](ResolutionFilter;FrameRateFilter;FourCCFilter)
Resolution             : RES[==|<=|>=|!=]Width,Height
FrameRate              : FRT[==|<=|>=|!=]Num,Denom
Subtype                : SUT[==|!=]SubtypeValue
SubtypeValue           : <See below>

SubtypeValue は、単一の 16 進数での 4 つの CC 値の表現 (例: 0x3231564E == NV12)、カスタム メディア タイプの場合の {GUID} (開閉の中括弧が必要で、GUID は{55D24460-45B7-450E-829B-91A94FF84180} の形を取る必要があります)、または既知のタグ (NV12、YUY2 など)のいずれかの形式を取ることができます。

既知のサブタイプに一覧のタグがない場合は、{GUID} 表現を MFVideoFormat_* サブタイプにも使用できます。

この例では次のようになります。

Pin0:((RES==;FRT==;SUT==ALL))

解析の結果:

Resolution  : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate  : Ignore all frame rate checks (implies all frame rates are allowed)
Subtype     : All

これは意味的には、「すべてのメディアの種類を許可する」となります。

個々の解像度、フレーム レート、サブタイプのタグの定義は、後述の「フレーム レート フィルター」を参照してください。

Pin1 (キャプチャ ピン) の場合、フレーム レート宣言の値は異なります。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

解析の結果:

Resolution  : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate  : Equal or greater than 60,1
Subtype     : All

Pin1 のこのプロファイルでは、フレーム レートが 60 fps 以上のメディア タイプのみが許可されます。

Pin2 (フォト ピン) は使用できません。

[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"

構文が示すように、必要に応じて、ピン メディア タイプ フィルターは単一の (!) 宣言にすることができます。これは、そのピンに対することを意味します。サポートされているメディア形式はありません (サポートされているメディア タイプのないピンはクライアントに非表示になります)。

この場合も、仮想カメラは、ビデオ録画と高フレーム レートの両方のシナリオで同時実行が保証されるメディアタイプのみで 30 fps プレビューのみを公開するため、プレビュー ピンに制約はありません。

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

ただし、キャプチャ ピンの場合、プレビューとキャプチャ、または写真操作の間で異なる解像度でより高いフレーム レートをサポートできないため、メディア タイプを 30 fps に制限する必要があります。

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

これは、フレームレートが 30 fps 以下であることを指定する「フレームレート等しいまたはそれ以下のタグ (FRT<=)」を使用して行われます。

Pin1:((RES==;FRT<=30,1;SUT==ALL))

解析の結果:

Resolution    : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate    : Equal or less than 30,1
Subtype       : All

フォト ピンの場合は、禁止するコントロールとして PH Standard Edition Q を使用して BlockedControls を宣言することで、フォト シーケンスのサポートを宣言しません。

; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"

フィルターセット

前のセクションでは、いくつかのフィルター セットを見て、これらのスキーマ文字列の一部が表す内容について説明しました。 この時点で、さらに詳しく説明するために、フィルター セットのスキーマ構文を記述する必要があります。

各フィルター セットは、解像度、フレーム レート、サブタイプの特定の宣言セットで構成されます。 この 3 組の宣言は、指定された順序で、有効なフィルター セットに必要です。

ピン メディア タイプ フィルターは、複数のフィルター エントリで構成される場合があります。

PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet          : [!](ResolutionFilter;FrameRateFilter;SubtypeFilter)

フィルター セットがこのスキーマを満たしていない場合、プロファイル宣言全体が拒否されます。

すべてのプロファイル スキーマ文字列では大文字と小文字が区別されません。

各フィルターは「;」で区切られ、解像度フィルター、フレーム レート フィルター、およびサブタイプ フィルターの 3 組は開閉の丸括弧で囲まれなければなりません。

フィルター セットの別の例:

; Allow only 1080p@60fps for any media subtype.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))

; Allow either 1080p@60fps or 1080p@120fps for any subtype but nothing else.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))((RES==1920,1080;FRT==120,1;SUT==ALL))

上の 2 番目の例に示すように、ピンの複数のフィルター セットの比較は、2 つのフィルター セットの論理 OR で行われます。 たとえば、メディア タイプが 2 つのフィルター セットのいずれかに一致する場合は、許可されます。

注記: 宣言の読み取り機能を支援するため、フィルター セットは複数行で記述できます。 これを行うには、グループ化するために同じ Pin# が必要です。

; Allow only 1080p@60fps or 1080p@120fps
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
Pin0:((RES==1920,1080;FRT==120,1;SUT==ALL))

上記の宣言と意味的に同じです。 ただし、各行には一意の MTF# エントリが必要です。

Disabled Pin

解像度フィルター

ドキュメント用語で定義されているように、解像度フィルターは、IMFMediaType の MF_MT_FRAME_SIZE 属性に基づいてフィルター処理する方法を定義します。

解像度フィルターの構文:

Resolution : RES[==|<=|>=|!=]Width,Height

解像度フィルター属性

解像度フィルター属性は RES 文字列を使用します。 この文字列では、大文字と小文字が区別されません。

解像度フィルターの比較演算子

サポートされている演算子は以下の通りです。

比較演算子 説明
== 解像度が、宣言された解像度と等しいかどうかを許可します。

フィルター セットが除外フィルター セットの場合、この解像度が、宣言された解像度と等しい場合は、このタグは許可されません。

注記: 宣言で == 演算子を使用し、フィルター値が空の場合 (RES==;) などの場合、MF_MT_FRAME_SIZE 属性は無視されます。
<= 解像度が、宣言された解像度以下の場合に許可します。

解像度の比較は、合計ピクセル数 (幅 *高さの積) と縦横比に基づいて行われます。

AAR がプロファイル制約で宣言されている場合、合計ピクセル数はすべての縦横比に適用されます。 それ以外の場合は、縦横比のみが一致します。

フィルター セットが除外フィルター セットの場合、この解像度が、宣言された解像度以下の場合は、このタグは許可されません。
>= 解像度が、宣言された解像度以上の場合に許可します。

解像度の比較は、合計ピクセル数 (幅 *高さの積) と縦横比に基づいて行われます。

AAR がプロファイル制約で宣言されている場合、合計ピクセル数はすべての縦横比に適用されます。 それ以外の場合は、縦横比のみが一致します。

フィルター セットが除外フィルター セットの場合、この解像度が、宣言された解像度以上の場合は、このタグは許可されません。
!= 解像度が、宣言された解像度と等しくない場合に許可します。

フィルター セットが除外フィルター セットの場合、この解像度が、宣言された解像度と等しくない場合は、このタグは許可されません。

解像度フィルター値

解像度フィルター値の幅と高さは、空白のないコンマ (,) で区切られた 10 進形式にする必要があります。

; 1080p only.
RES==1920,1080

次のような例です。

; 1080p and any lower resolution.
RES<=1920,1080

AAR タグがプロファイル制約で宣言されていない場合、16:9 の解像度のみが 1080p 以下に一致します。 ただし、AAR が宣言されている場合は、高さ * 幅の積が (1920 * 1080 = 2073600) 以下のすべての解像度と一致します。

次に例を示します。

  • AAR が宣言されていない場合、このエントリは 720p と一致しますが、1280x960 とは一致しません。

  • AAR が宣言されている場合、このエントリは 720p、1280x960、およびすべての低解像度と一致します。

16:9 と 4:3 の両方の縦横比で選択的解像度が一致するように AAR が宣言されていない場合は、複数のフィルター セットを使用できます。

; This will match any 16:9 resolution of 1080p or lower
; and match any 4:3 resolution of 800x600 or lower.
; Effectively skipping 1280x960.
((RES<=1920,1080;FRT==;SUT==ALL))((RES<=800,600;FRT==;SUT==ALL))

すべての解像度に一致するには、0,0 以上を指定します

; Match all resolutions.
RES>=0,0

フレーム レート フィルター

ドキュメント用語で定義されているように、フレーム レート フィルターは、IMFMediaType の MF_MT_FRAME_RATE 属性に基づいてフィルター処理する方法を定義します。

フレーム レート フィルターの構文:

FrameRate : FRT[==|<=|>=|!=]Num,Denom

フレーム レート フィルター属性

フレーム レート フィルター属性は、FRT 文字列を使用します。 この文字列では、大文字と小文字が区別されません。

フレーム レート フィルターの比較演算子

サポートされているフレーム レート タグは次のとおりです。

比較演算子 説明
== フレーム レートが、宣言されたフレーム レートと等しいかどうかを指定します。

フィルター セットが除外フィルター セットの場合、フレーム レートが、宣言されたフレーム レートと等しい場合、このタグは許可されません。

注記: 宣言で == 演算子を使用し、フィルター値が空の場合 (FRT==;) などの場合、MF_MT_FRAME_RATE 属性は無視されます。
<= フレーム レートが、宣言されたフレーム レート以下かどうかを指定します。

フィルター セットが除外フィルター セットの場合、フレーム レートが、宣言されたフレーム レート以下の場合、このタグは許可されません。
>= フレーム レートが、宣言されたフレーム レート以上かどうかを指定します。

フィルター セットが除外フィルター セットの場合、フレーム レートが、宣言されたフレーム レート以上の場合、このタグは許可されません。
!= フレーム レートが、宣言されたフレーム レートと等しくない場合にのみ許可します。

フィルター セットが除外フィルター セットの場合、フレーム レートが、宣言されたフレーム レートと等しくない場合、このタグは許可されません。
; Allow 30fps.
FRT==30,1

; Allow 30fps or lower.
FRT<=30,1

; Allow 60fps or higher.
FRT>=60,1

; Match for all frame rate.
FRT>=0,0

FRT==;、FRT>=0,0 には微妙な意味の違いがあります。

FRT==; : Ignore all frame rate checks for the Filter Set.

FRT>=0,0 : Match any frame rate.

FRT==; と FRT>=0,0 の違いは、包含フィルター セットと除外フィルター セットの両方で同じ意味を持ちます。 一方、FRT>=0,0 の意味は、それが包含フィルター セットか除外フィルター セットかによって変わります。

除外フィルター セットの説明は、「フィルター セット」を参照してください。

サブタイプ フィルター

サブタイプ フィルターは、IMFMediaType のMF_MT_SUBTYPE 属性に基づいてフィルター処理する方法を定義します。

サブタイプ フィルターの構文:

Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See Below>

サブタイプ フィルター属性

解像度フィルター属性は SUT 文字列を使用します。 この文字列では、大文字と小文字が区別されません。

サブタイプ フィルター比較演算子

次の比較演算子がサポートされています。

比較演算子 説明
== サブタイプが、宣言されたサブタイプと等しいかどうかを許可します。

フィルター セットが除外フィルター セットの場合、このサブタイプが、宣言されたサブタイプと等しい場合は、このタグは許可されません。

注記: 宣言で == 演算子を使用し、フィルター値が空の場合 (FRT==;) などの場合、MF_MT_SUBTYPE 属性は無視されます。
!= サブタイプが、宣言されたサブタイプと等しくない場合に許可します。

フィルター セットが除外フィルター セットの場合、このサブタイプが、宣言されたサブタイプと等しくない場合は、このタグは許可されません。

サブタイプフィルターにおいては、「等しいまたはそれ以下 (<=)」および「等しいまたはそれ以上 (>=)」の演算子はサポートされていません。 宣言されている場合、プロファイルは無効であり、パイプラインによって拒否されます。

サブタイプ フィルター値

サブタイプ フィルター値は、4 つの CC 値の 16 進数表現、カスタム メディアの種類 (既知の MFVideoFormat サブタイプ GUID も使用できる) または既知のサブタイプ タグ (以下の一覧を参照) を使用する場合の GUID 文字列宣言です。

; Match any media type which has NV12 subtype
SUT==0x3231564E
; Same as above…
SUT=={3231564E-0000-0010-8000-00AA00389B71}
; Still the same (and the recommended declaration).
SUT==NV12

; Allow any subtype except for NV12
SUT!=0x3231564E
; Another way to say the same thing
SUT!={3231564E-0000-0010-8000-00AA00389B71}
; Yet another (and recommended).
SUT!=NV12

; Valid syntax. Profile allow/disallow should ignore
; the subtype and only check against resolution and
; frame rate.
SUT==;

値 0/GUID_NULL と ALL には特別な意味があります。

「4 つすべての CC 値」を意味します。

; Match all subtypes
SUT==0
; Another way to say the same thing
SUT=={00000000-0000-0000-0000-000000000000}
; Yet another (and recommended).
SUT==ALL

SUT==;と SUT==0 の意味は微妙に異なります。

包含フィルターで使用すると、任意のサブタイプを許可と同じ効果があります。 ただし、除外フィルターで使用する場合、SUT==0 は、すべてのサブタイプを除外します。 ただし、これはピン全体を無効 (!) としてマークするのと同じ効果があるため、除外フィルターで SUT==0 を使用する理由はありません。

既知のサブタイプ タグ

タグ
RGB32
ARGB32
RGB24
L8
L16
D16
AI44
AYUV
YUY2
YVYU
YVU9
UYVY
NV11
NV12
YV12
I420
IYUV
Y210
Y216
Y410
Y416
Y41P
Y41T
Y42T
P210
P216
P010
P016
V210
V216
V410
MP43
MP4S
M4S2
MP4V
WMV1
WMV2
WMV3
WVC1
MSS1
MSS2
MPG1
DVSL
DVSD
DVHD
DV25
DV50
DVH1
DVC
H264
H265
MJPG
420O
HEVC
HEVS
VP80
VP90
ORAW
H263
VP10
AV01
JPEG

除外フィルター セット

これまでのフィルター セットの例はすべて、包括的フィルター エントリです。 「メディア タイプが条件を満たしている場合は、クライアントがメディア タイプを使用できるようにする」という意味です。

ディスカッションに含まれていないのは、「メディア タイプが条件を満たしている場合、メディア タイプがクライアントで使用できないようにする」と同じです。

そのためには、除外フィルター セットが必要です。

このフィルター セットの前に「!」がある場合:

; Allow everything except 1080p@60fps of any subtype.
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))

これは除外フィルター セットです。 メディア タイプが一致する場合、除外フィルター セットは使用可能なメディアの種類の一覧から除外されます。

複数のフィルター セットを宣言すると、各フィルター セットの制約チェックが互いに論理的に OR にされます。

; Allow everything except 1080p@60fps or 1080p@120fps
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))(!(RES==1920,1080;FRT==120,1;SUT==))

除外と包含フィルター セット

次に示すように、フィルター セットには、包含フィルター セットまたは除外フィルター セットを指定できます。 異なるフィルター セットの混在は許可されますが、追加されるフィルター セットの種類によっては、ピン メディア タイプ フィルターの意味が変わる場合があります。

  1. ピン メディア タイプ フィルターに対して包含フィルター エントリのみが宣言されている場合、いずれかのフィルター エントリに一致しないメディア タイプは、使用可能なメディア タイプから除外されます。

  2. ピン メディア タイプ フィルターに対して除外フィルター エントリのみが宣言されている場合、いずれかのフィルター エントリに一致しないメディア タイプは、使用可能なメディア タイプから含められます。

  3. ピン メディア タイプ フィルターに対して包含フィルターエントリと除外フィルター エントリの両方が宣言されている場合は、除外フィルター セットと一致しない限り、包含フィルター セットに一致するメディアの種類が含まれます。 除外フィルター セットは、包含フィルター セットよりも優先されます。

この例を示すために、Pin0 の場合、次の種類のメディアを使用できるものとします。

  • 1920x1080@60fps、NV12

  • 1920x1080@30fps、NV12

  • 1280x720@60fps、NV12

  • 1280x720@30fps、NV12

  • 640x360@60fps、NV12

  • 640x360@30fps、NV12

包含フィルター セットのみを宣言する場合:

; Allow all media types 720p and lower resolution whose frame
; rate is 30fps or lower. for example, no 60fps is allowed and no
; 1080p is allowed.
Pin0:((RES<=1280,720;FRT<=30,1;SUT==ALL))

除外フィルター セットのみを宣言する場合:

; Disallow 1080p resolutions or higher or any media types with
; 60fps or higher. Ignore Subtypes.
Pin0:(!(RES>=1920,1080;FRT>=60,1;SUT==))

包含フィルター セットと除外フィルター セットの両方を宣言する場合:

; Allow all media types except for 640x360@60fps NV12.
Pin0:((RES<=1920,1080;FRT<=60,1;SUT==ALL))
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))

注記: フィルター処理ステートメントのルール #2 のため、サンプル Pin0 の最後の例として、「640x360@60fps NV12 を除くすべてのメディア タイプを許可する」があります。

; Allow all media types except for 640x360@60fps NV12.
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))

除外フィルター セットが 1 つだけ存在するため、除外フィルター セットに一致するメディア タイプを除き、すべてのメディア タイプが許可されます。

包含フィルター エントリと除外フィルター エントリを示すために、いくつかの例を示します。

; Allow any media type that is 30fps.
Pin0:((RES==;FRT==30,1;SUT==ALL))

; Allow any media type that is NV12.
Pin0:((RES==;FRT==;SUT==0x3132564E))

; Allow any media type, except for 4K@60fps of any subtype.
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==))

; Allow any media type less than equal to 4K resolution,
; except for YUY2 subtypes.
Pin0:((RES<=3840,2160;FRT>=0,0;SUT==ALL))
Pin0:(!(RES==;FRT==;SUT==YUY2))

; Allow any media type equal or less than 4K
; and equal or less than 60fps
Pin0:((RES<=3840,2160;FRT<=60,1;SUT==ALL))

; Allow any NV12 and YUY2 media types
Pin0:((RES==;FRT>=0,0;SUT==NV12))((RES==;FRT>=0,0;SUT==YUY2))

; Allow any except for MJPG and H264
Pin0:((RES==;FRT>=0,0;SUT!=MJPG))((RES==;FRT>=0,0;SUT!=H264))

; Allow any but exclude only 4K@60fps NV12 & 3840x2880@60fps NV12
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==NV12))(!(RES==3840,2880;FRT==60,1;SUT==NV12))

カメラプロフィールV2開発者仕様