Podpora ovladačů pro orientaci kamery

Důležité

Metoda automatické opravy probíraná dále v tomto tématu představuje doporučené řešení pro nenáporuční orientaci montáž snímačů fotoaparátů. To zajistí kompatibilitu aplikací, protože většina aplikací, které už jsou napsané pro používání záběrů z kamery, neví, že je třeba zjistit nebo opravit informace o otočení. Pečlivě si projděte informace v části automatická oprava níže.

Jak jsou zaváděny různé formáty výpočetních zařízení, některá fyzická omezení vedou k tomu, že senzory fotoaparátů jsou umístěny v nestandardní orientaci. Z tohoto důvodu je nutné správně popsat operační systém a aplikaci, jak jsou senzory připojené, aby výsledné video bylo možné správně vykreslit nebo nahrát.

Od okna 10 verze 1607 jsou všechny ovladače fotoaparátu nutné k explicitnímu určení orientace kamery bez ohledu na to, zda je kamera připojena v souladu s minimálními požadavky na hardware. Konkrétně musí ovladač fotoaparátu nastavit nově zavedené pole Rotace ve struktuře ACPI _PLD přidružené k rozhraní zachytávání zařízení:

typedef struct _ACPI_PLD_V2_BUFFER {

    UINT32 Revision:7;
    UINT32 IgnoreColor:1;
    UINT32 Color:24;
    // …
    UINT32 Panel:3;         // Already supported by camera.
    // …
    UINT32 CardCageNumber:8;
    UINT32 Reference:1;
    UINT32 Rotation:4;      // 0 – Rotate by 0° clockwise
                            // 1 – Rotate by 45° clockwise (N/A to camera)
                            // 2 – Rotate by 90° clockwise
                            // 3 – Rotate by 135° clockwise (N/A to camera)
                            // 4 – Rotate by 180° clockwise
                            // 5 – Rotate by 225° clockwise (N/A to camera)
                            // 6 – Rotate by 270° clockwise
    UINT32 Order:5;
    UINT32 Reserved:4;

    //
    // _PLD v2 definition fields.
    //

    USHORT VerticalOffset;
    USHORT HorizontalOffset;
} ACPI_PLD_V2_BUFFER, *PACPI_PLD_V2_BUFFER;

V případě kamery určuje pole Otočení ve struktuře ACPI _PLD počet stupňů (0 pro 0°, 2 pro 90°, 4 pro 180° a 6 pro 270°) zachycený rámeček se otočí vzhledem k obrazovce, zatímco je zobrazení v nativní orientaci.

Na základě hodnoty v poli Otočení může aplikace v případě potřeby provést další otočení, aby se snímky vykreslily správně.

Hodnoty otočení

Pro zařízení, jejichž kamery a displeje sdílejí stejné těleso (nebo krytové/pouzdro), je možné tyto periferní zařízení připojit na různé povrchy, přičemž každý z nich je otočen pevným, ale libovolným stupněm v příslušné rovině. Aplikace proto potřebuje mechanismus pro popis prostorového vztahu mezi dvěma periferními zařízeními, aby zachycený rám mohl být transponován na vykreslovací plochu ve správné orientaci.

Jedním ze způsobů, jak tento problém vyřešit, je použít strukturu _PLD AKTI, která již má koncepty povrchu a stupňů otáčení definované. Například struktura _PLD již obsahuje pole panelu , které určuje povrch, na kterém se nachází periferní zařízení:

Panelové pole ACPI PLD.

Definice pole panelu ACPI _PLD (Rev. 5.0a)

Následující dva diagramy znázorňují definici každého panelu vizuálně:

Definice panelů pro stolní počítače a většinu zařízení

Definice panelů – pracovní plocha.

Definice panelů pro skládací zařízení

Definice panelů – skládací zařízení

