Streaming output, pemangkasan, dan zoom

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)

rasio crop-region-43

Gambar 1. Rasio aspek 4:3

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)

crop-region-169-ratio

Gambar 2. Rasio lebar tinggi 16:9

Wilayah pemangkasan: (500, 375, 750, 750) (rasio aspek 1:1)
Pemangkasan streaming 640x480: (500, 469, 750, 562)
Pemangkasan streaming 1280x720: (500, 543, 750, 414)

rasio crop-region-11

Gambar 3. Rasio aspek 1:1

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)

crop-region-43-square-ratio

Gambar 4. Rasio aspek 4:3, persegi

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), sedangkan ANDROID_SCALER_CROP_REGION tidak.

Untuk mengilustrasikan, berikut beberapa skenario rasio zoom, region pemangkasan, dan streaming output yang berbeda, menggunakan kamera hipotetis yang sama yang ditentukan di bagian sebelumnya.

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)

zoom-ratio-2-crop-43

Gambar 5. Zoom 2,0, rasio aspek 4:3

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)

zoom-ratio-2-crop-169

Gambar 6. Zoom 2,0, rasio aspek 16:9

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)

gambar/zoom-ratio-0.5-crop-11

Gambar 7. Zoom 0,5, rasio aspek 1:1

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.