この記事では、シャッター状態レポートをサポートするカメラの画像置換を有効にする方法について説明します。 また、カスタム置換イメージを提供する方法についても説明します。
この機能を実装する前にプライバシー シャッター/スイッチを備えたカメラ ドライバーは、カメラ センサーからサンプルを提供するか、シャッター状態を検出してサンプル自体を置き換える独自の機能を実装する必要がありました。 この機能を使用すると、カメラ ドライバーは OS に依存して、サンプル内のイメージを OS で提供されるソリューションまたはカメラ ドライバーによって提供されるカスタム イメージに置き換えることができます。
Windows 11 バージョン 21H2 以降では、Windows ハードウェア互換性プログラム (WHCP) には、カメラシャッターの状態を報告するためにプライバシー シャッターまたは強制スイッチが付属しているカメラが必要です。 この要件により、オペレーティング システムとアプリケーションはシャッターの現在の状態を把握でき、シャッターの状態を変更する方法に関する有用なユーザー ガイダンスを提供するために使用されます。 OEM パートナーは、このメカニズムを使用してドライバーに機能を組み込み、カメラからの画像をユーザーに有益なものに置き換えます。 この機能により、OEM は DeviceMFT 内に独自のコードを記述しなくても、この同じ機能を利用できます。
要求事項
この機能は、プライバシー シャッター/キル スイッチを備えたカメラによってのみ実装されます。 プライバシー シャッターの実装の詳細については、 プライバシー シャッター/スイッチ通知 に関する記事を参照してください。
イメージ置換用のカスタム イメージをサポートするデバイスでは、代替イメージを含むドライバー パッケージの一部である署名付きバイナリも提供する必要があります。
イメージの置換によって既存の出力バッファーが上書きされるため、デバイスは圧縮されていないフレームを出力します。 MJPEG や JPEG などの圧縮フレームの場合、イメージの置換は行われず、代わりにドライバーの元のイメージが配信されます。
実装の概要
画像の交換は、デバイスのシャッターが閉じているという通知をデバイスが送信するときに発生します。 シャッター状態が閉じられ、画像の交換が有効になっている場合、カメラ パイプラインは、カメラ ドライバーによって提供されたカスタムイメージから、またはここに示す受信トレイの交換画像を使用して、代替画像を読み込みます。
読み込まれると、パイプラインは、カメラ ドライバーの現在選択されているメディアタイプと同じ解像度とメディアタイプに一致する出力バッファーに画像を変換します。 解像度が異なる場合、イメージはスケールアップまたはスケールダウンされますが、既存の縦横比の外側には拡大されません。
その時点から、シャッター状態が開くまで、カメラ ドライバーによって提供されるすべてのサンプルのメタデータとサンプル属性が新しいサンプルにコピーされ、メディアバッファーが破棄されます。 新しいメディアバッファーは、変換されたシャッター画像からコピーされ、代わりに使用されます。 この新しいサンプルは、元のサンプルであるかのようにパイプラインを通じて送信されます。
実装ガイド
イメージの置換を有効にするには、カメラのデバイス インターフェイス ノードに次のレジストリ エントリを追加し、値を 1 に設定する必要があります。
| Regkey の種類 | レジストリ キー名 | Regkey 値 |
|---|---|---|
| REG_DWORD | 画像置換を有効にする | 0x1 |
ドライバー INF の場合、これは次のように追加できます。
...
[Device.AddReg]
HKR,,EnableImageReplacement,%REG_DWORD%,1
...
[Strings]
REG_DWORD=0x00010001
MS-OS 記述子の場合、これは次の名前として追加できます。
UVC-EnableImageReplacement
カスタム画像
カスタム イメージを置き換える場合、ドライバーは次の情報を提供する必要があります。
1000 x 1000 ピクセルのサイズの BMP タイプ ARGB32 形式の 1 つ以上のイメージ ファイル。 この例では、"TestImage.bmp" です。
リソース DLL。イメージ ファイルがリソースとして含まれています。 この例では、SampleSocMFT.dll。
ドライバーが提供するイメージ ファイルは、1000 x 1000 ピクセルの ARGB32 イメージである必要があります。 これにより、実装の概要に示されているイメージが置き換えられます。 サンプルに対するその他の変更はすべて説明どおりに行われます。置き換えられるイメージのみがドライバーに対してカスタムです。 リソース DLL はドライバー パッケージの一部であり、署名されている必要があります。 ほとんどのデバイスでは、ドライバー DeviceMFT に配置します。
リソース DLL にイメージ ファイルを追加するには、プロジェクトのリソース ファイル *.rc を例として次のように変更します。
#ifdef ID_REPLACEMENT_IMAGE
#define ID_REPLACEMENT_IMAGE 200
#endif
ID_REPLACEMENT_IMAGE RCDATA "TestImage.bmp"
次の手順では、ドライバー INF を変更します。 使用されるリソース DLL が新しい場合は、CopyFiles ディレクティブの一部である必要があります。 最後に、3 つの AddReg ディレクティブを追加する必要があります。
[SourceDisksFiles]
AvsCameraSim.sys=1
SampleSocMFT.dll=1
[DestinationDir]
AvsCameraSim.CopySys=13
AvsCameraSim.CopyDMFT=13
[AvsCameraSim.CopySys]
AvsCameraSim.sys
[AvsCameraSim.CopyDMFT]
SampleSocMFT.dll
[AvsCameraSim]
Include=ks.inf, kscaptur.inf
Needs=KS.registration, KSCaptur.Registration.NT
CopyFiles=AvsCameraSim.CopySys, AvsCameraSim.CopyDMFT
AddReg=AvsCameraSim.AddReg
[AvsCameraSim.AddReg]
HKR,,CameraImageResource,,%13%\%DMFT.NAME%
HKR,,CameraImageResourceID,%REG_DWORD%,%ResourceID%
HKR,,EnableImageReplacement,%REG_DWORD%,1
[Strings]
DMFT.Name="SampleSocMFT.dll"
REG_DWORD=0x00010001
;localizable
ResourceID=200
...
リソースの INF ResourceID とID_REPLACEMENT_IMAGE識別子が一致している必要があります。 これらの値は、1 つのリソース DLL に複数のリソース ID と複数のイメージを含め、INF をローカライズして適切なリソース ID を選択できるように調整できます。
カスタム イメージの境界線
レターボックス化が行われるときに黒い罫線を望まないカスタム イメージの場合、置換サンプルの境界線の色をカスタマイズするレジストリを通じて MFARGB 構造体を指定できます。
| Regkey の種類 | レジストリキー名 | Regkey 値 |
|---|---|---|
| REG_BINARY(レジストリバイナリ) | カメラ画像背景色 | 0x1 |
ドライバー INF の場合は、次のように追加できます。
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001