Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek vysvětluje, jak povolit výměnu obrazu pro kameru, která podporuje hlášení stavu závěrky. Popisuje také, jak poskytnout vlastní náhradní image.
Ovladače fotoaparátu, které měly před touto implementací funkce ochranu osobních údajů, poskytovaly vzorky ze senzoru kamery nebo musely implementovat vlastní funkce pro detekci stavu spouště a nahradit samotný vzorek. Tato funkce umožňuje ovladači fotoaparátu spoléhat se na operační systém při nahrazování obrázku v ukázce buď řešením poskytovaným operačním systémem, nebo vlastním obrázkem poskytovaným ovladačem fotoaparátu.
Počínaje Windows 11, verze 21H2, Windows Hardware Compatibility Program (WHCP) vyžaduje, aby kamery s ochrannými kryty nebo vypínacími spínači hlásily stav závěrky fotoaparátu. Tento požadavek umožňuje operačnímu systému a aplikacím zjistit aktuální stav závěrky a slouží k poskytování užitečných uživatelských pokynů ke změně stavu závěrky. Partneři OEM tento mechanismus používají k sestavení funkcí do svých ovladačů, aby nahradili obrázek přicházející z fotoaparátu něčím, co je informativní pro uživatele. Tato funkce umožňuje, aby výrobce OEM používal stejnou funkci, aniž by musel psát vlastní kód uvnitř deviceMFT.
Požadavky
Tato funkce je implementována pouze kamerami, které mají závěrky/zapínače pro ochranu soukromí. Podrobnosti o implementaci pro privátní závěrky jsou popsány v článku Oznámení o privátní závěrce/přepínači.
Zařízení, která chtějí podporovat vlastní obraz pro nahrazení, musí také poskytovat podepsaný binární soubor, který je součástí balíčku ovladače a obsahuje nahrazující obraz.
Vzhledem k tomu, že nahrazení obrazu přepíše existující výstupní vyrovnávací paměť, zařízení výstupem nekomprimované snímky. U komprimovaných snímků, jako je MJPEG a JPEG, nedojde k nahrazení obrázku a místo toho se doručí původní obrázek z ovladače.
Přehled implementace
Nahrazení obrázku nastane, když zařízení odešle oznámení, že je clona zařízení zavřená. Pokud je stav závěrky zavřený a je povolená výměna obrazu, kanál kamery načte náhradní obrázek, a to buď z vlastního obrázku poskytnutého ovladačem fotoaparátu, nebo pomocí náhradního obrázku doručené pošty zobrazeného zde.
Při načtení pipelina transformuje obrázek do výstupní vyrovnávací paměti, která odpovídá stejnému rozlišení a mediatypu, jaký je aktuálně vybrán pro mediatyp ovladače fotoaparátu. Pokud se rozlišení liší, obrázek se vertikálně navyšuje nebo snižuje, ale není roztažený mimo svůj stávající poměr stran.
Od tohoto okamžiku až do okamžiku, kdy se stav závěrky změní na otevřený, mají všechny vzorky dodané ovladačem kamery svá metadata a atributy vzorku zkopírovány do nového vzorku a jejich mediabuffer je zahozen. Nový mediabuffer je zkopírován z přeloženého obrazu uzávěrky a následně použit místo něj. Tento nový vzorek se pak odešle prostřednictvím potrubí, jako by to byl původní vzorek.
Průvodce implementací
Chcete-li povolit nahrazení image, musí být do uzlu rozhraní zařízení fotoaparátu přidána následující položka registru s hodnotou nastavenou na hodnotu 1.
| Typ klíče registru | Název klíče registru | Hodnota klíče registru |
|---|---|---|
| REG_DWORD | PovolitNáhraduObrazu | 0x1 |
Pro ovladač INF to lze přidat, jak je znázorněno zde.
...
[Device.AddReg]
HKR,,EnableImageReplacement,%REG_DWORD%,1
...
[Strings]
REG_DWORD=0x00010001
Pro popisovač MS-OS může být přidán jako následující název:
UVC-EnableImageReplacement
Vlastní image
Pro nahrazení vlastní image musí ovladač poskytnout následující:
Jeden nebo více souborů obrázků formátu BMP typu ARGB32 s velikostí 1000 × 1 000 pixelů. V tomto příkladu je to "TestImage.bmp".
Knihovna DLL prostředků se souborem obrázku obsaženým jako prostředek. V tomto příkladu je to SampleSocMFT.dll.
Ovladačem poskytnuté obrazové soubory musí být ve formátu ARGB32 a mít rozměry 1000 × 1000 pixelů. Tím se nahradí obrázek zobrazený v přehledu implementace. Všechny ostatní změny v ukázce probíhají, jak je popsáno, pouze image, která se nahrazuje, je pro ovladač vlastní. Knihovna DLL prostředků musí být součástí balíčku ovladače a musí být podepsaná. U většiny zařízení to znamená, že ho umístíte do ovladače DeviceMFT.
Chcete-li přidat soubor obrázku do knihovny DLL zdrojů, změňte soubor prostředků projektu *.rc podle následujícího příkladu.
#ifdef ID_REPLACEMENT_IMAGE
#define ID_REPLACEMENT_IMAGE 200
#endif
ID_REPLACEMENT_IMAGE RCDATA "TestImage.bmp"
Dalším krokem je úprava souboru INF ovladače. Pokud je použitá knihovna DLL prostředků nová, musí být součástí direktivy CopyFiles. Nakonec je nutné přidat tři další direktivy 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
...
Id prostředku INF a identifikátor ID_REPLACEMENT_IMAGE prostředku se musí shodovat. Tyto hodnoty je možné upravit tak, aby jedna knihovna DLL prostředků obsahovala více ID prostředků a více obrazů a aby soubor .INF bylo možno lokalizovat pro výběr správného ID prostředku.
Vlastní ohraničení obrázku
U vlastních obrázků, které nechtějí černé ohraničení při použití letterboxingu, lze pomocí registru specifikovat strukturu MFARGB, která přizpůsobí barvu ohraničení náhradního vzorku.
| Typ klíče registru | Název klíče registru | Hodnota klíče registru |
|---|---|---|
| REG_BINÁRNÍ | BarvaPozadíKamery | 0x1 |
V případě ovladače INF ho lze přidat, jak je znázorněno zde:
...
[Device.AddReg]
HKR,,CameraImageBackgroundColor,%REG_ BINARY%,00,00,00,FF
[Strings]
REG_BINARY=0x00000001