Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
此页面由 Cloud Translation API 翻译。
Switch to English

Kamera

Ikon HAL Kamera Android

Lapisan abstraksi perangkat keras (HAL) kamera Android menghubungkan API kerangka kerja kamera tingkat yang lebih tinggi di Kamera 2 ke driver kamera dan perangkat keras yang mendasarinya. Subsistem kamera menyertakan implementasi untuk komponen pipeline kamera sementara HAL kamera menyediakan antarmuka untuk digunakan dalam mengimplementasikan versi Anda dari komponen ini.

Arsitektur

Gambar dan daftar berikut menjelaskan komponen HAL.

Arsitektur kamera Android

Gambar 1. Arsitektur kamera

kerangka aplikasi
Di level framework aplikasi adalah kode aplikasi, yang menggunakan Camera 2 API untuk berinteraksi dengan hardware kamera. Secara internal, kode ini memanggil antarmuka Binder yang sesuai untuk mengakses kode asli yang berinteraksi dengan kamera.
AIDL
Antarmuka pengikat yang terkait dengan CameraService dapat ditemukan di frameworks / av / camera / aidl / android / hardware . Kode yang dihasilkan memanggil kode asli tingkat yang lebih rendah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuat CameraDevice dan akhirnya objek CameraCaptureSession di tingkat kerangka kerja.
kerangka asli
Framework ini berada dalam frameworks/av/ menyediakan native yang setara dengan CameraDevice dan CameraCaptureSession . Lihat juga referensi kamera2 NDK .
antarmuka IPC pengikat
Antarmuka pengikat IPC memfasilitasi komunikasi melewati batas proses. Ada beberapa kelas pengikat kamera yang terletak di direktori frameworks/av/camera/camera/aidl/android/hardware yang memanggil layanan kamera. ICameraService adalah antarmuka ke layanan kamera; ICameraDeviceUser adalah antarmuka ke perangkat kamera terbuka tertentu; serta ICameraServiceListener dan ICameraDeviceCallbacks adalah callback CameraDevice dan CameraService masing-masing ke framework aplikasi.
layanan kamera
Layanan kamera, yang terletak di frameworks/av/services/camera/libcameraservice/CameraService.cpp , adalah kode sebenarnya yang berinteraksi dengan HAL.
HAL
Lapisan abstraksi perangkat keras menentukan antarmuka standar yang dipanggil oleh layanan kamera dan yang harus Anda terapkan agar perangkat keras kamera Anda berfungsi dengan benar.

Menerapkan HAL

HAL berada di antara driver kamera dan kerangka kerja Android level yang lebih tinggi dan menentukan antarmuka yang harus Anda implementasikan sehingga aplikasi dapat mengoperasikan perangkat keras kamera dengan benar. Antarmuka HIDL untuk HAL Kamera ditentukan dalam perangkat keras / antarmuka / kamera .

Biasanya HAL terikat harus mengimplementasikan antarmuka HIDL berikut:

Implementasi HIDL referensi tersedia untuk CameraProvider.cpp , CameraDevice.cpp , dan CameraDeviceSession.cpp . Implementasinya membungkus HAL lama yang masih menggunakan API lama . Dimulai dengan Android 8.0, implementasi Camera HAL harus menggunakan HIDL API; penggunaan antarmuka lama tidak didukung.

Komponen HAL lama

Bagian ini menjelaskan arsitektur komponen HAL lama dan cara mengimplementasikan HAL. Implementasi Camera HAL di Android 8.0 dan yang lebih tinggi harus menggunakan HIDL API, yang dijelaskan di atas.

Arsitektur (warisan)

Gambar dan daftar berikut menjelaskan komponen HAL kamera lawas.

Arsitektur kamera Android

Gambar 2. Arsitektur kamera lama

