Bagikan melalui


Dukungan driver untuk orientasi kamera

Penting

Metode Koreksi otomatis yang dibahas nanti dalam topik ini adalah solusi yang direkomendasikan untuk pemasangan orientasi non-referensi sensor kamera. Ini untuk memastikan kompatibilitas aplikasi karena sebagian besar aplikasi yang sudah ditulis untuk menggunakan umpan kamera tidak tahu untuk memeriksa, atau benar untuk informasi rotasi. Harap tinjau informasi dengan cermat di bagian perbaikan otomatis di bawah ini.

Karena berbagai faktor bentuk perangkat komputasi diperkenalkan, beberapa batasan fisik mengakibatkan sensor kamera dipasang dalam orientasi non-tradisional. Karena itu, perlu untuk menggambarkan dengan benar ke OS dan aplikasi, bagaimana sensor dipasang sehingga video yang dihasilkan dapat dirender/direkam dengan benar.

Dimulai dengan Jendela 10, versi 1607, semua driver kamera diperlukan untuk secara eksplisit menentukan orientasi kamera terlepas dari apakah kamera dipasang sesuai dengan Persyaratan perangkat keras minimum. Secara khusus, driver kamera harus mengatur bidang yang baru diperkenalkan, Rotasi, dalam struktur _PLD ACPI yang terkait dengan antarmuka perangkat tangkapan:

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;

Untuk kamera, bidang Rotasi dalam struktur acpi _PLD menentukan jumlah derajat ('0' untuk 0°, '2' selama 90°, '4' untuk 180°, dan '6' untuk 270°) bingkai yang diambil diputar relatif terhadap layar saat layar berada dalam orientasi aslinya.

Berdasarkan nilai di bidang Rotasi , aplikasi dapat melakukan rotasi tambahan, jika perlu, untuk merender bingkai yang diambil dengan benar.

Nilai Rotasi

Untuk perangkat yang kamera dan layarnya memiliki perumahan yang sama (atau/penutup casing), dimungkinkan untuk memasang periferal ini pada permukaan yang berbeda dengan masing-masing diputar oleh derajat tetap namun semena-mena pada bidang masing-masing. Akibatnya, aplikasi membutuhkan mekanisme untuk menggambarkan hubungan spasial antara kedua periferal sededimikian rupa sehingga bingkai yang ditangkap dapat ditransposisikan ke permukaan penyajian dalam orientasi yang benar.

Salah satu cara untuk menyelesaikan masalah adalah dengan menggunakan struktur acpi _PLD yang sudah memiliki konsep permukaan dan derajat rotasi yang ditentukan. Misalnya, struktur _PLD sudah memiliki bidang panel yang menentukan permukaan tempat periferal berada:

Bidang panel PLD ACPI.

Definisi bidang Panel _PLD ACPI (Rev. 5.0a)

Dua diagram berikutnya menggambarkan definisi setiap panel secara visual:

Definisi panel untuk PC desktop dan sebagian besar perangkat

Definisi panel - desktop.

Definisi panel untuk perangkat yang dapat dilipat

Definisi panel - perangkat yang dapat dilipat.

Bahkan, konsep "panel" ACPI sudah diadopsi oleh Windows di mana:

Struktur _PLD ACPI juga memiliki bidang Rotasi yang didefinisikan sebagai berikut:

Definisi bidang Acpi _PLD Rotasi (Rev 5.0a)

Definisi bidang ACPI _PLD Rotasi.

Alih-alih menggunakan definisi di atas apa adanya, kami lebih menyempurnakannya untuk menghindari ambiguitas:

  • Untuk kamera, bidang Rotasi dalam struktur acpi _PLD menentukan jumlah derajat ('0' untuk 0°, '2' selama 90°, '4' untuk 180°, dan '6' untuk 270°) bingkai yang diambil diputar relatif terhadap layar saat layar berada dalam orientasi aslinya.

Primer Lanskap vs Potret Primer

Di Windows, seseorang dapat mengkueri orientasi tampilan asli dengan memanggil properti , Windows.Graphics.Display.DisplayInformation.NativeOrientation, yang mengembalikan Lanskap atau Potret:

Tampilkan pola pemindaian orientasi asli.

