Aracılığıyla paylaş


Kamera yönlendirmesi için sürücü desteği

Önemli

Bu konunun ilerleyen bölümlerinde ele alınan Otomatik düzeltme yöntemi, kamera algılayıcılarının referanssız yönlendirme montajı için önerilen çözümdür. Bu, kamera akışlarını kullanmak üzere yazılmış olan uygulamaların çoğunluğu döndürme bilgilerini denetlemeyi veya düzeltmeyi bilmediğinden uygulama uyumluluğunu sağlamaktır. Lütfen aşağıdaki otomatik düzeltme bölümündeki bilgileri dikkatle gözden geçirin.

Farklı form faktörleri bilgi işlem cihazları kullanıma sunulduğundan, bazı fiziksel kısıtlamalar kamera algılayıcılarının geleneksel olmayan bir yönde takılmasını sağlar. Bu nedenle, elde edilen videonun düzgün bir şekilde işlenebilmesi/kaydedilebilmesi için işletim sistemine ve uygulamaya, sensörlerin nasıl takıldığını düzgün bir şekilde açıklamak gerekir.

Windows 10, sürüm 1607'den başlayarak, tüm kamera sürücülerinin, kameranın Minimum donanım gereksinimlerine uygun olarak takılı olup olmadığına bakılmaksızın kamera yönünü açıkça belirtmesi gerekir. Özellikle, kamera sürücüsünün yakalama cihazı arabirimiyle ilişkili ACPI _PLD yapısında yeni tanıtılan döndürme alanını ayarlaması gerekir:

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;

Kamera için, ACPI _PLD yapısındaki Döndürme alanı derece sayısını belirtir (0°için '0', 90°için '2', 180° için '4' ve 270° için '6') yakalanan çerçeve, ekran yerel yönlendirmesindeyken ekrana göre döndürülür.

Döndürme alanındaki değere bağlı olarak, bir uygulama yakalanan çerçeveleri doğru şekilde işlemek için gerekirse ek döndürme gerçekleştirebilir.

Döndürme Değerleri

Kameraları ve ekranları aynı muhafazayı (veya kasa/kasasını) paylaşan cihazlar için, bu çevre birimlerinin farklı yüzeylere monte edilmesi ve bunların her birinin ilgili düzlemde sabit ancak rastgele bir dereceyle döndürülmesini sağlamak mümkündür. Sonuç olarak, bir uygulamanın yakalanan bir çerçevenin işleme yüzeyine doğru yönde dönüştürülebilmesi için iki çevre birimi arasındaki uzamsal ilişkiyi tanımlayan bir mekanizmaya ihtiyacı vardır.

Sorunu çözmenin bir yolu, zaten yüzey kavramları ve döndürme dereceleri tanımlanmış olan ACPI _PLD yapısını kullanmaktır. Örneğin, _PLD yapısında çevre biriminin bulunduğu yüzeyi belirten panel alanı zaten vardır:

ACPI PLD panel alanı.

ACPI _PLD Panel alanının tanımı (Rev. 5.0a)

Sonraki iki diyagramda her panelin tanımı görsel olarak gösterilir:

Masaüstü bilgisayarlar ve çoğu cihaz için panel tanımları

Panel tanımları - masaüstü.

Katlanabilir cihazlar için panel tanımları

Panel tanımları - katlanabilir cihazlar.

Aslında, ACPI "panel" kavramı Windows tarafından zaten benimsenmiştir ve burada:

ACPI _PLD yapısında aşağıdaki gibi tanımlanmış bir Döndürme alanı da vardır:

ACPI _PLD Döndürme alanının tanımı (Rev 5.0a)

ACPI _PLD Döndürme alanı tanımları.

Yukarıdaki tanımı olduğu gibi kullanmak yerine belirsizliği önlemek için daha da daraltıyoruz:

  • Kamera için, ACPI _PLD yapısındaki Döndürme alanı, yakalanan çerçevenin ekranın doğal yönlendirmesi sırasında ekrana göre kaç derece döndürüldüğünü belirtir (0° için '0', 90° için '2', 180° için '4' ve 270° için '6').