kerangka aplikasi
Pada tingkat kerangka aplikasi adalah kode aplikasi, yang menggunakan API android.hardware.Camera untuk berinteraksi dengan perangkat keras kamera. Secara internal, kode ini memanggil kelas lem JNI yang sesuai untuk mengakses kode asli yang berinteraksi dengan kamera.
JNI
Kode JNI yang terkait dengan android.hardware.Camera terletak di frameworks/base/core/jni/android_hardware_Camera.cpp . Kode ini memanggil kode native level bawah untuk mendapatkan akses ke kamera fisik dan menampilkan data yang digunakan untuk membuat objek android.hardware.Camera di level framework.
kerangka asli
Framework native yang ditentukan dalam frameworks/av/camera/Camera.cpp menyediakan native yang setara dengan kelas android.hardware.Camera . Kelas ini memanggil proxy pengikat IPC untuk mendapatkan akses ke layanan kamera.
pengikat proxy IPC
Proksi pengikat IPC memfasilitasi komunikasi melewati batas proses. Ada tiga kelas pengikat kamera yang terletak di direktori frameworks/av/camera yang memanggil layanan kamera. ICameraService adalah antarmuka ke layanan kamera, ICamera adalah antarmuka ke perangkat kamera tertentu yang dibuka, dan ICameraClient adalah antarmuka perangkat yang kembali ke kerangka aplikasi.
layanan kamera
Layanan kamera, yang terletak di frameworks/av/services/camera/libcameraservice/CameraService.cpp , adalah kode sebenarnya yang berinteraksi dengan HAL.
HAL
Lapisan abstraksi perangkat keras menentukan antarmuka standar yang dipanggil oleh layanan kamera dan yang harus Anda terapkan agar perangkat keras kamera Anda berfungsi dengan benar.
driver kernel
Driver kamera berinteraksi dengan perangkat keras kamera yang sebenarnya dan implementasi HAL Anda. Kamera dan driver harus mendukung format gambar YV12 dan NV21 untuk memberikan dukungan pratinjau gambar kamera pada tampilan dan perekaman video.

Menerapkan HAL (warisan)

HAL berada di antara driver kamera dan kerangka kerja Android level yang lebih tinggi dan menentukan antarmuka yang harus Anda implementasikan sehingga aplikasi dapat mengoperasikan perangkat keras kamera dengan benar. Antarmuka HAL didefinisikan dalam file header hardware/libhardware/include/hardware/camera.h dan hardware/libhardware/include/hardware/camera_common.h .

camera_common.h mendefinisikan camera_module , struktur standar untuk mendapatkan informasi umum tentang kamera, seperti ID kamera dan properti yang umum untuk semua kamera (yaitu, apakah itu kamera depan atau belakang).

camera.h berisi kode yang sesuai dengan android.hardware.Camera . File header ini mendeklarasikan struct camera_device yang pada gilirannya berisi struct camera_device_ops dengan petunjuk ke fungsi yang mengimplementasikan antarmuka HAL. Untuk dokumentasi tentang parameter kamera yang dapat disetel oleh pengembang, lihat frameworks/av/include/camera/CameraParameters.h . Parameter ini disetel dengan fungsi yang ditunjukkan oleh int (*set_parameters)(struct camera_device *, const char *parms) di HAL.

Untuk contoh implementasi HAL, lihat implementasi untuk Galaxy Nexus HAL di hardware/ti/omap4xxx/camera .

Mengonfigurasi perpustakaan bersama

Siapkan sistem build Android untuk mengemas implementasi HAL dengan benar ke dalam library bersama dan menyalinnya ke lokasi yang sesuai dengan membuat file Android.mk :

  1. Buat direktori device/<company_name>/<device_name>/camera untuk memuat file sumber library Anda.
  2. Buat file Android.mk untuk membuat pustaka bersama. Pastikan bahwa makefile berisi baris berikut:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    Pustaka Anda harus diberi nama camera.<device_name> ( .so ditambahkan secara otomatis), sehingga Android bisa memuat pustaka dengan benar. Sebagai contoh, lihat file makefile untuk kamera Galaxy Nexus yang terletak di hardware/ti/omap4xxx/Android.mk .

  3. Tentukan perangkat Anda memiliki fitur kamera dengan menyalin file XML fitur yang diperlukan dalam direktori frameworks/native/data/etc dengan makefile perangkat Anda. Misalnya, untuk menentukan perangkat Anda memiliki flash kamera dan dapat melakukan fokus otomatis, tambahkan baris berikut di <device>/<company_name>/<device_name>/device.mk makefile:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    Untuk contoh makefile perangkat, lihat device/samsung/tuna/device.mk .

  4. Deklarasikan codec media, format, dan kemampuan resolusi kamera Anda di file XML device/<company_name>/<device_name>/media_profiles.xml dan device/<company_name>/<device_name>/media_codecs.xml . Untuk detailnya, lihat Mengekspos codec ke framework .
  5. Tambahkan baris berikut di device/<company_name>/<device_name>/device.mk makefile perangkat Anda untuk menyalin file media_profiles.xml dan media_codecs.xml ke lokasi yang sesuai:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. Untuk menyertakan aplikasi Kamera dalam image sistem perangkat Anda, tentukan dalam variabel PRODUCT_PACKAGES di perangkat Anda device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...