本文說明如何啟用影像替換功能以支援快門狀態回報的相機。 它也會說明如何提供自訂取代映像。
在這項功能實作之前,具有隱私權快門/開關的相機驅動程式會從相機感應器中提供範例,或者必須實作專有功能來偵測快門狀態並取代該範例。 這項功能可讓相機驅動程式依賴 OS 將範例中的影像取代為 OS 提供的解決方案,或相機驅動程式所提供的自定義影像。
從 Windows 11 版本 21H2 開始,Windows 硬體相容性計劃 (WHCP) 需要隨附隱私權快門或終止開關的相機,以報告相機快門狀態。 此需求可讓作業系統和應用程式知道快門的目前狀態,並用來提供有關如何變更快門狀態的實用使用者指引。 OEM 合作夥伴會使用此機制將功能建置到其驅動程式中,以對使用者提供資訊的內容取代來自相機的影像。 這項功能可讓 OEM 利用相同的功能,而不需要在 DeviceMFT 內撰寫專屬程式代碼。
需求
此功能僅由具有隱私快門/終止開關的相機實現。 隱私權快門的實作詳細資料,請參閱 隱私權快門/開關通知 一文。
想要支援自定義映像以進行映像取代的裝置也必須提供已簽署的二進位檔,這是其驅動程式套件的一部分,其中包含其取代映像。
由於映像替換會覆蓋現有的輸出緩衝區,因此設備會輸出未壓縮的幀。 對於 MJPEG 和 JPEG 等壓縮幀,不會發生圖像替換,而是從驅動程序中傳遞原始圖像。
實作概觀
當裝置傳送裝置快門關閉的通知時,就會發生影像替換。 如果快門狀態為關閉,且已啟用影像替換,相機流程會從相機驅動程式提供的自訂影像或使用此處顯示的內建的替換影像載入替換影像。
載入時,管線會將影像轉譯成輸出緩衝區,以符合相機驅動程式目前所選媒體類型的相同解析度和媒體類型。 如果解析度不同,影像會等比例放大或縮小,但不會超出其現有的寬高比。
從該點開始,直到快門狀態變更為開啟為止,相機驅動程式所傳遞的所有範例都會將其中繼資料和範例屬性複製到新的範例中,並捨棄其媒體緩衝區。 從翻譯的快門影像中複製出新的媒體緩衝區,並將其用於替代原本的緩衝區。 然後,這個新樣本將通過管道發送,就好像它是原始樣本一樣。
實作指南
若要啟用映像取代,必須將下列登錄項目新增至相機的裝置介面節點,並將值設定為 1。
| 註冊表鍵類型 | 註冊表鍵名稱 | 註冊表鍵值 |
|---|---|---|
| REG_DWORD | 啟用影像取代 | 0x1 |
針對驅動程式 INF,可以新增此項,如下所示。
...
[Device.AddReg]
HKR,,EnableImageReplacement,%REG_DWORD%,1
...
[Strings]
REG_DWORD=0x00010001
對於 MS-OS 描述元,可以新增為下列名稱:
UVC-EnableImageReplacement
自訂映像
針對自訂映像取代,驅動程式必須提供下列項目:
一個或多個格式為 BMP 類型 ARGB32 的圖像文件,大小為 1000 x 1000 像素。 在此範例中,它是「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 指令的一部分。 最後,必須新增三個額外的 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識別碼必須相符。 您可以調整這些值,讓單一資源 DLL 可以包含多個資源識別碼和多個映像,而且可以當地語系化 INF 以選取正確的資源識別碼。
自訂影像框線
對於希望在加框處理時不需要黑色邊框的自定義圖像,可以通過註冊表指定 MFARGB 結構來自訂替代範例的邊框顏色。
| 註冊表鍵類型 | 註冊表鍵名稱 | 註冊表鍵值 |
|---|---|---|
| REG_BINARY(二進位制) | 相機影像背景色彩 | 0x1 |
針對驅動程式 INF,可以新增它,如下所示:
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001