Google มุ่งมั่นที่จะพัฒนาความเท่าเทียมทางเชื้อชาติสำหรับชุมชนคนผิวดำ มาดูกันว่า
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

กล้อง

ไอคอน HAL ของกล้อง Android

เลเยอร์นามธรรมฮาร์ดแวร์กล้องของ Android (HAL) จะเชื่อมต่อ API เฟรมเวิร์กระดับสูงกว่าใน Camera 2 กับไดรเวอร์กล้องและฮาร์ดแวร์พื้นฐานของคุณ ระบบย่อยของกล้องรวมถึงการใช้งานสำหรับส่วนประกอบไปป์ไลน์ของกล้องในขณะที่ HAL ของกล้องให้อินเทอร์เฟซสำหรับใช้ในการนำส่วนประกอบเหล่านี้มาใช้

สถาปัตยกรรม

รูปและรายการต่อไปนี้อธิบายถึงส่วนประกอบ HAL

สถาปัตยกรรมกล้อง Android

รูปที่ 1 สถาปัตยกรรมกล้อง

กรอบงานแอป
ในระดับแอปเฟรมเวิร์กเป็นรหัสของแอพซึ่งใช้ Camera 2 API เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง ภายในรหัสนี้เรียกใช้อินเทอร์เฟซ Binder ที่ สอดคล้องกันเพื่อเข้าถึงรหัสเนทีฟที่ทำงานกับกล้อง
AIDL
อินเตอร์เฟส binder ที่เชื่อมโยงกับ CameraService สามารถดูได้ที่ frameworks / av / camera / aidl / android / hardware รหัสที่สร้างขึ้นจะเรียกใช้รหัสเนทีฟระดับต่ำกว่าเพื่อรับการเข้าถึงกล้องทางกายภาพและส่งคืนข้อมูลที่ใช้ในการสร้าง CameraDevice และในที่สุดวัตถุ CameraCaptureSession ในระดับเฟรมเวิร์ก
กรอบดั้งเดิม
เฟรมเวิร์กนี้อยู่ใน frameworks/av/ ให้ค่าดั้งเดิมเทียบเท่ากับ CameraDevice และ CameraCaptureSession ดู การอ้างอิง NDK camera2 ด้วย
binder อินเตอร์เฟส IPC
ส่วนต่อประสาน IPC ช่วยให้การสื่อสารผ่านขอบเขตกระบวนการง่ายขึ้น มีคลาส binder กล้องหลายตัวที่อยู่ใน frameworks/av/camera/camera/aidl/android/hardware ที่เรียกใช้บริการกล้อง ICameraService เป็นส่วนต่อประสานกับบริการกล้อง ICameraDeviceUser เป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดเฉพาะ และ ICameraServiceListener และ ICameraDeviceCallbacks คือการเรียกกลับ CameraService และ CameraDevice ตามลำดับที่กรอบงานแอปพลิเคชัน
บริการกล้อง
บริการกล้องตั้งอยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp เป็นรหัสจริงที่โต้ตอบกับ HAL
HAL
เลเยอร์นามธรรมที่เป็นฮาร์ดแวร์จะกำหนดอินเทอร์เฟซมาตรฐานที่บริการกล้องเรียกเข้าและคุณต้องติดตั้งเพื่อให้ฮาร์ดแวร์กล้องทำงานได้อย่างถูกต้อง

การใช้ HAL

HAL อยู่ระหว่างไดรเวอร์กล้องและกรอบ Android ระดับสูงกว่าและกำหนดอินเทอร์เฟซที่คุณต้องใช้เพื่อให้แอปสามารถใช้งานฮาร์ดแวร์กล้องได้อย่างถูกต้อง อินเตอร์เฟส HIDL สำหรับ Camera HAL ถูกกำหนดไว้ใน ฮาร์ดแวร์ / อินเตอร์เฟส / กล้อง

HAL ที่ถูก binderized โดยทั่วไปจะต้องใช้อินเตอร์เฟส HIDL ต่อไปนี้:

  • ICameraProvider : สำหรับการแจกแจงแต่ละอุปกรณ์และการจัดการสถานะของพวกเขา
  • ICameraDevice : ส่วนต่อประสานอุปกรณ์กล้อง
  • ICameraDeviceSession : อินเตอร์เฟสของอุปกรณ์กล้องที่ใช้งานอยู่