Yatay Birincil ve Dikey Birincil karşılaştırması

Windows'da yerel ekran yönünü sorgulamak için Windows.Graphics.Display.DisplayInformation.NativeOrientation özelliğini çağırarak Yatay veya Dikey değerlerini döndürebilirsiniz.

Yerel yönlendirme tarama desenini görüntüleme.

NativeOrientation hangi değeri döndürürse döndürsün, mantıksal görüntü tarama düzeni ekranın sol üst köşesinden başlayarak soldan sağa doğru hareket eder (bkz. Şekil 5). Varsayılan fiziksel yönü açık olmayan cihazlar için, bu özellik yalnızca ACPI Üst panelinin konumunu ima etmekle kalmaz, aynı zamanda kamera çıkış arabelleği ile işleme yüzeyi arasındaki uzamsal ilişkiyi de sağlar.

Kameradan farklı olarak NativeOrientation özelliğinin ACPI'yi temel almadığını ve bu nedenle _PLD bir yapıya sahip olmadığını unutmayın. Bir ekran cihaza statik olarak bağlı olsa bile bu durum geçerlidir.

Dikey Birincil aygıta bağlanırken, kamera sürücüleri, çoğu uygulamanın gerçek kamera çıkış arabelleğinin yönüne bakılmaksızın cihazı yatay kamera çıkış arabelleği olarak işleyeceğini bilmesi gerekir. Bu nedenle, kamera sürücülerinin Dikey Birincil bir cihazdayken NativeOrientation Portrait değerinden 90 derece yönlendirme açısına sahip bir kamera arabelleği çıkarması önerilir. Böylece dikey cihazlarda bu ek döndürmeyi gerçekleştiren uygulamaların döndürmeyi beklenen yönde düzeltmesi sağlanır. Bu, Döndürme Örneği ile Kamera Uygulaması kullanılarak doğrulanabilir.

Ofset Montajı

IHV/OEM'lerin uygulama uyumluluğunu korumak için algılayıcıyı 0 derecelik olmayan bir uzaklıkta monte etmekten kaçınmaları kesinlikle teşvik edilir. Mevcut ve eski uygulamaların çoğu ACPI'nin PLD tablosunu aramasını bilmez ve 0 derece olmayan uzaklığı düzeltmeye çalışmaz. Sonuç olarak, bu tür uygulamalar için sonuçta elde edilen video yanlış işlenir.

IHV/OEM'lerin yukarıda açıklandığı gibi algılayıcıyı 0 derece yönde bağlayamadığı durumlarda, tercih sırasına göre aşağıdaki risk azaltma adımları önerilir:

  1. Kamera Sürücüsü içindeki 0 derece olmayan hizalamayı (AV akış miniport sürücüsüyle çekirdek modunda veya Cihaz MFT veya MFT0 gibi bir eklenti kullanarak kullanıcı modunda) otomatik olarak düzeltin, böylece çıktı çerçeveleri 0 derece hizalamada olur.

  2. Kamera İşlem Hattı'nın yakalanan görüntüyü düzeltebilmesi için FSSensorOrientation etiketi aracılığıyla 0 derece olmayan yönlendirmeyi bildirin.

  3. Yukarıda açıklandığı gibi ACPI'nin PLD tablosunda 0 derece olmayan yönlendirmeyi bildirin.

Sıkıştırılmış/Kodlanmış Medya Türleri

Sıkıştırılmış ve/veya Kodlanmış Medya Türleri (MJPG, JPEG, H264, HEVC gibi) için işlem hattı doğru kullanılamaz. Bu nedenle, FSSensorOrientation sıfır olmayan bir değere ayarlanırsa Sıkıştırılmış/Kodlanmış Medya Türleri filtrelenir.

