Aliran output
Subsistem kamera beroperasi hanya pada pipeline berbasis ANativeWindow untuk semua resolusi dan format output. Beberapa streaming dapat dikonfigurasi sekaligus untuk mengirimkan satu frame ke banyak target seperti GPU, encoder video, RenderScript, atau buffer yang terlihat oleh aplikasi (buffer RAW Bayer, buffer YUV yang diproses, atau buffer yang dienkode JPEG).
Sebagai pengoptimalan, aliran output ini harus dikonfigurasi terlebih dahulu, dan hanya sejumlah kecil yang dapat ada sekaligus. Hal ini memungkinkan pra-alokasi buffer memori dan konfigurasi hardware kamera, sehingga saat permintaan dikirimkan dengan beberapa atau berbagai pipeline output yang tercantum, tidak akan ada penundaan atau latensi dalam memenuhi permintaan.
Untuk mengetahui informasi lebih lanjut tentang kombinasi output streaming yang dijamin
yang bergantung pada tingkat hardware yang didukung, lihat
createCaptureSession()
.
Memotong
Pemangkasan array piksel penuh (untuk zoom digital dan kasus penggunaan lain yang memerlukan FOV yang lebih kecil) dikomunikasikan melalui setelan ANDROID_SCALER_CROP_REGION. Ini adalah setelan per permintaan, dan dapat berubah berdasarkan per permintaan, yang penting untuk menerapkan zoom digital yang lancar.
Area ditentukan sebagai persegi panjang (x, y, lebar, tinggi), dengan (x, y) yang menjelaskan sudut kiri atas persegi panjang. Persegi panjang ditentukan pada sistem koordinat array piksel aktif sensor, dengan (0,0) adalah piksel kiri atas array piksel aktif. Oleh karena itu, lebar dan tinggi tidak boleh lebih besar dari dimensi yang dilaporkan di kolom info statis ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Lebar dan tinggi minimum yang diizinkan dilaporkan oleh HAL melalui kolom info statis ANDROID_SCALER_MAX_DIGITAL_ZOOM, yang menjelaskan faktor zoom maksimum yang didukung. Oleh karena itu, lebar dan tinggi area pemangkasan minimum 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 area pangkas harus memenuhi persyaratan tertentu (misalnya, harus dimulai pada koordinat genap, dan lebar/tingginya harus genap), HAL harus melakukan pembulatan yang diperlukan dan menulis area pangkas akhir yang digunakan dalam metadata hasil output. Demikian pula, jika HAL menerapkan stabilisasi video, HAL harus menyesuaikan wilayah pemangkasan hasil untuk mendeskripsikan wilayah yang benar-benar disertakan dalam output setelah stabilisasi video diterapkan. Secara umum, aplikasi yang menggunakan kamera harus dapat menentukan ruang pandang yang diterimanya berdasarkan area pangkas, dimensi sensor gambar, dan panjang fokus lensa.
Karena wilayah pangkas berlaku untuk semua aliran, yang mungkin memiliki rasio aspek yang berbeda dengan wilayah pangkas, wilayah sensor yang tepat yang digunakan untuk setiap aliran mungkin lebih kecil daripada wilayah pangkas. Secara khusus, setiap aliran harus mempertahankan piksel persegi dan rasio aspeknya dengan memangkas lebih lanjut area pemangkasan yang ditentukan secara minimal. Jika rasio aspek streaming lebih lebar daripada area pangkas, streaming harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek streaming lebih sempit daripada area pangkas, streaming harus dipangkas lebih lanjut secara horizontal.
Dalam semua kasus, pemangkasan streaming harus dipusatkan dalam area pemangkasan penuh, dan setiap streaming hanya dipangkas secara horizontal atau vertikal relatif terhadap area pemangkasan penuh, tidak pernah keduanya.
Misalnya, jika dua aliran ditentukan, aliran 640x480 (aspek 4:3), dan aliran 1280x720 (aspek 16:9), di bawah ini menunjukkan wilayah output yang diharapkan untuk setiap aliran untuk beberapa wilayah pangkas contoh, pada sensor 3 MP (array piksel 2000 x 1500) hipotetis.
Area pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Pangkas streaming 640x480: (500, 375, 1000, 750) (sama dengan area pangkas)
Pangkas streaming 1280x720: (500, 469, 1000, 562)

Gambar 1. Rasio aspek 4:3
Wilayah pangkas: (500, 375, 1333, 750) (rasio aspek 16:9)
Pangkas streaming 640x480: (666, 375, 1000, 750)
Pangkas streaming 1280x720: (500, 375, 1333, 750) (sama dengan wilayah pangkas)

Gambar 2. Rasio lebar tinggi 16:9
Area pangkas: (500, 375, 750, 750) (rasio aspek 1:1)
Pangkas streaming 640x480: (500, 469, 750, 562)
Pangkas streaming 1280x720: (500, 543, 750, 414)

