内部カメラの位置の特定 (UWPデバイス アプリ)
このトピックでは、Windows 8.1 のシステムで内部カメラをサポートする方法について説明します。 組み込みカメラが UWP アプリで正しく動作するように、カメラの物理的な場所を特定する方法について説明します。 UWP デバイス アプリでカメラが動作するようにモデル ID を設定する方法についても説明します。 UWP デバイス アプリ全般の詳細については、「UWP デバイス アプリの概要」を参照してください。
物理的な場所の指定
機械的に方向を固定したカメラが組み込まれているシステムでは、カメラの物理的な位置を報告する必要があります。 この物理的な位置情報は、Windows 8.1 でカメラを使用するためのアプリが正しく機能するように、正面や背面などカメラが向いている方向を示します。
次の 2 つの Windows ハードウェア認定要件 (これにより Windows はカメラの位置を認識できる) が必要です。
System.Client.PCContainer.PCAppearsAsSingleObject。 カメラは、コンピューターのデバイス コンテナー (コンピューター内に物理的に配置されたデバイス機能を含む) にグループ化する必要があります。 コンピューター コンテナーの外部にあるデバイスは機械的に方向が固定されているとは見なされないため、カメラをコンピューターのデバイス コンテナーにグループ化して、その物理的な位置をアプリに公開する必要があります。
System.Client.Webcam.PhysicalLocation。 ファームウェアは、ACPI テーブルの _PLD 情報を使用してカメラの場所と向きを示すことにより、物理的な位置情報を提供する必要があります。
Windows でカメラの物理的な位置が必要な理由
Windows では、次の理由により、内部カメラの物理的な位置を把握する必要があります。
UWP アプリは物理的な位置を使用して、複数のカメラが存在する場合にどのカメラを使用するかを決定します。 たとえば、チャット アプリケーションでは、既定で、アプリの起動時にユーザーのほうに向いているフロント カメラを使用することになっています。
UWP アプリでは物理的な位置を使用して、ビデオ プレビューのミラーリングするまたは回転させる方法を決定します。
カメラがユーザーのほうに向いている場合、プレビューではユーザーがミラーを覗いているかのように見えるはずです。 これを行うために、アプリはプレビューの左側と右側を反転して、プレビューでビデオをミラーリングできるようにします。 カメラがユーザーのほうを向いていない場合、アプリはビデオをミラーリングする必要はありません。
アプリでプレビューを回転させる場合、カメラの位置によって回転の度合いが異なります。
コンピューターのデバイス コンテナーにカメラをグループ化する方法
認定要件の System.Client.PCContainer.PCAppearsAsSingleObject (SYSFUND-0200 とも呼ばれます) に従って、内部カメラ デバイス ノードを PC デバイス コンテナーにグループ化する必要があります。 つまり、内部カメラは [デバイスとプリンター] に表示させる必要はなく、PC コンテナーに統合する必要があります。
この要件を実装する方法は、内部カメラのバスの種類によって異なります。 デバイスが物理デバイスの位置に関する情報を ACPI テーブル内で公開できる場合は、「多機能デバイスのサポートとデバイス コンテナーのグループ化」の説明に従って、テーブルに _PLD 情報を含め、ACPI テーブルで UserVisible フラグを変更することで、ACPI レイヤーで正しいグループ化を指定できます。 それ以外の場合は、DeviceOverrides レジストリ キーを使用してリムーバブル フラグをオーバーライドします。 詳細については、「DeviceOverrides レジストリ キー」を参照してください。
ACPI テーブルで _PLD 情報を使用して物理的な位置を指定する方法
認定要件の System.Client.Webcam.PhysicalLocation に従って、カメラの位置を示す _PLD 値を ACPI (Advanced Configuration and Power Interface) テーブルで指定する必要があります。 システムのシャーシに組み込まれ、機械的に方向が固定されているカメラ デバイスに、これは適用されます。 ファームウェアは _PLD メソッドを提供し、Panel フィールド (ビット 69:67) を、カメラがマウントされているパネルの適切な値に設定する必要があります。 たとえば、[正面] はカメラがユーザーのほうを向いていること (Web カメラ) を示し、[背面] はカメラがエンド ユーザーのほうを向いていないこと (静止カメラまたはビデオ カメラ) を示します。
ビット 69:67 の値 | Panel |
---|---|
0 | 頂部 |
1 | 下詰め |
2 | 左 |
3 | Right |
4 | Front |
5 | 戻る |
6 | Unknown |
さらに、ビット 143:128 (垂直オフセット)、ビット 159:144 (水平オフセット) は、ディスプレイに対するカメラの相対位置を示す必要があります。 この起点は、表示コンポーネント内のネイティブ ピクセル アドレス指定に対して相対的であり、横長または縦長の現在の表示の向きと一致している必要があります。 起点はディスプレイの左下隅にあり、水平オフセットと垂直オフセットの正の値はそれぞれ右と上になります。
USB に接続された内部カメラの場合、USB デバイスのデバイス ノードは、USB ポートのデバイス ノードにある ACPI テーブルに作成されます。
アドレス (_ADR) を指定するには:
ターゲット PC に Windows をインストールします
デバイス マネージャーに移動します
ターゲットの Web カメラを選択して長押し (または右クリック) し、[プロパティ] を選択します
[詳細] タブを開き、[プロパティ] メニューの [アドレス] を選択します
[値] ボックスの値は、デバイスが位置しているアドレスです
ACPI テーブルの _ADR に値を設定します
ACPI 仕様と PC の設計に基づいて _PLD 値を設定します
この例は、USB に接続されたカメラ用の ACPI テーブルです。 この例では、値は 0x1 です。 9 番目のバイトには、位置のパネル コードが含まれています (bits[69:67])。 デバイスが USB 複合デバイスの場合は、PLD が video 関数上である必要があることにご注意ください。 つまり、追加の Device() エントリが必要になります。
Device(PRTD)
{
Name(_ADR, 0x6)
Name(_UPC, Package(0x4)
{
....
}
Name(_PLD, Buffer(0x10)
{
....
}
Device(WCAM)
{
Name(_ADR, 0x6)
Name(_PLD, Buffer(0x10) {
0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x20, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
}
}
_PLD の詳細については、ACPI 仕様を参照してください。
USBCCGP の下流にあるノードの場合、アドレス値は camera 関数の最初のインターフェイス番号にポート番号を追加することで計算されます。 USBCCGP がデバイス用に読み込まれていない場合、アドレスは単なるポート番号です。 Windows をインストールせずにアドレス番号を予測する必要がある場合は、この数式を使用して計算してください。 ターゲット デバイスが (USB 複合スタイル デバイスを使用しない) 単一の機能デバイスの場合、アドレス値はポート番号のみを使用して計算されます。
モデル ID の指定
Windows デバイス メタデータ システムは、カメラのデバイス ノードにモデル ID プロパティがあり、デバイス カテゴリが Imaging.Webcam
の場合のみ、内部に組み込まれているカメラのデバイス メタデータ パッケージのクエリを実行できます。 デバイス メタデータ パッケージがデバイスとカメラ固有の UWP デバイス アプリに正しく関連付けられるように、内部カメラのメタデータを Windows で検出できるようにするには、OEM は次を行う必要があります。
- デバイス レジストリ キーの フラグを使用して、デバイス ノードでモデル ID
InternalDeviceModification
を設定する
内部カメラのデバイス ノードのモデル ID を設定する方法
内部カメラの場合、OEM はモデル ID に使用する GUID を作成し、そのレジストリ キーを作成します。 モデル ID プロパティは、InternalDeviceModification メカニズムを使用してデバイス ノードに追加されます。このメカニズムは、特定のデバイスにマップされるレジストリ キーで構成されるレジストリベースのルックアップ テーブル (LUT) です。 この InternalDeviceModification テーブルは、次のレジストリ キーの下で保持されます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification
InternalDeviceModification レジストリ キーの下に作成するためのサブキー エントリは、ModelID に対して OEM が提供する GUID です。 このキーが存在すると、デバイスのハードウェア ID と、ACPI テーブルの _PLD 値で示される位置情報に基づいて、モデル ID がカメラのデバイス ノードに追加されます。
InternalDeviceModification レジストリ キー
InternalDeviceModification レジストリ キーは、少なくとも 1 つのカメラが ModelID を使用することを示します。
レジストリ キー名 | InternalDeviceModification |
---|---|
必須/省略可能 | 必須 |
Path | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control |
形式の要件 | なし |
有効なサブキー | モデル ID レジストリ キー (次のサブキー形式の要件と例を参照のこと) |
モデル ID レジストリ キー
レジストリ キー名 | モデル ID (正確なモデル ID 値はキー名) |
---|---|
必須/省略可能 | 必須 |
形式の要件 | キー名は、OEM によって作成された GUID です。 左右の角かっこが両方とも必要です。 |
有効な値 | ハードウェア ID レジストリ値または PLD_Panel |
例 | {43922620-DAD9-4C05-BE3F-F65B089D84D8} |
ハードウェア ID レジストリ値
レジストリ値の名前 | HardwareIDs |
---|---|
必須/省略可能 | 必須 |
Type | 複数の文字列 |
形式の要件 | ハードウェア ID のバス プレフィックスを含める必要があります。 すべての "" 文字を "#" に置き換える必要があります。 |
例 | USB#VID_1234&PID_ABCD&REV_0001 , PCI#VEN_ABCD&DEV_1234&SUBSYS_000 |
コメント | 複数のハードウェア ID 値を指定できます。 いずれかのハードウェア ID が一覧で複数回発生すると、システムはハードウェア ID に基づいてデバイス ノードのモデル ID を設定します。 |
PLD_Panel レジストリ値
レジストリ値の名前 | PLD_Panel |
---|---|
必須/省略可能 | 省略可能 |
Type | DWORD |
形式の要件 | HardwareID のバス プレフィックスを含める必要があります。 すべての "\" 文字を "#" に置き換える必要があります。 |
例 | 4,5 |
PLD_Panel の詳細
システムに同じカメラ デバイスが 2 つあり、両方に同じハードウェア ID が設定されている場合、ACPI テーブルで指定される PLD_Panel 値でカメラを相互に区別できます。 異なるモデル ID を作成するには、ハードウェア ID と PLD_Panel 値の組み合わせを使用します。
Note
レジストリ キーの PLD_Panel 設定は省略可能です。 Windows は、ACPI テーブルの設定によってカメラの物理的な位置を判断します。
PLD_Panel レジストリ値は、ACPI 仕様では _PLD (物理デバイスの位置) として定義されています。 エンクロージャ内のカメラの物理的な位置を示すこの値は、次のいずれかである必要があります。
Value | 説明 |
---|---|
0 | 頂部 |
1 | 下詰め |
2 | 左 |
3 | Right |
4 | Front |
5 | 戻る |
6 | 不明 (垂直位置と水平位置は無視されます) |
InternalDeviceModification レジストリ キーの例
次の例は、InternalDeviceModification レジストリ キーの形式を示します。
{00001111-2222-3333-4444-555566667777}
HardwareIDs (Multi sz) =
"USB#VID_1234&PID_ABCD&REV_0001","USB#VID_1234&PID_ABCD"
PLD_Panel (DWORD) = 4
{88889999-aaaa-bbbb-cccc-ddddeeeeffff}
HardwareIDs (multi sz) = "USB#VID_5678&PID_WXYZ&REV_0001"
PLD_Panel (DWORD) = 5
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\InternalDeviceModification\{BBBF38D6-9866-493D-B86F-986E339E096D}]
"PLD_Panel"=dword:00000004
"HardwareIDs"=hex(7):55,00,53,00,42,00,23,00,56,00,49,00,44,00,5f,00,30,00,34,\
00,35,00,45,00,26,00,50,00,49,00,44,00,5f,00,30,00,30,00,31,00,30,00,23,00,\
52,00,45,00,56,00,5f,00,30,00,30,00,30,00,31,00,00,00,55,00,53,00,42,00,23,\
00,56,00,49,00,44,00,5f,00,30,00,34,00,35,00,45,00,26,00,50,00,49,00,44,00,\
5f,00,30,00,30,00,31,00,30,00,00,00,00,00
メタデータ構造体
内部カメラのデバイス メタデータ パッケージには、他のデバイスのデバイス メタデータ パッケージと同じ構造体があります。 デバイス メタデータ パッケージ内の packageinfo.xml の MetadataKey は、InternalDeviceModification レジストリ キーを使用して定義されたモデル ID です。 Windows メタデータ システムは、モデル ID に基づいてデバイス メタデータ パッケージをダウンロードします。 内部カメラのハードウェア ID は使用されません。
UWP デバイス アプリのデバイス メタデータの作成の詳細については、「UWP デバイス アプリの構築」を参照してください。
プレインストール
OEM プレインストール キット (OPK) を使用して、Microsoft Store デバイス アプリとデバイス メタデータ パッケージの両方をデバイスにプレインストールできます。