Aliran output
Subsistem kamera hanya beroperasi pada pipeline berbasis ANativeWindow untuk semua resolusi dan format output. Beberapa streaming dapat dikonfigurasi di satu kali mengirim satu frame ke banyak target seperti GPU, video encoder, RenderScript, atau buffer yang terlihat oleh aplikasi (RAW Bayer, YUV yang diproses buffer berenkode JPEG).
Sebagai pengoptimalan, streaming output ini harus dikonfigurasi terlebih dahulu, dan hanya boleh ada jumlah terbatas yang akan dibuat sekaligus. Hal ini memungkinkan pra-alokasi {i>buffer<i} memori dan konfigurasi perangkat keras kamera, sehingga ketika permintaan dikirimkan dengan beberapa atau berbagai pipeline output yang terdaftar, tidak akan penundaan atau latensi dalam memenuhi permintaan.
Untuk mengetahui informasi lebih lanjut tentang kombinasi output streaming terjamin
yang tergantung pada tingkat perangkat
keras yang didukung, lihat
createCaptureSession()
.
Memotong
Pemangkasan larik piksel penuh (untuk zoom digital dan kasus penggunaan lain di mana FOV yang lebih kecil diinginkan) dikomunikasikan melalui ANDROID_SCALER_CROP_REGION deskripsi tempat. Ini adalah setelan per permintaan, dan dapat berubah berdasarkan permintaan, yang penting untuk implementasi zoom digital yang lancar.
Area didefinisikan sebagai persegi panjang (x, y, lebar, tinggi), dengan (x, y) yang menjelaskan sudut kiri atas persegi panjang. Persegi panjang didefinisikan pada dari array piksel aktif sensor, dengan (0,0) adalah nilai piksel kiri atas dari array piksel aktif. Oleh karena itu, lebar dan tinggi tidak boleh lebih besar dari dimensi yang dilaporkan dalam ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY {i>static info <i}(info statis). Lebar dan tinggi minimum yang diizinkan dilaporkan oleh HAL melalui bidang info statis ANDROID_SCALER_MAX_DIGITAL_ZOOM, yang menjelaskan faktor zoom maksimum yang didukung. Oleh karena itu, lebar area pemangkasan minimum dan tingginya adalah:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Jika wilayah pangkalan perlu memenuhi persyaratan tertentu (misalnya, perlu untuk memulai koordinat yang genap, dan lebar/tingginya harus genap), HAL harus melakukan pembulatan yang diperlukan dan menuliskan wilayah pemangkasan akhir yang digunakan dalam metadata hasil output. Demikian pula, jika HAL menerapkan stabilisasi video, harus menyesuaikan area pemangkasan hasil untuk mendeskripsikan wilayah yang sebenarnya disertakan dalam output setelah stabilisasi video diterapkan. Secara umum, model aplikasi harus dapat menentukan ruang pandang yang diterimanya berdasarkan area pemangkasan, dimensi sensor gambar, dan panjang fokus lensa.
Karena wilayah pangkas berlaku untuk semua aliran data, yang mungkin memiliki aspek berbeda daripada area pemangkasan, area sensor yang tepat yang digunakan untuk setiap aliran mungkin lebih kecil dari area pemangkasan. Secara khusus, setiap aliran data harus mempertahankan piksel dan rasio aspeknya dengan memangkas lebih sedikit pemangkasan yang ditentukan teritorial Anda. Jika rasio aspek streaming lebih lebar dari area pemangkasan, streaming harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek streaming lebih sempit dari area pangkas, aliran harus dipangkas lebih lanjut secara horizontal.
Dalam semua kasus, pemangkasan aliran harus dipusatkan dalam area pemangkasan penuh, dan setiap streaming hanya dipangkas secara horizontal atau vertikal sesuai dengan wilayah pangkas, bukan keduanya.
Misalnya, jika dua streaming ditentukan, streaming 640x480 (aspek 4:3), dan Streaming 1280x720 (aspek 16:9), di bawah ini menunjukkan region output yang diharapkan untuk setiap aliran data untuk beberapa wilayah tanaman sampel, dengan resolusi 3 MP (2000 x sensor (array 1500 piksel).
Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Crop aliran 640x480: (500, 375, 1000, 750) (sama dengan wilayah pangkas)
Crop stream 1280x720: (500, 469, 1000, 562)
Wilayah pangkas: (500, 375, 1333, 750) (rasio aspek 16:9)
Crop feed 640x480: (666, 375, 1000, 750)
Crop stream 1280x720: (500, 375, 1333, 750) (sama dengan wilayah pemangkasan)
Wilayah pangkas: (500, 375, 750, 750) (rasio aspek 1:1)
Crop stream 640x480: (500, 469, 750, 562)
Crop stream 1280x720: (500, 543, 750, 414)
Dan contoh terakhir, streaming rasio aspek persegi 1024x1024, bukan 480p
feed:
Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Crop feed 1024x1024: (625, 375, 750, 750)
Crop stream 1280x720: (500, 469, 1000, 562)
Memproses ulang
Dukungan tambahan untuk file gambar mentah diberikan dengan dukungan pemrosesan ulang untuk RAW Bayer layanan otomatis dan data skalabel. Dukungan ini memungkinkan pipeline kamera untuk memproses rekaman Buffering RAW dan metadata (seluruh frame yang direkam sebelumnya), untuk menghasilkan output YUV atau JPEG baru yang dirender.
Zoom
Untuk perangkat yang menjalankan Android 11 atau yang lebih baru, aplikasi dapat menggunakan zoom kamera
(digital dan optik) melalui setelan ANDROID_CONTROL_ZOOM_RATIO
.
Rasio zoom ditentukan sebagai faktor floating point. Daripada fokus pada
menggunakan ANDROID_SCALER_CROP_REGION
untuk memangkas dan melakukan zoom, aplikasi dapat menggunakan
ANDROID_CONTROL_ZOOM_RATIO
untuk mengontrol tingkat zoom dan menggunakan
ANDROID_SCALER_CROP_REGION
untuk pemangkasan horizontal dan vertikal ke
mencapai rasio aspek yang berbeda dari sensor kamera native.
Sistem multi-kamera dapat berisi lebih dari satu lensa dengan
panjang fokus, dan pengguna dapat menggunakan zoom optik dengan beralih di antara lensa.
Penggunaan ANDROID_CONTROL_ZOOM_RATIO
memiliki beberapa manfaat dalam skenario di bawah:
- Memperbesar dari lensa lebar ke lensa telefoto: Rasio floating point
memberikan presisi yang lebih baik dibandingkan dengan
ANDROID_SCALER_CROP_REGION
. - Memperkecil dari lensa lebar ke lensa ultrawide:
ANDROID_CONTROL_ZOOM_RATIO
mendukung perkecil (<1.0f) sedangkanANDROID_SCALER_CROP_REGION
tidak.
Rasio zoom: 2,0; 1/4 ruang pandang asli
Wilayah pangkas: (0, 0, 2000, 1500) (rasio aspek 4:3)
Crop aliran 640x480: (0, 0, 2000, 1500) (sama dengan wilayah pangkas)
Crop stream 1280x720: (0, 187, 2000, 1125)
Rasio zoom: 2,0; 1/4 ruang pandang asli
Wilayah pangkas: (0, 187, 2000, 1125) (rasio aspek 16:9)
Crop stream 640x480: (250, 187, 1500, 1125) (tampilan tinggi)
Crop stream 1280x720: (0, 187, 2000, 1125) (sama dengan wilayah panen)
Rasio zoom: 0,5; 4x ruang pandang asli (dialihkan dari lensa lebar ke lensa ultrawide)
Wilayah pangkas: (250, 0, 1500, 1500) (rasio aspek 1:1)
Crop stream 640x480: (250, 187, 1500, 1125) (tampilan lebar)
Crop stream 1280x720: (250, 328, 1500, 844) (tampilan lebar)
Seperti yang terlihat dari grafik di atas, sistem koordinat wilayah pangkalan berubah menjadi
setelah zoom, dan direpresentasikan oleh persegi panjang dengan dimensi berikut:
(0
, 0
, activeArrayWith
, activeArrayHeight
).
Hal yang sama berlaku untuk area dan wajah AE/AWB/AF. Perubahan sistem koordinat ini tidak berlaku untuk
Rekaman RAW dan metadata terkaitnya, seperti intrinsicCalibration
dan
lensShadingMap
.
Menggunakan contoh hipotesis yang sama di atas, dan dengan asumsi aliran output #1 (640x480) adalah streaming jendela bidik, zoom 2,0x dapat dicapai dengan salah satu dari dua cara berikut:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(default),scaler.cropRegion = (500, 375, 1000, 750)
Untuk aplikasi agar menyetel android.control.aeRegions
ke kiri atas
seperempat ruang pandang jendela bidik, disetel
android.control.aeRegions
ke (0, 0, 1000, 750)
dengan
android.control.zoomRatio
disetel ke 2.0
. Sebagai alternatif,
aplikasi dapat menetapkan android.control.aeRegions
ke nilai yang setara
wilayah (500, 375, 1000, 750)
untuk
android.control.zoomRatio
dari 1.0
.