การใช้งาน CameraProvider.cpp สำหรับอ้างอิงนั้นมีให้สำหรับ CameraProvider.cpp , CameraDevice.cpp และ CameraDeviceSession.cpp การนำไปใช้จะตัด HAL เก่าที่ยังคงใช้ API ดั้งเดิม เริ่มต้นด้วย Android 8.0 การใช้งาน HAL ของกล้องจะต้องใช้ HIDL API ไม่รองรับการใช้อินเทอร์เฟซแบบดั้งเดิม

ส่วนประกอบ HAL ดั้งเดิม

ส่วนนี้อธิบายสถาปัตยกรรมของส่วนประกอบ HAL ดั้งเดิมและวิธีการนำ HAL ไปใช้ การใช้งาน Camera HAL บน Android 8.0 และสูงกว่าต้องใช้ HIDL API แทนดังที่อธิบายไว้ข้างต้น

สถาปัตยกรรม (ดั้งเดิม)

รูปและรายการต่อไปนี้อธิบายถึงส่วนประกอบ HAL ของกล้องรุ่นเก่า

สถาปัตยกรรมกล้อง Android

รูปที่ 2 สถาปัตยกรรมกล้องถ่ายภาพมรดก

กรอบงานแอป
ในระดับแอปเฟรมเวิร์กคือรหัสของแอพซึ่งใช้ android.hardware.Camera API เพื่อโต้ตอบกับฮาร์ดแวร์กล้อง ภายในรหัสนี้เรียกคลาสกาว JNI ที่เกี่ยวข้องเพื่อเข้าถึงรหัสเนทีฟที่ทำงานกับกล้อง
JNI
รหัส JNI ที่เกี่ยวข้องกับ android.hardware.Camera ตั้งอยู่ใน frameworks/base/core/jni/android_hardware_Camera.cpp รหัสนี้เรียกรหัสเนทีฟระดับต่ำกว่าเพื่อรับการเข้าถึงกล้องทางกายภาพและส่งคืนข้อมูลที่ใช้ในการสร้างวัตถุ android.hardware.Camera ที่ระดับเฟรมเวิร์ก
กรอบดั้งเดิม
เฟรมเวิร์กเนทีฟที่กำหนดใน frameworks/av/camera/Camera.cpp จะให้ค่าดั้งเดิมที่เทียบเท่ากับคลาส android.hardware.Camera คลาสนี้เรียกพร็อกซี IPC binder เพื่อขอรับการเข้าถึงบริการกล้อง
binder IPC พร็อกซี
พร็อกซีของ IPC binder ช่วยอำนวยความสะดวกในการสื่อสารผ่านขอบเขตกระบวนการ มีคลาส binder กล้องสามคลาสที่อยู่ในไดเร็กทอรี frameworks/av/camera ที่เรียกใช้บริการกล้อง ICameraService เป็นอินเทอร์เฟซสำหรับบริการกล้อง ICamera เป็นอินเทอร์เฟซสำหรับอุปกรณ์กล้องที่เปิดเฉพาะและ ICameraClient เป็นอินเทอร์เฟซของอุปกรณ์กลับไปที่เฟรมเวิร์กแอพ
บริการกล้อง
บริการกล้องตั้งอยู่ใน frameworks/av/services/camera/libcameraservice/CameraService.cpp เป็นรหัสจริงที่โต้ตอบกับ HAL
HAL
เลเยอร์นามธรรมที่เป็นฮาร์ดแวร์จะกำหนดอินเทอร์เฟซมาตรฐานที่บริการกล้องเรียกเข้าและคุณต้องติดตั้งเพื่อให้ฮาร์ดแวร์กล้องทำงานได้อย่างถูกต้อง
เคอร์เนลไดรเวอร์
ไดรเวอร์ของกล้องโต้ตอบกับฮาร์ดแวร์กล้องจริงและการใช้งาน HAL ของคุณ กล้องและไดรเวอร์ต้องรองรับรูปแบบภาพ YV12 และ NV21 เพื่อรองรับการแสดงตัวอย่างภาพกล้องบนจอแสดงผลและการบันทึกวิดีโอ

การใช้ HAL (ดั้งเดิม)

