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, aliran output ini harus dikonfigurasi terlebih dahulu, dan hanya ada sejumlah terbatas 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 yang dijamin yang bergantung pada tingkat hardware yang didukung, lihat createCaptureSession().

Memotong

Pemangkasan array piksel penuh (untuk zoom digital dan kasus penggunaan lainnya 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) sebagai 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 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 wilayah pemangkasan perlu memenuhi persyaratan tertentu (misalnya, harus dimulai pada koordinat genap, dan lebar/tingginya harus genap), HAL harus melakukan pembulatan yang diperlukan dan menulis wilayah 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 streaming harus mempertahankan piksel persegi dan rasio aspeknya dengan memangkas area pemangkasan yang ditentukan secara minimal. Jika rasio aspek streaming lebih lebar dari wilayah pemangkasan, streaming harus dipangkas lebih lanjut secara vertikal, dan jika rasio aspek streaming lebih sempit dari wilayah 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 aliran data ditentukan, aliran data 640x480 (rasio aspek 4:3), dan aliran data 1280x720 (rasio aspek 16:9), di bawah ini menunjukkan wilayah output yang diharapkan untuk setiap aliran data untuk beberapa contoh wilayah pemangkasan, pada sensor hipotetis 3 MP (array 2000 x 1500 piksel).

Wilayah pemangkasan: (500, 375, 1000, 750) (rasio aspek 4:3)
Pemangkasan streaming 640x480: (500, 375, 1000, 750) (sama dengan wilayah pemangkasan)
Pemangkasan streaming 1280x720: (500, 469, 1000, 562)

crop-region-43-ratio

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)

crop-region-11-ratio

Gambar 3. Rasio aspek 1:1

Dan contoh terakhir, streaming dengan rasio aspek persegi 1024x1024, bukan streaming 480p:
Wilayah pemangkasan: (500, 375, 1000, 750) (rasio aspek 4:3)
Pemangkasan streaming 1024x1024: (625, 375, 750, 750)
Pemangkasan streaming 1280x720: (500, 469, 1000, 562)

crop-region-43-square-ratio

Gambar 4. Rasio aspek 4:3, persegi

Pemrosesan ulang

Dukungan tambahan untuk file gambar mentah disediakan oleh dukungan pemrosesan ulang untuk data Bayer RAW. Dukungan ini memungkinkan pipeline kamera memproses buffering dan metadata RAW yang diambil sebelumnya (seluruh frame yang direkam sebelumnya), untuk menghasilkan output YUV atau JPEG yang dirender baru.

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. Menggunakan 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.
  • Memperkecil dari lensa lebar ke lensa ultra lebar: 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 dari 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 bidang pandang asli (beralih dari lensa lebar ke lensa ultra lebar)
Wilayah pemangkasan: (250, 0, 1500, 1500) (rasio aspek 1:1)
Pemangkasan streaming 640x480: (250, 187, 1500, 1125) (letterbox)
Pemangkasan streaming 1280x720: (250, 328, 1500, 844) (letterbox)

images/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 bidang pandang yang efektif setelah zoom, 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.

Dengan menggunakan contoh hipotetis yang sama di atas, dan dengan asumsi bahwa streaming output #1 (640x480) adalah streaming 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 kuadran 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.