Ve skutečnosti je koncept "panelu AKTI" již přijat systémem Windows, kde:

  • Rozhraní fotoaparátového zařízení je přidruženo ke struktuře _PLD s nastaveným polem Panel, pokud je záznamové zařízení staticky namontované na pevném místě.

  • Aplikace může načíst panel, na kterém se nachází zachytávací zařízení, voláním vlastnosti Windows.Devices.Enumeration.DeviceInformation.EnclosureLocation.Panel.

Struktura _PLD AKTI má také pole Otočení definované následujícím způsobem:

Definice pole akti _PLD otočení (Rev 5.0a)

Definice polí rotace ACPI _PLD.

Místo použití výše uvedené definice ji dále zpřesníme, abychom se vyhnuli nejednoznačnosti:

  • U kamery určuje pole Otočení ve struktuře ACPI _PLD počet stupňů ("0" pro 0°, '2' pro 90°, '4' pro 180° a '6' pro 270°) zachycený rám je otočený vzhledem k obrazovce, zatímco displej je v nativní orientaci.

Primární režim na šířku vs. Primární režim na výšku

Ve Windows lze zjistit nativní orientaci zobrazení voláním vlastnosti Windows.Graphics.Display.DisplayInformation.NativeOrientation, která vrátí buď šířku nebo výšku:

Zobrazit nativní orientační vzor skenování.

Bez ohledu na to, kterou hodnotu NativeOrientation vrátí, začíná vzor kontroly logického zobrazení od levého horního rohu zobrazení, který se pohybuje zleva doprava dolů (viz obrázek 5). Pro zařízení, jejichž výchozí fyzická orientace je nejasná, tato vlastnost nejen naznačuje umístění "Top" panelu ACPI, ale také poskytuje prostorový vztah mezi vyrovnávací pamětí výstupu kamery a vykreslovací plochou.

Všimněte si, že na rozdíl od fotoaparátu není vlastnost NativeOrientation založena na ACPI, a proto nemá _PLD strukturu. To platí i v případě, že je zobrazení staticky připojené k zařízení.

Při připojování na primární zařízení orientované na výšku musí ovladače kamery vědět, že většina aplikací bude zařízení považovat za takové, které má výstupní vyrovnávací paměť fotoaparátu v režimu na šířku, bez ohledu na skutečnou orientaci vyrovnávací paměti fotoaparátu. Z tohoto důvodu doporučujeme, aby ovladače fotoaparátů výstupem poskytly vyrovnávací paměť, která má posun orientace o 90 stupňů od Nativní orientace Na výšku, když je zařízení v režimu primární orientace na výšku. To pak umožní aplikacím, které provádějí toto dodatečné otočení na zařízeních s orientací na výšku, opravit otočení na očekávanou orientaci. To lze ověřit pomocí aplikace fotoaparátu s ukázkou otočení.

Montáž s odsazením

IHV/OEMs se důrazně doporučuje vyhnout se montáži senzoru s jakýmkoliv jiným než 0 stupňovým posunem, aby byla zachována kompatibilita aplikací. Mnoho existujících a starších aplikací neví, že má hledat tabulku PLD ACPI, ani se nepokusí opravit posun, který není 0 stupňů. V takovém případě se výsledné video vykreslí nesprávně.

V případech, kdy IHV/OEM nemůžou připojit senzor v orientaci 0 stupňů, jak je popsáno výše, doporučujeme následující kroky pro zmírnění rizika v pořadí podle preferencí:

  1. Automaticky opravte orientaci různé od 0 stupňů v ovladači fotoaparátu (buď v režimu jádra s driverem miniportu AV streamu, nebo v uživatelském režimu pomocí plug-inu, například Device MFT nebo MFT0), aby výsledné výstupní snímky byly v orientaci 0 stupňů.

  2. Deklarujte orientaci bez 0 stupňů prostřednictvím značky FSSensorOrientation, aby kanál fotoaparátu mohl zachycený obrázek opravit.

  3. Deklarujte orientaci bez 0 stupňů v tabulce PLD AKTI, jak je popsáno výše.

Komprimované nebo kódované typy médií