Gambar 3. Rasio aspek 1:1
Dan contoh terakhir, streaming rasio aspek persegi 1024x1024, bukan streaming 480p:
Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Pangkasan streaming 1024x1024: (625, 375, 750, 750)
Pangkasan streaming 1280x720: (500, 469, 1000, 562)

Gambar 4. Rasio aspek 4:3, persegi
Memproses ulang
Dukungan tambahan untuk file gambar mentah disediakan oleh dukungan pemrosesan ulang untuk data RAW Bayer. Dukungan ini memungkinkan pipeline kamera memproses buffer dan metadata RAW yang sebelumnya diambil (seluruh frame yang direkam sebelumnya), untuk menghasilkan output YUV atau JPEG baru yang dirender.
Zoom
Untuk perangkat yang menjalankan Android 11 atau yang lebih tinggi, aplikasi dapat menggunakan zoom kamera
(digital dan optik) melalui setelan ANDROID_CONTROL_ZOOM_RATIO
.
Rasio zoom ditentukan sebagai faktor floating point. Daripada
menggunakan ANDROID_SCALER_CROP_REGION
untuk pemangkasan dan zoom, aplikasi dapat menggunakan
ANDROID_CONTROL_ZOOM_RATIO
untuk mengontrol tingkat zoom, dan menggunakan
ANDROID_SCALER_CROP_REGION
untuk pemangkasan horizontal dan vertikal guna
mencapai rasio aspek yang berbeda dengan sensor kamera bawaan.
Sistem multi-kamera dapat berisi lebih dari satu lensa dengan panjang fokus yang berbeda, dan pengguna dapat menggunakan zoom optik dengan beralih antar-lensa.
Penggunaan ANDROID_CONTROL_ZOOM_RATIO
memiliki manfaat dalam skenario di bawah:
- Memperbesar dari lensa lebar ke lensa telefoto: Rasio floating point
memberikan presisi yang lebih baik dibandingkan dengan nilai bilangan bulat
ANDROID_SCALER_CROP_REGION
. - Mengecilkan tampilan dari lensa lebar ke lensa ultra lebar:
ANDROID_CONTROL_ZOOM_RATIO
mendukung pengecilan tampilan (<1.0f), sedangkanANDROID_SCALER_CROP_REGION
tidak.
Rasio zoom: 2,0; 1/4 dari bidang pandang asli
Wilayah pangkas: (0, 0, 2000, 1500) (rasio aspek 4:3)
Pangkasan streaming 640x480: (0, 0, 2000, 1500) (sama dengan wilayah pangkas)
Pangkasan streaming 1280x720: (0, 187, 2000, 1125)

Gambar 5. Zoom 2.0, rasio aspek 4:3
Rasio zoom: 2,0; 1/4 dari bidang pandang asli
Area pangkas: (0, 187, 2000, 1125) (rasio aspek 16:9)
Pangkasan streaming 640x480: (250, 187, 1500, 1125) (pillarbox)
Pangkasan streaming 1280x720: (0, 187, 2000, 1125) (sama dengan area pangkas)

Gambar 6. Zoom 2.0, rasio aspek 16:9
Rasio zoom: 0,5; 4x bidang pandang asli (beralih dari lensa lebar ke lensa ultra lebar)
Wilayah pangkas: (250, 0, 1500, 1500) (rasio aspek 1:1)
Pangkasan streaming 640x480: (250, 187, 1500, 1125) (tampilan lebar)
Pangkasan streaming 1280x720: (250, 328, 1500, 844) (tampilan lebar)

Gambar 7. Zoom 0,5, rasio aspek 1:1
Seperti yang terlihat dari grafik di atas, sistem koordinat wilayah pangkas berubah menjadi bidang pandang efektif setelah zoom, dan direpresentasikan oleh persegi panjang dengan dimensi berikut: (0
, 0
, activeArrayWith
, activeArrayHeight
). Hal yang sama berlaku untuk wilayah AE/AWB/AF dan wajah. Perubahan sistem koordinat ini tidak berlaku untuk pengambilan gambar RAW dan metadatanya yang terkait seperti intrinsicCalibration
dan lensShadingMap
.
Dengan menggunakan contoh hipotetis yang sama di atas, dan dengan asumsi bahwa aliran output #1 (640x480) adalah aliran jendela bidik, zoom 2,0x dapat dicapai dengan salah satu dari dua cara:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(default),scaler.cropRegion = (500, 375, 1000, 750)
Agar aplikasi menetapkan android.control.aeRegions
sebagai seperempat
bidang pandang kiri atas dari bidang pandang, tetapkan
android.control.aeRegions
ke (0, 0, 1000, 750)
dengan
android.control.zoomRatio
ditetapkan ke 2.0
. Atau,
aplikasi dapat menyetel android.control.aeRegions
ke wilayah
(500, 375, 1000, 750)
yang setara untuk
android.control.zoomRatio
dari 1.0
.