HAL อยู่ระหว่างไดรเวอร์กล้องและกรอบ Android ระดับสูงกว่าและกำหนดอินเทอร์เฟซที่คุณต้องใช้เพื่อให้แอปสามารถใช้งานฮาร์ดแวร์กล้องได้อย่างถูกต้อง อินเตอร์เฟส HAL ถูกกำหนดในไฟล์ hardware/libhardware/include/hardware/camera.h และ hardware/libhardware/include/hardware/camera_common.h

camera_common.h กำหนด camera_module ซึ่งเป็นโครงสร้างมาตรฐานเพื่อรับข้อมูลทั่วไปเกี่ยวกับกล้องเช่น ID กล้องและคุณสมบัติทั่วไปของกล้องทุกตัว (นั่นคือไม่ว่าจะเป็นกล้องหน้าหรือกล้องหน้า)

camera.h มีรหัสที่สอดคล้องกับ android.hardware.Camera ไฟล์ส่วนหัวนี้ประกาศโครงสร้าง camera_device ที่ในทางกลับกันมีโครงสร้าง camera_device_ops พร้อมกับพอยน์เตอร์ไปยังฟังก์ชั่นที่ใช้อินเทอร์เฟซ HAL สำหรับเอกสารเกี่ยวกับผู้พัฒนาพารามิเตอร์กล้องสามารถตั้งค่าได้โปรดอ้างอิง frameworks/av/include/camera/CameraParameters.h พารามิเตอร์เหล่านี้ถูกตั้งค่าด้วยฟังก์ชั่นที่ชี้ไปตาม int (*set_parameters)(struct camera_device *, const char *parms) ใน HAL

สำหรับตัวอย่างของการนำ HAL ไปใช้ให้อ้างอิงถึงการนำไปใช้งานสำหรับ Galaxy Nexus HAL ใน hardware/ti/omap4xxx/camera

การกำหนดค่าไลบรารีที่แบ่งใช้

ตั้งค่าระบบการสร้าง Android ให้แพคเกจการนำ HAL ไปใช้ในไลบรารีที่ใช้ร่วมกันอย่างถูกต้องและคัดลอกไปยังตำแหน่งที่เหมาะสมโดยสร้างไฟล์ Android.mk :

  1. สร้างไดเรกทอรี device/<company_name>/<device_name>/camera เพื่อเก็บไฟล์ต้นฉบับของไลบรารีของคุณ
  2. สร้างไฟล์ Android.mk เพื่อสร้างไล Android.mk รี่ที่แชร์ ตรวจสอบให้แน่ใจว่า makefile มีบรรทัดต่อไปนี้:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    ห้องสมุดของคุณต้องชื่อ camera.<device_name> ( .so จะถูกต่อท้ายโดยอัตโนมัติ) ดังนั้น Android สามารถโหลดห้องสมุดได้อย่างถูกต้อง ตัวอย่างเช่นดู makefile สำหรับกล้อง Galaxy Nexus ที่อยู่ใน hardware/ti/omap4xxx/Android.mk

  3. ระบุอุปกรณ์ของคุณมีคุณสมบัติกล้องโดยการคัดลอกไฟล์ XML คุณสมบัติที่จำเป็นในไดเรกทอรี frameworks/native/data/etc ด้วย makefile ของอุปกรณ์ ตัวอย่างเช่นในการระบุอุปกรณ์ของคุณมีแฟลชกล้องและสามารถโฟกัสอัตโนมัติให้เพิ่มบรรทัดต่อไปนี้ใน <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 \
    

    สำหรับตัวอย่างของ makefile device/samsung/tuna/device.mk ดูที่ device/samsung/tuna/device.mk

  4. ประกาศตัวแปลงสัญญาณสื่อรูปแบบและความสามารถในการแก้ปัญหาของกล้องใน device/<company_name>/<device_name>/media_profiles.xml และ device/<company_name>/<device_name>/media_codecs.xml ไฟล์ XML สำหรับรายละเอียดโปรดดู การเปิดเผยตัวแปลงสัญญาณให้กับกรอบงาน
  5. เพิ่มบรรทัดต่อไปนี้ในอุปกรณ์ของคุณ device/<company_name>/<device_name>/device.mk Makefile เพื่อคัดลอก media_profiles.xml และ media_codecs.xml ไฟล์ไปยังสถานที่ที่เหมาะสม:
    # 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. หากต้องการรวมแอพกล้องในรูปภาพระบบของอุปกรณ์ของคุณให้ระบุในตัวแปร PRODUCT_PACKAGES ใน device/<company>/<device>/device.mk :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...