MJPG medya türleri (UVC kameradakiler gibi) söz konusu olduğunda, Frame Server işlem hattı otomatik olarak çözülen bir medya türü (DShow tabanlı uygulamalar için NV12 veya YUY2) sağlar. Otomatik olarak çözülen ve düzeltilen medya türü sunulur, ancak özgün MJPG biçimi sunulmaz.

[!NOT!] Sıkıştırılmış/Kodlanmış Medya Türlerinin uygulamalara açık olması gerekiyorsa, IHV/ODM'ler FSSensorOrientation düzeltmesini kullanmamalıdır. Bunun yerine, düzeltme kamera sürücüsü tarafından yapılmalıdır (AV Stream sürücüsü aracılığıyla çekirdek modunda veya DMFT/MFT0 aracılığıyla kullanıcı modunda).

AV Stream Miniport/Cihaz MFT/MFT0 aracılığıyla Otomatik Düzeltme

Önerilen senaryo, algılayıcılar 0 derece kayma ile monte edilemiyorsa, AV Stream miniport sürücüsünün (veya kullanıcı modu eklentilerinin DMFT veya MFT0 biçiminde) yakalanan çerçeveyi düzelterek sonuç olarak elde edilen çerçevenin işlem akışına 0 derece kayma ile sunulmasını sağlamaktır.

Video çerçevesini AV Stream Miniport ve/veya Cihaz MFT/MFT0 eklentisinden düzeltirken, sonuçta elde edilen medya türü bildirimi, düzeltilen çerçeveye dayanmalıdır. Sensör 90 derece uzaklıkta takılıysa ve sonuçta elde edilen video sensörden 9:16 en boy oranına sahipse ancak düzeltilen video 16:9 ise, medya türü 16:9 en boy oranını bildirmelidir.

Bu, sonuç olarak elde edilen adım bilgilerini içerir. Düzeltmeyi yapmaktan sorumlu bileşen IHV/OEM tarafından denetlendiğinden ve kamera işlem hattının düzeltildikten sonra dışında video çerçevesine görünürlüğü olmadığından bu gereklidir.