Tidak peduli nilai mana yang dikembalikan NativeOrientation , pola pemindaian tampilan logis dimulai dari sudut kiri atas layar bergerak dari kiri ke kanan ke bawah (lihat Gambar 5). Untuk perangkat yang orientasi fisik defaultnya tidak eksplisit, properti ini tidak hanya menyiratkan lokasi panel Atas ACPI tetapi juga menyediakan hubungan spasial antara buffer output kamera dan permukaan penyajian.

Perhatikan bahwa, tidak seperti kamera, properti NativeOrientation tidak didasarkan pada ACPI dan dengan demikian tidak memiliki struktur _PLD. Ini benar meskipun tampilan dipasang secara statis ke perangkat.

Saat memasang pada perangkat Portrait Primary, driver kamera harus menyadari bahwa sebagian besar aplikasi akan memperlakukan perangkat sebagai menghasilkan buffer output kamera lanskap terlepas dari orientasi buffer output kamera yang sebenarnya. Karena itu, kami menyarankan agar driver kamera menghasilkan buffer kamera yang memiliki offset orientasi 90 derajat dari NativeOrientation Portrait saat berada di perangkat Portrait Primary. Ini kemudian akan memungkinkan aplikasi yang melakukan rotasi tambahan ini pada perangkat potret untuk memperbaiki rotasi ke orientasi yang diharapkan. Ini dapat diverifikasi menggunakan Aplikasi Kamera dengan Sampel Rotasi.

Pemasangan Offset

IHV/OEM sangat dianjurkan untuk menghindari pemasangan sensor dalam offset non-0 derajat untuk menjaga kompatibilitas aplikasi. Banyak aplikasi yang ada dan warisan tidak tahu untuk mencari tabel PLD ACPI, juga tidak akan mencoba memperbaiki offset non-0 derajat. Akibatnya, untuk aplikasi tersebut, video yang dihasilkan akan dirender dengan tidak benar.

Dalam kasus di mana IHV/OEM tidak dapat memasang sensor dalam orientasi 0 derajat seperti yang dijelaskan di atas, langkah-langkah mitigasi berikut direkomendasikan dalam urutan preferensi:

  1. Koreksi otomatis orientasi non-0 derajat dalam Driver Kamera (baik dalam mode kernel dengan driver miniport aliran AV atau dalam mode pengguna menggunakan plug in seperti Device MFT atau MFT0) sehingga bingkai output yang dihasilkan berada dalam orientasi 0 derajat.

  2. Deklarasikan orientasi non-0 derajat melalui tag FSSensorOrientation sehingga Alur Kamera dapat memperbaiki gambar yang diambil.

  3. Deklarasikan orientasi non-0 derajat dalam tabel PLD ACPI seperti yang dijelaskan di atas.

Tipe Media Terkompresi/Dikodekan

Untuk Tipe Media Terkompresi dan/atau Terkodekan (seperti MJPG, JPEG, H264, HEVC), alur yang benar tidak dapat digunakan. Karena itu, Tipe Media Terkompresi/Dikodekan akan difilter jika FSSensorOrientation diatur ke nilai bukan nol.

Dalam kasus jenis media MJPG (seperti dari kamera UVC), alur Frame Server menyediakan jenis media yang didekodekan secara otomatis (NV12 atau YUY2 untuk aplikasi berbasis DShow). Jenis media yang didekode otomatis dan diperbaiki akan disajikan, tetapi format MJPG asli tidak akan disajikan.

[! CATATAN!] Jika Jenis Media Terkompresi/Dikodekan harus diekspos ke aplikasi, IHV/ODM tidak boleh menggunakan koreksi FSSensorOrientation. Sebaliknya, koreksi harus dilakukan oleh driver kamera (baik dalam mode kernel melalui driver AV Stream atau dalam mode pengguna melalui DMFT/MFT0).

Koreksi Otomatis melalui AV Stream Miniport/Device MFT/MFT0

Skenario yang direkomendasikan jika sensor tidak dapat dipasang dengan offset 0 derajat, adalah memiliki driver miniport Stream AV (atau plug in mode pengguna dalam bentuk DMFT atau MFT0) memperbaiki bingkai yang diambil yang dihasilkan sehingga terekspos ke alur dalam offset 0 derajat.

Saat mengoreksi bingkai video dari AV Stream Miniport dan/atau plug in Device MFT/MFT0, deklarasi jenis media yang dihasilkan harus didasarkan pada bingkai yang dikoreksi. Jika sensor dipasang pada offset 90 derajat sehingga video yang dihasilkan adalah rasio aspek 9:16 dari sensor, tetapi video yang dikoreksi adalah 16:9, jenis media harus menyatakan rasio aspek 16:9.