Pro komprimované a/nebo kódované typy médií (například MJPG, JPEG, H264, HEVC) nelze použít pipeline correct. Z tohoto důvodu se komprimované nebo kódované typy médií vyfiltrují, pokud je fsSensorOrientation nastavena na nenulovou hodnotu.

V případě typů médií MJPG (například z kamery UVC) kanál Frame Serveru poskytuje automaticky dekódovaný typ média (NV12 nebo YUY2 pro aplikace založené na DShow). Zobrazí se automaticky dekódovaný a opravený typ média, ale původní formát MJPG nebude.

[! POZNÁMKA!] Pokud musí být komprimované nebo kódované typy médií vystavené aplikacím, nesmí IHV/ODMs používat opravu FSSensorOrientation. Místo toho musí opravu provést ovladač fotoaparátu (buď v režimu jádra prostřednictvím ovladače AV Stream, nebo v uživatelském režimu prostřednictvím DMFT/MFT0).

Automatická oprava pomocí Miniportu AV Stream/zařízení MFT/MFT0

Doporučený scénář, pokud senzory nelze namontovat s nulovým posunem, je mít ovladač miniportu AV Stream (nebo moduly v uživatelském režimu ve formě DMFT nebo MFT0) opravit výsledný zachycený snímek tak, aby byl předán do kanálu s nulovým posunem.

Při opravě rámečku videa z miniportu AV Stream a/nebo konektoru MFT/MFT0 zařízení musí být výsledná deklarace typu média založena na správném rámečku. Pokud je senzor připojen při posunu 90 stupňů, takže výsledné video je poměr stran 9:16 ze snímače, ale opravené video by bylo 16:9, typ média musí deklarovat poměr stran 16:9.

To zahrnuje výsledné informace o kroku. To je nezbytné, protože komponenta odpovědná za opravu je řízena IHV/OEM a kanál kamery nemá přehled o snímku videa s výjimkou doby, kdy byla opravena.

Důrazně doporučujeme, aby se oprava prováděla v uživatelském režimu a kontrakt rozhraní API mezi kanálem a modulem plug-in uživatelského režimu se musí dodržovat. Konkrétně při použití DMFT nebo MFT0, když IMFDeviceTransform::ProcessMessage nebo IMFTransform::ProcessMessage je vyvolána se zprávou MFT_MESSAGE_SET_D3D_MANAGER, musí modul plug-in uživatelského režimu dodržovat následující pokyn.

  • Pokud není k dispozici žádný správce D3D (ulParam zprávy je 0), modul plug-in uživatelského režimu nesmí vyvolat žádné operace GPU pro zpracování opravy otočení. Výsledný rámec musí být k dispozici v systémové paměti.
  • Pokud je k dispozici správce D3D (ulParam zprávy je IUnknown správce DXGI), musí být tento správce DXGI použit pro korekci rotace a výsledný rámec musí být v paměti GPU.
  • Modul plug-in uživatelského režimu musí také zpracovat zprávu správce D3D během běhu. Při vydání MFT_MESSAGE_SET_D3D_MANAGER zprávy musí další rámec vytvořený modulem plug-in odpovídat požadovanému typu paměti (tj. GPU, pokud byl zadán správce DXGI, procesor jinak).
  • Pokud ovladač AV Stream (nebo modul plug-in uživatelského režimu) zpracovává opravu otočení, musí být pole struktury ACPI PLD nastaveno na hodnotu 0.

Poznámka:

Při použití automatické opravy nesmí OEM a IHV inzerovat skutečnou orientaci senzoru prostřednictvím pole _PLD Otočení . V tomto případě musí pole Otočení označovat orientaci za opravou: 0 stupňů.

Deklarace prostřednictvím FSSensorOrientation

; Defines the sensor mounting orientation offset angle in
; degrees clockwise.
FSSensorOrientation: REG_DWORD: 90, 180, 270

