プライバシー シャッターの代替画像
この記事では、シャッター状態レポートをサポートするカメラで画像置換を有効にする方法について説明します。 また、カスタムの代替画像を提供する方法についても説明します。
この機能を実装する前にプライバシー シャッター/スイッチを備えていたカメラ ドライバーでは、カメラ センサーからのサンプルを利用していたか、シャッター状態を検出してサンプル自体を置き換える独自の機能を実装する必要がありました。 この機能により、カメラ ドライバーは OS に依存して、サンプル内の画像を OS で提供されるソリューションか、カメラ ドライバーで提供されるカスタム画像に置き換えることができます。
Windows 11 バージョン 21H2 以降、Windows ハードウェア互換性プログラム (WHCP) では、プライバシー シャッターまたはキル スイッチを備えたカメラについて、カメラのシャッター状態を報告することを義務付けています。 この要件により、オペレーティング システムとアプリケーションはシャッターの現在の状態を認識できるようになります。またこの要件は、シャッターの状態を変更する方法について役立つガイダンスをユーザーに提供するために使用されます。 OEM パートナーはこのメカニズムを使用してドライバーに機能を組み込み、カメラからの画像をユーザーに有益なものに置き換えます。 この機能により OEM は DeviceMFT 内に独自のコードを記述しなくても、この同じ機能を利用できます。
要件
この機能は、プライバシー シャッター/キル スイッチを備えたカメラでのみ実装されます。 プライバシー シャッターの実装の詳細については、「プライバシー シャッター/スイッチの通知」の記事を参照してください。
画像置換用のカスタム画像をサポートするデバイスでは、代替画像を含むドライバー パッケージの一部である署名付きバイナリも提供する必要があります。
実装の概要
デバイスのシャッターが閉じているという通知をデバイスが送信すると、画像置換が行われます。 シャッター状態が "クローズ" で、画像置換が有効になっている場合、カメラ パイプラインは、カメラ ドライバーが提供するカスタム画像から、または次に示す受信トレイの代替画像を使用して、代替画像を読み込みます。
パイプラインは読み込んだ画像を、カメラ ドライバーの現在選択されているメディアタイプと同じ解像度とメディアタイプに一致する出力バッファーに変換します。 解像度が異なる場合、画像のスケールアップやスケールダウンは行われますが、既存の縦横比を超えて拡大されることはありません。
その時点から、シャッター状態が "オープン" に変わるまで、カメラ ドライバーで提供されるすべてのサンプルのメタデータとサンプル属性が新しいサンプルにコピーされ、メディアバッファーが破棄されます。 新しいメディアバッファーは変換されたシャッター画像からコピーされ、代わりに使用されます。 その後、この新しいサンプルは、元のサンプルであるかのようにパイプライン経由で送信されます。
実装ガイド
画像置換を有効にするには、カメラのデバイス インターフェイス ノードに次のレジストリ エントリを追加し、値を 1 に設定する必要があります。
Regkey の種類 | Regkey の名前 | Regkey の値 |
---|---|---|
REG_DWORD | EnableImageReplacement | 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 はドライバー パッケージの一部であり、署名されている必要があります。 大半のデバイスの場合、リソース 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 の名前 | Regkey の値 |
---|---|---|
REG_BINARY | CameraImageBackgroundColor | 0x1 |
ドライバー INF の場合、次のように追加できます。
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001