Düzeltmenin kullanıcı modunda yapılması ve işlem hattı ile kullanıcı modu eklentisi arasındaki API sözleşmesinin izlenmesi kesinlikle tavsiye edilir. Özellikle, DMFT veya MFT0 kullanırken, IMFDeviceTransform::P rocessMessage veya IMFTransform::P rocessMessage bir MFT_MESSAGE_SET_D3D_MANAGER iletisiyle çağrıldığında, kullanıcı modu eklentisi aşağıdaki yönergelere uymalıdır:

  • D3D yöneticisi sağlanmazsa (iletinin ulParam değeri 0'dır), kullanıcı modu eklentisi Döndürme düzeltmesini işlemek için herhangi bir GPU işlemini ÇAĞıRMAMALIDIR. Sonuç olarak elde edilen çerçeve sistem belleğinde bulunmalıdır.
  • Eğer D3D yöneticisi sağlanırsa (iletinin ulParam değeri bir DXGI Yöneticisinin IUnknown değeridir), bu DXGI Yöneticisi döndürme düzeltmesi için kullanılmalıdır ve sonuçta elde edilen çerçeve GPU belleğinde olmalıdır.
  • Kullanıcı modu eklentisinin çalışma zamanı sırasında D3D yöneticisi iletisini de işlemesi gerekir. MFT_MESSAGE_SET_D3D_MANAGER iletisi verildiğinde, eklenti tarafından oluşturulan sonraki çerçeve istenen bellek türüne (DXGI Yöneticisi sağlandıysa GPU, aksi takdirde CPU) karşılık gelir.
  • AV Stream sürücüsü (veya kullanıcı modu eklentisi) Döndürme düzeltmesini işlediğinde ACPI'nin PLD yapısının Döndürme alanı 0 olarak ayarlanmalıdır.

Uyarı

Otomatik Düzeltme kullanıldığında, OEM'ler ve IHD'ler _PLD Döndürme alanı aracılığıyla algılayıcının gerçek yönünü TANıTMAMALIDIR. Bu durumda , Döndürme alanı düzeltmeden sonraki yönlendirmeyi göstermelidir: 0 derece.

FSSensorOrientation aracılığıyla bildirme

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

FSSensorOrientation kayıt defteri etiketi aracılığıyla algılayıcının 0 derece olmayan yönlendirmesini bildirerek, kamera işlem hattı yakalanan çerçeveyi uygulamaya sunmadan önce düzeltebilir.

İşlem hattı, kullanım örneğine ve uygulama isteğine/senaryosuna göre GPU veya CPU kaynaklardan yararlanarak döndürme mantığını iyileştirir.

ACPI PLD Döndürme

ACPI PLD yapısının Döndürme alanı 0 olmalıdır. Bu, çerçeveyi düzeltmek için PLD bilgilerini kullanabilecek kafa karıştırıcı uygulamalardan kaçınmaktır.

Medya Türü Bilgileri

Sürücü tarafından sunulan Medya Türü düzeltilmemiş medya türü olmalıdır. FSSensorOrientation girişini kullanarak kamera işlem hattına 0 derece olmayan uzaklık bildirilirken, algılayıcı tarafından sunulan medya türü bilgilerinin düzeltilmemiş medya türü olması gerekir. Örneğin, sensör 90 derece saat yönünde ofset takılıysa, bu durumda 16:9 en boy oranı yerine, sonuçta elde edilen video 9:16 olacaktır. 9:16 en boy oranına sahip medya türü kamera işlem hattına sunulmalıdır.

İşlem hattının sayaç döndürme işlemini doğru yapılandıradığından emin olmak için bu gereklidir: İşlem hattının giriş medya türüne ve uygulamanın istenen çıkış medya türüne ihtiyacı vardır.

Bu adım uzunluğu bilgilerini içerir. Düzeltilmemiş medya türü için adım bilgileri kamera işlem hattına sunulmalıdır.

Kayıt Defteri Alt Anahtarı

FSSensorOrientation kayıt defteri girdisinin Cihaz Arabirimi düğümünde yayımlanması gerekir. Önerilen yaklaşım, bunu kamera sürücüsünün INF'sindeki AddInterface yönerge bildirimi sırasında bir AddReg yönergesi olarak bildirmektir.

FSSensorOrientation'da sunulan veriler bir REG_DWORD olmalıdır ve kabul edilen tek geçerli değerler 90, 180 ve 270 olacaktır. Diğer tüm değerler 0 derece uzaklık (yani yoksayılır) olarak değerlendirilir.

Her değer algılayıcı yönünü saat yönünde derece cinsinden temsil eder. Kamera işlem hattı, videoyu saat yönünün tersine aynı miktarda döndürerek elde edilen video çerçevesini düzeltecektir: yani 90 derecelik saat yönünde bildirim, sonuçta elde edilen video çerçevesini 0 derece uzaklıkta geri getirmek için saat yönünün tersine 90 derece döndürmeye neden olur.

MS İşletim Sistemi Tanımlayıcısı 1.0

USB tabanlı kameralar için FSSensorOrientation, MSOS tanımlayıcıları aracılığıyla da yayımlanabilir.

MS OS Tanımlayıcısı 1.0'ın iki bileşeni vardır:

  • Sabit uzunlukta üst bilgi bölümü
  • Üst bilgi bölümünü izleyen değişken uzunlukta bir veya daha fazla özel nitelikler bölümü

MS OS TANıMLAYıCısı 1.0 Üst Bilgi Bölümü

Üst Bilgi Bölümü tek bir özel özelliği (Yüz Kimliği Doğrulama Profili) açıklar.

Ofset baskı Veri Alanı Boyut (bayt) Değer Açıklama
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Sürüm 1.0
6 wIndex 2 0x0005 Genişletilmiş özellik işletim sistemi tanımlayıcısı
8 Kelime Sayısı 2 0x0001 Bir özel özellik

Özel MS OS DESCRIPTOR 1.0 Özellikler Bölümü

Ofset baskı Veri Alanı Boyut (bayt) Değer Açıklama
0 dwSize 4 0x00000036 (54) Bu özellik için toplam boyut (bayt cinsinden).
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN (Küçük Sıralı DWORD Kaydı)
8 wÖzellikAdıUzunluğu 2 0x00000024 (36) Özellik adının boyutu (bayt cinsinden).
10 bPropertyName 50 UVC-FSSensorOrientation Unicode'da "UVC-FSSensorOrientation" dizesi.
60 dwPropertyDataLength 4 0x00000004 Özellik verileri için 4 bayt (sizeof(DWORD)).
64 bPropertyData 4 Saat yönünde derece cinsinden kayma açısı. Geçerli değerler 90, 180 ve 270'tir.

MS OS Tanımlayıcısı 2.0

MSOS Extended Descriptor 2.0, FSSensorOrientation desteği eklemek için kayıt defteri değerlerini tanımlamak için kullanılabilir. Bu işlem Microsoft OS 2.0 Kayıt Defteri Özellik Tanımlayıcısı kullanılarak yapılır.

UVC-FSSensorOrientation kayıt defteri girdisi için, aşağıda örnek bir MSOS 2.0 tanımlayıcı kümesi gösterilmektedir:

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)
}

