Aliran output
Subsistem kamera beroperasi hanya pada pipeline berbasis ANativeWindow untuk semua resolusi dan format output. Beberapa streaming dapat dikonfigurasi sekaligus untuk mengirim satu frame ke banyak target seperti GPU, encoder video, RenderScript, atau buffering yang terlihat aplikasi (RAW Bayer, buffering YUV yang diproses, atau buffering yang dienkode JPEG).
Sebagai pengoptimalan, streaming output ini harus dikonfigurasi sebelumnya, dan hanya boleh ada sejumlah terbatas yang sekaligus. Hal ini memungkinkan pra-alokasi buffering 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 informasi lebih lanjut tentang kombinasi output streaming terjamin
yang bergantung pada level hardware yang didukung, lihat
createCaptureSession()
.
Memotong
Pemangkasan array piksel penuh (untuk zoom digital dan kasus penggunaan lain yang menginginkan 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.
Wilayah 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) menjadi piksel kiri atas dari 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 wilayah 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 pemangkasan harus memenuhi persyaratan tertentu (misalnya, area pemangkasan harus dimulai pada koordinat yang merata, dan lebar/tingginya harus merata), HAL harus melakukan pembulatan yang diperlukan dan menulis area pemangkasan akhir yang digunakan dalam metadata hasil output. Demikian pula, jika HAL menerapkan stabilisasi video, HAL harus menyesuaikan wilayah pemangkasan hasil untuk mendeskripsikan wilayah yang sebenarnya disertakan dalam output setelah stabilisasi video diterapkan. Secara umum, aplikasi yang menggunakan kamera harus dapat menentukan bidang pandang yang diterimanya berdasarkan area pemangkasan, dimensi sensor gambar, dan panjang fokus lensa.
Karena wilayah pemangkasan berlaku untuk semua aliran data, yang mungkin memiliki rasio aspek yang berbeda dengan wilayah pemangkasan, wilayah sensor yang tepat yang digunakan untuk setiap aliran data mungkin lebih kecil dari wilayah pemangkasan. Secara khusus, setiap aliran data harus mempertahankan piksel persegi dan rasio aspeknya dengan memangkas area pemangkasan lebih lanjut yang ditentukan. 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 pemangkasan, streaming harus dipangkas lebih lanjut secara horizontal.
Dalam semua kasus, pemangkasan aliran data harus dipusatkan dalam region pemangkasan penuh, dan setiap aliran data hanya dipangkas secara horizontal atau vertikal relatif terhadap region pemangkasan penuh, tidak pernah keduanya.
Misalnya, jika dua streaming ditentukan, stream 640x480 (aspek 4:3), dan streaming 1280x720 (aspek 16:9), di bawah ini menunjukkan region output yang diharapkan untuk setiap streaming untuk beberapa area pemangkasan sampel, pada sensor hipotesis 3 MP (array 2000 x 1500 piksel).
Wilayah pangkas: (500, 375, 1000, 750) (rasio aspek 4:3)
Crop stream 640x480: (500, 375, 1000, 750) (sama dengan wilayah pemangkasan)
1280x720 pemangkasan feed: (500, 4069, 516)
Wilayah pemangkasan: (500, 375, 1333, 750) (rasio aspek 16:9)
Pemangkasan streaming 640x480: (666, 375, 1000, 750)
Pemangkasan streaming 1280x720: (500, 375, 1333, 750) (sama dengan wilayah pemangkasan)
Wilayah pemangkasan: (500, 375, 750, 750) (rasio aspek 1:1)
Pemangkasan streaming 640x480: (500, 469, 750, 562)
Pemangkasan streaming 1280x720: (500, 543, 750, 414)
Dan contoh terakhir, streaming rasio aspek persegi 1024x1024, bukan streaming 480p:
Pangkas region: (500, 375, 1000, 750) (rasio aspek 4:3)
pemangkasan aliran data 1024x1024: (625, 375, 0804: 205, 375, 750, 750)
Pemrosesan ulang
Dukungan tambahan untuk file gambar mentah disediakan dengan dukungan pemrosesan ulang untuk data Bayer RAW. Dukungan ini memungkinkan pipeline kamera untuk memproses metadata dan buffering RAW yang sebelumnya direkam (seluruh frame yang direkam sebelumnya), untuk menghasilkan output JPEG atau YUV 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 native.
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 beberapa 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
. - Memperkecil dari lensa lebar ke lensa ultrawide:
ANDROID_CONTROL_ZOOM_RATIO
mendukung zoom-out (<1,0f), sedangkanANDROID_SCALER_CROP_REGION
tidak.
Rasio zoom: 2,0; 1/4 bidang pandang asli
Wilayah pemangkasan: (0, 0, 2000, 1500) (rasio aspek 4:3)
Pemangkasan streaming 640x480: (0, 0, 2000, 1500) (sama dengan wilayah pemangkasan)
Pemangkasan streaming 1280x720: (0, 187, 2000, 1125)
Rasio zoom: 2,0; 1/4 bidang pandang asli
Wilayah pemangkasan: (0, 187, 2000, 1125) (rasio aspek 16:9)
Pemangkasan streaming 640x480: (250, 187, 1500, 1125) (pillarboxed)
Pemangkasan streaming 1280x720: (0, 187, 2000, 1125) (sama dengan wilayah pemangkasan)
Rasio zoom: 0,5; 4x ruang pandang asli (dialihkan dari lensa lebar ke lensa ultrawide)
Area pemangkasan: (250, 0, 1500, 1500) (rasio aspek 1:1)
pemangkasan aliran 640x480: (250, 187, 1500, 1185 tampilan lebar)
Seperti yang terlihat dari grafik di atas, sistem koordinat area pemangkasan berubah menjadi ruang pandang
setelah zoom yang efektif, dan diwakili 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
pengambilan 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)
Agar aplikasi menetapkan android.control.aeRegions
sebagai seperempat kiri atas
dari bidang pandang jendela bidik, tetapkan
android.control.aeRegions
ke (0, 0, 1000, 750)
dengan
android.control.zoomRatio
ditetapkan ke 2.0
. Atau,
aplikasi dapat menetapkan android.control.aeRegions
ke wilayah
(500, 375, 1000, 750)
yang setara untuk
android.control.zoomRatio
dari 1.0
.