Deklarováním ne-nulové orientace senzoru pomocí značky registru FSSensorOrientation může obrazový řetězec kamery opravit zachycený snímek před jeho prezentováním aplikaci.

Kanál optimalizuje logiku rotace využitím prostředků GPU nebo procesoru na základě případu použití a požadavku nebo scénáře aplikace.

Rotace ACPI PLD

Pole Rotace struktury ACPI PLD musí být 0. Vyhnete se tak matoucím aplikacím, které můžou k opravě rámce použít informace PLD.

Informace o typu média

Typ média prezentovaný ovladačem musí být neopravený typ média. Při informování o posunu kanálu kamery o ne-0 stupňů pomocí záznamu FSSensorOrientation musí být informace o typu média prezentovaná senzorem v neopravené podobě. Pokud je například senzor připevněn ve směru hodinových ručiček o 90stupňovém posunu, takže místo poměru stran 16:9 je výsledné video 9:16, musí být do kamerového řetězce zadán typ média s poměrem stran 9:16.

To je nezbytné k tomu, aby potrubí mohlo správně nakonfigurovat proces protisměrné rotace: Potrubí potřebuje typ vstupního média a požadovaný typ výstupního média aplikace.

To zahrnuje informace o délce kroku. Informace o stridu musí být předloženy pro neopravený typ média do kanálu kamery.

Podklíč registru

Položka registru FSSensorOrientation musí být publikována v uzlu Rozhraní zařízení. Doporučeným přístupem je deklarovat tuto směrnici jako AddReg během deklarace direktivy AddInterface v INF ovladače fotoaparátu.

Data uvedená v FSSensorOrientation musí být REG_DWORD a jediné platné hodnoty budou 90, 180 a 270. Jakákoli jiná hodnota se bude považovat za posun o 0 stupňů (tj. ignorováno).

Každá hodnota představuje orientaci senzoru ve stupních po směru hodinových ručiček. Kanál kamery opraví výsledný snímek videa otočením čítače o stejnou velikost proti směru hodinových ručiček: tj. deklarace 90 stupňů ve směru hodinových ručiček způsobí otočení 90 stupňů proti směru hodinových ručiček, aby výsledný obrazový snímek vrátil zpět do posunu 0 stupňů.

Popisovač MS OS 1.0

U fotoaparátů založených na USB může být FSSensorOrientation také publikován prostřednictvím popisovačů MSOS.

Popisovač MS OS 1.0 má dvě komponenty:

  • Oddíl záhlaví s pevnou délkou
  • Jedna nebo více oddílů vlastních vlastností s proměnnou délkou, která následuje za oddílem záhlaví

Oddíl záhlaví MS OS DESCRIPTOR 1.0

Oddíl záhlaví popisuje jednu vlastní vlastnost (profil ověřování tváře).

Offset Obor Velikost (bajty) Hodnota Popis
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Verze 1.0
6 wIndex 2 0x0005 Popisovač rozšířené vlastnosti operačního systému
8 wCount 2 0x0001 Jedna vlastní vlastnost

Vlastní oddíl vlastností MS OS DESCRIPTOR 1.0

Offset Obor Velikost (bajty) Hodnota Popis
0 dwSize 4 0x00000036 (54) Celková velikost (v bajtech) pro tuto vlastnost.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Velikost (v bajtech) názvu vlastnosti
10 bPropertyName 50 UVC-FSSensorOrientation Řetězec "UVC-FSSensorOrientation" v kódu Unicode.
60 dwPropertyDataLength 4 0x00000004 4 bajty pro data vlastností (sizeof(DWORD)).
64 bPropertyData 4 Úhel vychýlení ve stupních ve směru hodinových ručiček. Platné hodnoty jsou 90, 180 a 270.

Popisovač Microsoft OS 2.0

Rozšířené popisovače MSOS 2.0 lze použít k definování hodnot registru pro přidání podpory FSSensorOrientation. To se provádí pomocí popisovače vlastností registru Microsoft OS 2.0.