ACPI PLD Bilgileri aracılığıyla bildirme

Son çare seçeneği olarak PLD bilgileri, uygulamaya video çerçevesinin işlenmeden/kodlanmadan önce düzeltilmesi gerektiğini belirtmek için yukarıda açıklandığı gibi kullanılabilir. Ancak, belirtildiği gibi, mevcut uygulamaların çoğu PLD bilgilerini kullanmaz veya çerçeve döndürmeyi işlemez, bu nedenle uygulamaların sonuçta elde edilen videoyu düzgün işleyemeyeceği senaryolar olacaktır.

Aşağıdaki şekiller, her donanım yapılandırması için _PLD Döndürme alanının değerlerini gösterir:

Döndürme: Saat yönünde 0 derece

0 derece rotasyonlu şekil.

Yukarıdaki şekilde:

  • Soldaki resim, yakalanacak sahneyi gösterir.

  • Ortadaki resimde, fiziksel okuma sırası sol alt köşeden sağdan yukarı doğru hareket ederek başlayan bir CMOS algılayıcısı tarafından bir sahnenin nasıl görüntülendiği gösterilmektedir.

  • Sağdaki resim, kamera sürücüsünün çıkışını temsil eder. Bu örnekte, ekran kendi doğal yönlendirmesindeyken ve ek döndürme olmaksızın, medya arabelleğinin içeriği doğrudan işlenebilir. Sonuç olarak, ACPI _PLD Döndürme alanının değeri 0'dır.

Döndürme: Saat yönünde 90 derece

90 derece dönüş şekli.

Bu durumda, medya arabelleğinin içeriği özgün sahneyle karşılaştırıldığında saat yönünde 90 derece döndürülür. Sonuç olarak, ACPI _PLD Döndürme alanı 2 değerine sahiptir.

Döndürme: Saat yönünde 180 derece

180 derece dönüş şekli.

Bu durumda, medya arabelleğinin içeriği özgün sahneyle karşılaştırıldığında saat yönünde 180 derece döndürülür. Sonuç olarak, ACPI _PLD Döndürme alanının değeri 4'tür.

Döndürme: Saat yönünde 270 derece

270 derece dönüş şekli.

Bu durumda, medya arabelleğinin içeriği özgün sahneyle karşılaştırıldığında saat yönünde 270 derece döndürülür. Sonuç olarak, ACPI _PLD Döndürme alanının değeri 6'dır.