Ini termasuk informasi langkah yang dihasilkan. Hal ini diperlukan karena komponen yang bertanggung jawab untuk melakukan koreksi dikendalikan oleh IHV/OEM dan alur kamera tidak memiliki visibilitas ke dalam bingkai video kecuali setelah diperbaika.

Sangat disarankan agar koreksi dilakukan dalam mode pengguna dan kontrak API antara alur dan plugin mode pengguna harus diikuti. Secara khusus, saat menggunakan DMFT atau MFT0, ketika IMFDeviceTransform::P rocessMessage atau IMFTransform::P rocessMessage dipanggil dengan pesan MFT_MESSAGE_SET_D3D_MANAGER, plugin mode pengguna harus mematuhi panduan berikut:

  • Jika tidak ada manajer D3D yang disediakan (ulParam pesan adalah 0), plugin mode pengguna TIDAK boleh memanggil operasi GPU apa pun untuk menangani koreksi Rotasi. Dan bingkai yang dihasilkan harus disediakan dalam memori sistem.
  • Jika manajer D3D disediakan (ulParam pesan adalah IUnknown dari Manajer DXGI), Manajer DXGI harus digunakan untuk koreksi Rotasi dan bingkai yang dihasilkan harus memori GPU.
  • Plugin mode pengguna juga harus menangani pesan manajer D3D selama runtime. Ketika pesan MFT_MESSAGE_SET_D3D_MANAGER dikeluarkan, bingkai berikutnya yang dihasilkan oleh plugin harus sesuai dengan jenis memori yang diminta (yaitu, GPU jika Manajer DXGI disediakan, CPU sebaliknya).
  • Ketika driver AV Stream (atau plugin mode pengguna) menangani koreksi Rotasi, bidang Rotasi struktur PLD ACPI harus diatur ke 0.

Catatan

Ketika Koreksi Otomatis digunakan, OEM dan IHV TIDAK boleh mengiklankan orientasi sensor yang sebenarnya melalui bidang Rotasi _PLD. Dalam hal ini, bidang Rotasi harus menunjukkan orientasi setelah koreksi: 0 derajat.

Deklarasikan melalui FSSensorOrientation

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

Dengan mendeklarasikan orientasi non-0 derajat sensor melalui tag registri FSSensorOrientation, alur kamera dapat memperbaiki bingkai yang ditangkap sebelum menyajikannya ke aplikasi.

Alur akan mengoptimalkan logika rotasi dengan memanfaatkan sumber daya GPU atau CPU berdasarkan kasus penggunaan dan permintaan/skenario aplikasi.

Rotasi PLD ACPI

Bidang Rotasi struktur PLD ACPI harus 0. Ini untuk menghindari aplikasi yang membingungkan yang dapat menggunakan informasi PLD untuk memperbaiki bingkai.

Informasi Jenis Media

Tipe Media yang disajikan oleh pengandar haruslah tipe media yang tidak dikoreksi. Saat menginformasikan alur kamera offset non-0 derajat menggunakan entri FSSensorOrientation, informasi jenis media yang disajikan oleh sensor harus merupakan jenis media yang tidak salah. Misalnya, jika sensor dipasang offset searah jajaran 90 derajat, jadi alih-alih rasio aspek 16:9, video yang dihasilkan adalah 9:16, jenis media rasio aspek 9:16 harus disajikan ke alur kamera.

Ini diperlukan untuk memastikan alur dapat mengonfigurasi proses rotasi penghitung dengan benar: Alur membutuhkan jenis media input dan jenis media output yang diinginkan dari aplikasi.

Ini termasuk informasi langkah. Informasi langkah harus disajikan untuk jenis media yang tidak dikoreksi ke alur kamera.

Subkunci Registri

Entri registri FSSensorOrientation harus diterbitkan pada simpul Antarmuka Perangkat. Pendekatan yang disarankan adalah mendeklarasikan ini sebagai arahan AddReg selama deklarasi direktif AddInterface di INF driver kamera.

Data yang disajikan dalam FSSensorOrientation harus berupa REG_DWORD dan satu-satunya nilai yang valid yang diterima adalah 90, 180, dan 270. Nilai lain akan diperlakukan sebagai offset 0 derajat (yaitu, diabaikan).