Pro položku registru UVC-FSSensorOrientation se zobrazí ukázková sada popisovače MSOS 2.0:

UCHAR Example2_MSOS20DescriptorSet_UVCFSSensorOrientationForFutureWindows[0x3C] =
{
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,                 // wLength - 10 bytes
    0x00, 0x00,                 // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06,     // dwWindowsVersion – 0x060?0000 for future Windows version
    0x4A, 0x00,                 // wTotalLength – 74 bytes

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x40, 0x00,                 // wLength - 64 bytes
    0x04, 0x00,                 // wDescriptorType – 4 for Registry Property
    0x04, 0x00,                 // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
    0x32, 0x00,                 // wPropertyNameLength – 50 bytes
    0x55, 0x00, 0x56, 0x00,     // Property Name - "UVC-FSSensorOrientation"
    0x43, 0x00, 0x2D, 0x00,
    0x46, 0x00, 0x53, 0x00,
    0x53, 0x00, 0x65, 0x00,
    0x6E, 0x00, 0x73, 0x00,
    0x6F, 0x00, 0x72, 0x00,
    0x4F, 0x00, 0x72, 0x00,
    0x69, 0x00, 0x65, 0x00,
    0x6E, 0x00, 0x74, 0x00,
    0x61, 0x00, 0x74, 0x00,
    0x69, 0x00, 0x6F, 0x00,
    0x6E, 0x00, 0x00, 0x00,
    0x00, 0x00,
    0x04, 0x00,                 // wPropertyDataLength – 4 bytes
    0x5A, 0x00, 0x00, 0x00      // PropertyData – 0x0000005A (90 degrees offset)
}

Deklarovat prostřednictvím informací PLD ACPI

Jako možnost posledního řešení je možné využít informace PLD, jak je popsáno výše, aby bylo možné indikovat aplikaci, že před vykreslením/kódováním musí být rámeček videa opraven. Jak je ale uvedeno, mnoho existujících aplikací nepoužívá informace PLD ani nezpracuje otočení snímků, takže tam budou scénáře, kdy aplikace nemusí být schopny vykreslit výsledné video správně.

Následující obrázky znázorňují hodnoty pole _PLD Otočení pro každou konfiguraci hardwaru:

Otočení: 0 stupňů ve směru hodinových ručiček

Obrázek otočení o 0 stupňů

Na obrázku výše:

  • Obrázek na levé straně znázorňuje scénu, která se má zachytit.

  • Obrázek uprostřed znázorňuje, jak je scéna zobrazena senzorem CMOS, jehož pořadí fyzického čtení začíná z levého dolního rohu, které se pohybuje zleva doprava nahoru.

  • Obrázek vpravo představuje výstup ovladače fotoaparátu. V tomto příkladu lze obsah mediální vyrovnávací paměti vykreslit přímo, když je zobrazení v nativní orientaci bez nutnosti dalšího otočení. V důsledku toho má pole ACPI _PLD Rotation hodnotu 0.

Otočení: 90 stupňů ve směru hodinových ručiček

Obrázek otočení o 90 stupňů

V tomto případě se obsah vyrovnávací paměti médií otočí o 90 stupňů ve směru hodinových ručiček ve srovnání s původní scénou. V důsledku toho pole ACPI _PLD Otočení má hodnotu 2.

Otočení: 180 stupňů po směru hodinových ručiček

Obrázek otočení o 180 stupňů

V tomto případě se obsah vyrovnávací paměti médií otočí o 180 stupňů po směru hodinových ručiček ve srovnání s původní scénou. V důsledku toho pole ACPI _PLD Otočení má hodnotu 4.

Otočení: 270 stupňů ve směru hodinových ručiček

Obrázek otočení o 270 stupňů

V tomto případě se obsah vyrovnávací paměti médií otočí o 270 stupňů ve směru hodinových ručiček ve srovnání s původní scénou. V důsledku toho pole ACPI _PLD Otočení má hodnotu 6.