Google berkomitmen untuk memajukan ekuitas ras untuk komunitas kulit hitam. Lihat bagaimana.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Kamera

Ikon Android Camera HAL

Lapisan abstraksi perangkat keras kamera Android (HAL) menghubungkan API kerangka kerja kamera tingkat tinggi di Camera 2 ke driver kamera dan perangkat keras yang mendasarinya. Subsistem kamera mencakup implementasi untuk komponen pipa 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 kerja aplikasi
Pada tingkat kerangka kerja aplikasi adalah kode aplikasi, yang menggunakan Camera 2 API untuk berinteraksi dengan perangkat keras kamera. Secara internal, kode ini memanggil antarmuka Binder yang sesuai untuk mengakses kode asli yang berinteraksi dengan kamera.
AIDL
Antarmuka binder yang terkait dengan CameraService dapat ditemukan di frameworks / av / camera / aidl / android / hardware . Kode yang dihasilkan memanggil kode asli level bawah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuat CameraDevice dan akhirnya objek CameraCaptureSession di level framework.
kerangka kerja asli
Kerangka kerja ini berada di frameworks/av/ menyediakan setara asli ke kelas CameraDevice dan CameraCaptureSession . Lihat juga referensi NDK camera2 .
binder antarmuka IPC
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 tertentu yang dibuka; dan ICameraServiceListener dan ICameraDeviceCallbacks adalah masing CameraService dan CameraDevice callback ke kerangka aplikasi.
layanan kamera
Layanan kamera, yang terletak di frameworks/av/services/camera/libcameraservice/CameraService.cpp , adalah kode aktual yang berinteraksi dengan HAL.
HAL
Lapisan abstraksi perangkat keras menentukan antarmuka standar yang digunakan layanan kamera dan Anda harus menerapkan agar fungsi perangkat keras kamera Anda benar.

Menerapkan HAL

HAL terletak di antara driver kamera dan kerangka kerja Android tingkat tinggi dan mendefinisikan antarmuka yang harus Anda terapkan sehingga aplikasi dapat mengoperasikan perangkat keras kamera dengan benar. Antarmuka HIDL untuk Camera HAL didefinisikan dalam perangkat keras / antarmuka / kamera .

HAL binder yang khas harus mengimplementasikan antarmuka HIDL berikut:

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

Komponen HAL sebelumnya

Bagian ini menjelaskan arsitektur komponen HAL lama dan bagaimana menerapkan HAL. Implementasi Camera HAL pada Android 8.0 dan lebih tinggi harus menggunakan API HIDL sebagai gantinya, dijelaskan di atas.

Arsitektur (warisan)

Gambar dan daftar berikut ini menjelaskan komponen HAL kamera lawas.

Arsitektur kamera Android

Gambar 2. Arsitektur kamera lama

kerangka kerja aplikasi
Pada tingkat kerangka kerja 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 asli level bawah untuk mendapatkan akses ke kamera fisik dan mengembalikan data yang digunakan untuk membuat objek android.hardware.Camera di level framework.
kerangka kerja asli
Kerangka kerja asli yang didefinisikan dalam frameworks/av/camera/Camera.cpp menyediakan padanan asli untuk kelas android.hardware.Camera . Kelas ini memanggil pengikat IPC proxy untuk mendapatkan akses ke layanan kamera.
pengikat proksi IPC
Proxy 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 kembali ke kerangka kerja aplikasi.
layanan kamera
Layanan kamera, yang terletak di frameworks/av/services/camera/libcameraservice/CameraService.cpp , adalah kode aktual yang berinteraksi dengan HAL.
HAL
Lapisan abstraksi perangkat keras menentukan antarmuka standar yang digunakan layanan kamera dan Anda harus menerapkan agar fungsi perangkat keras kamera Anda benar.
driver kernel
Driver kamera berinteraksi dengan perangkat keras kamera aktual dan implementasi HAL Anda. Kamera dan driver harus mendukung format gambar YV12 dan NV21 untuk memberikan dukungan untuk melihat pratinjau gambar kamera pada tampilan dan perekaman video.

Menerapkan HAL (warisan)

HAL terletak di antara driver kamera dan kerangka kerja Android tingkat tinggi dan mendefinisikan antarmuka yang harus Anda terapkan 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 yang menghadap ke depan atau belakang).

camera.h berisi kode yang sesuai dengan android.hardware.Camera . File header ini menyatakan struct camera_device yang pada gilirannya berisi struct camera_device_ops dengan pointer ke fungsi yang mengimplementasikan antarmuka HAL. Untuk dokumentasi tentang parameter kamera yang dapat ditetapkan pengembang, lihat frameworks/av/include/camera/CameraParameters.h . Parameter ini diatur 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 .

Mengkonfigurasi perpustakaan bersama

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

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

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

  3. Tentukan perangkat Anda memiliki fitur kamera dengan menyalin file fitur XML yang diperlukan dalam direktori frameworks/native/data/etc dengan makefile perangkat Anda. Misalnya, untuk menentukan perangkat Anda memiliki flash kamera dan dapat fokus otomatis, tambahkan baris berikut di <device>/<company_name>/<device_name>/device.mk :
    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 kodek media, format, dan kemampuan resolusi kamera Anda di device/<company_name>/<device_name>/media_profiles.xml dan device/<company_name>/<device_name>/media_codecs.xml file XML. Untuk detailnya, lihat Mengekspos codec ke framework .
  5. Tambahkan baris berikut di perangkat Anda device/<company_name>/<device_name>/device.mk makefile file device/<company_name>/<device_name>/device.mk 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 memasukkan aplikasi Kamera di gambar sistem perangkat Anda, tentukan dalam variabel PRODUCT_PACKAGES di perangkat device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...