Setiap nilai mewakili orientasi sensor dalam derajat searah jajaran. Alur kamera akan memperbaiki bingkai video yang dihasilkan dengan memutar video dengan jumlah yang sama berlawanan searah jarang: yaitu, deklarasi searah jarang 90 derajat akan menghasilkan rotasi searah jarang 90 derajat untuk membawa bingkai video yang dihasilkan kembali ke offset 0 derajat.

Deskriptor OS MS 1.0

Untuk kamera berbasis USB, FSSensorOrientation juga dapat diterbitkan melalui deskriptor MSOS.

MS OS Descriptor 1.0 memiliki dua komponen:

  • Bagian header dengan panjang tetap
  • Satu atau beberapa bagian properti kustom panjang variabel, yang mengikuti bagian header

Bagian Header MS OS DESCRIPTOR 1.0

Bagian Header menjelaskan satu properti kustom (Profil Face Auth).

Offset Bidang Ukuran (byte) Nilai Deskripsi
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Versi 1.0
6 Windex 2 0x0005 Deskriptor OS properti yang diperluas
8 wCount 2 0x0001 Satu properti kustom

Bagian Properti MS OS DESCRIPTOR 1.0 Kustom

Offset Bidang Ukuran (byte) Nilai Deskripsi
0 dwSize 4 0x00000036 (54) Ukuran total (dalam byte) untuk properti ini.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Ukuran (dalam byte) dari nama properti.
10 bPropertyName 50 UVC-FSSensorOrientation String "UVC-FSSensorOrientation" di Unicode.
60 dwPropertyDataLength 4 0x00000004 4 byte untuk data properti (sizeof(DWORD)).
64 bPropertyData 4 Sudut offset dalam derajat searah jarum jam. Nilai yang valid adalah 90, 180, dan 270.

Deskriptor MS OS 2.0

MSOS Extended Descriptor 2.0 dapat digunakan untuk menentukan nilai registri untuk menambahkan dukungan FSSensorOrientation. Ini dilakukan menggunakan Deskriptor Properti Registri Microsoft OS 2.0.

Untuk entri registri UVC-FSSensorOrientation, berikut ini memperlihatkan contoh set deskriptor 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)
}

Mendeklarasikan melalui Informasi PLD ACPI

Sebagai opsi upaya terakhir, informasi PLD dapat dimanfaatkan seperti yang dijelaskan di atas untuk menunjukkan kepada aplikasi bahwa bingkai video harus dikoreksi sebelum dirender/dikodekan. Namun, seperti yang dinyatakan, banyak aplikasi yang ada tidak menggunakan informasi PLD atau menangani rotasi bingkai, sehingga akan ada skenario di mana aplikasi mungkin tidak dapat merender video yang dihasilkan dengan benar.

Gambar berikut mengilustrasikan nilai bidang rotasi _PLD untuk setiap konfigurasi perangkat keras:

Rotasi: 0 derajat searah jajar

Angka rotasi 0 derajat.

Pada gambar di atas:

  • Gambar di sebelah kiri menggambarkan adegan untuk diambil.

  • Gambar di tengah menggambarkan bagaimana adegan dilihat oleh sensor CMOS yang urutan pembacaan fisiknya dimulai dari sudut kiri bawah bergerak dari kiri ke kanan ke atas.

  • Gambar di sebelah kanan mewakili output driver kamera. Dalam contoh ini, konten buffer media dapat dirender secara langsung sementara tampilan adalah orientasi aslinya tanpa rotasi tambahan. Akibatnya, bidang ACPI _PLD Rotasi memiliki nilai 0.

Rotasi: 90 derajat searah jajar

Angka rotasi 90 derajat.

Dalam hal ini, konten buffer media diputar sebesar 90 derajat searah jarang dibandingkan dengan adegan asli. Akibatnya, bidang ACPI _PLD Rotasi memiliki nilai 2.

Rotasi: 180 derajat searah jajar

Angka rotasi 180 derajat.

Dalam hal ini, konten buffer media diputar sebesar 180 derajat searah jarang dibandingkan dengan adegan aslinya. Akibatnya, bidang ACPI _PLD Rotasi memiliki nilai 4.

Rotasi: 270 derajat searah jajar

Angka rotasi 270 derajat.

Dalam hal ini, konten buffer media diputar sebesar 270 derajat searah jarang dibandingkan dengan adegan aslinya. Akibatnya, bidang ACPI _PLD Rotasi memiliki nilai 6.