การรองรับกล้องหลายตัว

Android 9 ได้เปิดตัวการรองรับ API สำหรับอุปกรณ์ที่มีกล้องหลายตัวผ่านอุปกรณ์กล้องตรรกะใหม่ที่ประกอบด้วยอุปกรณ์กล้องจริง 2 ตัวขึ้นไปซึ่งหันไปในทิศทางเดียวกัน อุปกรณ์กล้องตรรกะจะแสดงเป็น CameraDevice/CaptureSession เดียวให้กับแอป ซึ่งช่วยให้โต้ตอบกับฟีเจอร์กล้องหลายตัวที่ผสานรวมกับ HAL ได้ แอปสามารถเลือกเข้าถึงและควบคุมสตรีมกล้องจริง ข้อมูลเมตา และการควบคุมที่เกี่ยวข้องได้

การรองรับกล้องหลายตัว

รูปที่ 1 รองรับกล้องหลายตัว

ในแผนภาพนี้ รหัสกล้องต่างๆ จะมีการกำหนดสี แอปสามารถสตรีมบัฟเฟอร์ดิบจากกล้องจริงแต่ละตัวได้พร้อมกัน นอกจากนี้ยังสามารถตั้งค่าการควบคุมแยกกันและรับข้อมูลเมตาแยกกันจากกล้องจริงต่างๆ ได้ด้วย

ตัวอย่างและแหล่งที่มา

อุปกรณ์ที่มีกล้องหลายตัวต้องมีการประกาศความสามารถของกล้องหลายตัวแบบตรรกะด้วย ตรรกะ

ไคลเอ็นต์กล้องสามารถค้นหารหัสกล้องของอุปกรณ์จริงที่กล้องตรรกะเฉพาะประกอบด้วยได้โดยเรียกใช้ getPhysicalCameraIds() จากนั้นจะใช้รหัสที่แสดงผลเป็นส่วนหนึ่งของผลลัพธ์เพื่อควบคุมอุปกรณ์จริงแต่ละรายการผ่าน แต่ละรายการผ่าน setPhysicalCameraId() และสามารถค้นหาผลลัพธ์จากคำขอแต่ละรายการดังกล่าวได้จากผลลัพธ์ทั้งหมด โดยเรียกใช้ getPhysicalCameraResults()

คำขอจากกล้องจริงแต่ละตัวอาจรองรับพารามิเตอร์เพียงชุดย่อยที่จำกัด หากต้องการรับรายการพารามิเตอร์ที่รองรับ นักพัฒนาแอปสามารถเรียกใช้ getAvailablePhysicalCameraRequestKeys()

ระบบรองรับสตรีมกล้องจริงสำหรับคำขอที่ไม่ใช่การประมวลผลซ้ำและสำหรับเซ็นเซอร์ขาวดำและเซ็นเซอร์ Bayer เท่านั้น

การใช้งาน

รายการตรวจสอบการรองรับ

วิธีเพิ่มอุปกรณ์กล้องหลายตัวแบบตรรกะในฝั่ง HAL

  • เพิ่มความสามารถ ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA สำหรับอุปกรณ์กล้องตรรกะใดก็ตามที่รองรับโดยกล้องจริง 2 ตัวขึ้นไป ซึ่งแสดงต่อแอปด้วย
  • ป้อนข้อมูลในช่องข้อมูลเมตาแบบคงที่ ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS ด้วยรายการรหัสกล้องจริง
  • ป้อนข้อมูลเมตาแบบคงที่ที่เกี่ยวข้องกับความลึกซึ่งจำเป็นต่อการเชื่อมโยงพิกเซลของสตรีมกล้องจริง ได้แก่ ANDROID_LENS_POSE_ROTATION, ANDROID_LENS_POSE_TRANSLATION, ANDROID_LENS_INTRINSIC_CALIBRATION, ANDROID_LENS_DISTORTION, ANDROID_LENS_POSE_REFERENCE
  • ตั้งค่าช่องข้อมูลเมตาแบบคงที่ ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE เป็นค่าต่อไปนี้

    • ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE: สำหรับเซ็นเซอร์ในโหมดหลัก-หลัก จะไม่มีการซิงค์ชัตเตอร์/การเปิดรับแสงของฮาร์ดแวร์
    • ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED: สำหรับเซ็นเซอร์ในโหมดหลัก-รอง จะมีการซิงค์ชัตเตอร์/การเปิดรับแสงของฮาร์ดแวร์
  • ป้อนข้อมูลใน ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS ด้วยรายการพารามิเตอร์ที่รองรับสำหรับกล้องจริงแต่ละตัว รายการนี้อาจว่างเปล่าหากอุปกรณ์ตรรกะไม่รองรับคำขอแต่ละรายการ

  • หากรองรับคำขอแต่ละรายการ ให้ประมวลผลและใช้ physicalCameraSettings แต่ละรายการที่อาจมาเป็นส่วนหนึ่งของคำขอการจับภาพ และผนวก physicalCameraMetadata แต่ละรายการตามความเหมาะสม

  • สำหรับอุปกรณ์ Camera HAL เวอร์ชัน 3.5 (เปิดตัวใน Android 10) ขึ้นไป ให้ป้อนข้อมูลใน ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID คีย์ผลลัพธ์โดยใช้รหัสของกล้องจริงที่ใช้งานอยู่ในปัจจุบันซึ่งรองรับ กล้องตรรกะ

สำหรับอุปกรณ์ที่ใช้ Android 9 อุปกรณ์กล้องต้องรองรับการแทนที่สตรีม YUV หรือ RAW แบบตรรกะ 1 รายการด้วยสตรีมจริงที่มีขนาดเท่ากัน (ไม่ใช้กับสตรีม RAW) และรูปแบบเดียวกันจากกล้องจริง 2 ตัว ซึ่งไม่ใช้กับอุปกรณ์ที่ใช้ Android 10

สำหรับอุปกรณ์ที่ใช้ Android 10 ซึ่ง อุปกรณ์ Camera HAL เวอร์ชัน 3.5 ขึ้นไป อุปกรณ์กล้องต้องรองรับ isStreamCombinationSupported เพื่อให้แอปค้นหาได้ว่ารองรับชุดค่าผสมของสตรีมที่เฉพาะเจาะจงซึ่งมี สตรีมจริงหรือไม่

แผนผังการกำหนดค่าสตรีม

สำหรับกล้องตรรกะ ชุดค่าผสมของสตรีมที่บังคับสำหรับอุปกรณ์กล้องที่มี ฮาร์ดแวร์ระดับหนึ่งจะเหมือนกับสิ่งที่จำเป็นใน CameraDevice.createCaptureSession สตรีมทั้งหมดในแผนผังการกำหนดค่าสตรีมต้องเป็นสตรีมตรรกะ

สำหรับอุปกรณ์กล้องตรรกะที่รองรับความสามารถ RAW พร้อมกล้องย่อยจริงที่มีขนาดแตกต่างกัน หากแอปกำหนดค่าสตรีม RAW แบบตรรกะ อุปกรณ์กล้องตรรกะจะต้องไม่เปลี่ยนไปใช้กล้องย่อยจริงที่มีขนาดเซ็นเซอร์แตกต่างกัน เพื่อให้แน่ใจว่าแอปการจับภาพ RAW ที่มีอยู่จะไม่หยุดทำงาน

หากต้องการใช้ประโยชน์จากการซูมแบบออปติคัลที่ HAL นำไปใช้โดยการสลับระหว่างกล้องย่อยจริงระหว่างการจับภาพ RAW แอปต้องกำหนดค่าสตรีมกล้องย่อยจริงแทนสตรีม RAW แบบตรรกะ

ชุดค่าผสมของสตรีมที่รับประกัน

ทั้งกล้องตรรกะและกล้องจริงที่เกี่ยวข้องต้องรับประกันชุดค่าผสมของสตรีมที่บังคับซึ่งจำเป็นสำหรับระดับอุปกรณ์ของตน

อุปกรณ์กล้องตรรกะควรทำงานในลักษณะเดียวกับอุปกรณ์กล้องจริงตามระดับและความสามารถของฮาร์ดแวร์ เราขอแนะนำให้ชุดฟีเจอร์ของกล้องตรรกะเป็นชุดฟีเจอร์ที่ใหญ่กว่าของกล้องจริงแต่ละตัว

ในอุปกรณ์ที่ใช้ Android 9 กล้องตรรกะต้องรองรับสิ่งต่อไปนี้สำหรับชุดค่าผสมของสตรีมที่รับประกันแต่ละชุด

  • การแทนที่สตรีม YUV_420_888 หรือ RAW แบบตรรกะ 1 รายการด้วยสตรีมจริง 2 รายการที่มีขนาดและรูปแบบเดียวกัน โดยแต่ละรายการมาจากกล้องจริงแยกกัน ทั้งนี้กล้องจริงต้องรองรับขนาดและรูปแบบดังกล่าว

  • การเพิ่มสตรีม RAW 2 รายการ โดยแต่ละรายการมาจากกล้องจริง 1 ตัว หากกล้องตรรกะไม่ได้ประกาศความสามารถ RAW แต่กล้องจริงที่เกี่ยวข้องประกาศความสามารถดังกล่าว โดยปกติแล้วกรณีนี้จะเกิดขึ้นเมื่อกล้องจริงมีขนาดเซ็นเซอร์แตกต่างกัน

  • การใช้สตรีมจริงแทนสตรีมตรรกะที่มีขนาดและรูปแบบเดียวกัน การดำเนินการนี้ต้องไม่ทำให้เกิดการชะลออัตราเฟรมของการจับภาพเมื่อระยะเวลาเฟรมขั้นต่ำของสตรีมจริงและสตรีมตรรกะเท่ากัน

ข้อควรพิจารณาเกี่ยวกับประสิทธิภาพและการใช้พลังงาน

  • ประสิทธิภาพ

    • การกำหนดค่าและการสตรีมสตรีมจริงอาจทำให้เกิดการชะลออัตราการจับภาพของกล้องตรรกะเนื่องจากข้อจำกัดด้านทรัพยากร
    • การใช้การตั้งค่ากล้องจริงอาจทำให้เกิดการชะลออัตราการจับภาพหากตั้งค่ากล้องที่เกี่ยวข้องเป็นอัตราเฟรมที่แตกต่างกัน
  • การใช้พลังงาน

    • การเพิ่มประสิทธิภาพการใช้พลังงานของ HAL จะยังคงทำงานในกรณีเริ่มต้น
    • การกำหนดค่าหรือการขอสตรีมจริงอาจลบล้างการเพิ่มประสิทธิภาพการใช้พลังงานภายในของ HAL และทำให้มีการใช้พลังงานมากขึ้น

การปรับแต่ง

คุณปรับแต่งการใช้งานอุปกรณ์ได้ด้วยวิธีต่อไปนี้

  • เอาต์พุตที่ผสานรวมของอุปกรณ์กล้องตรรกะขึ้นอยู่กับการใช้งาน HAL ทั้งหมด การตัดสินใจเกี่ยวกับวิธีที่สตรีมตรรกะที่ผสานรวมได้มาจากกล้องจริงจะโปร่งใสต่อแอปและเฟรมเวิร์กกล้องของ Android
  • คุณเลือกที่จะรองรับคำขอและผลลัพธ์จากกล้องจริงแต่ละตัวได้ ชุดพารามิเตอร์ที่ใช้ได้ในคำขอดังกล่าวขึ้นอยู่กับการใช้งาน HAL ที่เฉพาะเจาะจงด้วย
  • ตั้งแต่ Android 10 เป็นต้นมา HAL สามารถลดจำนวน กล้องที่แอปเปิดได้โดยตรงด้วยการเลือกที่จะไม่ ประกาศ PHYSICAL_ID บางรายการหรือทั้งหมดใน getCameraIdList จากนั้นการเรียกใช้ getPhysicalCameraCharacteristics จะต้องแสดงลักษณะของกล้องจริง

การตรวจสอบ

อุปกรณ์กล้องหลายตัวแบบตรรกะต้องผ่าน CTS กล้องเช่นเดียวกับกล้องทั่วไปอื่นๆ คุณดูเคสทดสอบที่กำหนดเป้าหมายเป็นอุปกรณ์ประเภทนี้ได้ใน LogicalCameraDeviceTest โมดูล

การทดสอบ ITS 3 รายการต่อไปนี้กำหนดเป้าหมายเป็นระบบกล้องหลายตัวเพื่อช่วยให้ผสานรวมรูปภาพได้อย่างเหมาะสม

การทดสอบฉากที่ 1 และฉากที่ 4 จะทำงานด้วย แท่นทดสอบ ITS-in-a-box การทดสอบ test_multi_camera_match จะยืนยันว่าความสว่างของกึ่งกลางรูปภาพตรงกันเมื่อเปิดใช้กล้องทั้ง 2 ตัว การทดสอบ test_multi_camera_alignment จะยืนยันว่ามีการโหลดพารามิเตอร์การเว้นระยะห่าง การวางแนว และการบิดเบือนของกล้องอย่างถูกต้อง หากระบบกล้องหลายตัวมีกล้อง FoV กว้าง (>90o) คุณจะต้องใช้กล่อง ITS เวอร์ชัน rev2

Sensor_fusion เป็นแท่นทดสอบที่ 2 ซึ่งช่วยให้สามารถเคลื่อนไหวโทรศัพท์ซ้ำๆ ตามที่กำหนดไว้ และยืนยันว่าการประทับเวลาของเครื่องวัดการหมุนและเซ็นเซอร์รูปภาพตรงกัน และเฟรมของกล้องหลายตัวซิงค์กัน

กล่องทั้งหมดมีจำหน่ายผ่าน AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) และ MYWAY Manufacturing (www.myway.tw, sales@myway.tw) นอกจากนี้ คุณยังซื้อกล่อง ITS เวอร์ชัน rev1 ได้ผ่าน West-Mark (www.west-mark.com, dgoodman@west-mark.com)

แนวทางปฏิบัติแนะนำ

หากต้องการใช้ประโยชน์จากฟีเจอร์ที่กล้องหลายตัวเปิดใช้ได้อย่างเต็มที่พร้อมทั้งรักษาความเข้ากันได้ของแอป ให้ทำตามแนวทางปฏิบัติแนะนำต่อไปนี้เมื่อใช้งานอุปกรณ์กล้องหลายตัวแบบตรรกะ

  • (Android 10 ขึ้นไป) ซ่อนกล้องย่อยจริงจาก getCameraIdList ซึ่งจะช่วยลดจำนวนกล้องที่แอปเปิดได้โดยตรง ทำให้แอปไม่จำเป็นต้องมีตรรกะการเลือกกล้องที่ซับซ้อน
  • (Android 11 ขึ้นไป) สำหรับอุปกรณ์กล้องหลายตัวแบบตรรกะที่รองรับการซูมแบบออปติคัล ให้ใช้ ANDROID_CONTROL_ZOOM_RATIO API และใช้ ANDROID_SCALER_CROP_REGION สำหรับครอบตัดอัตราส่วนกว้างยาวเท่านั้น ANDROID_CONTROL_ZOOM_RATIO ช่วยให้อุปกรณ์ซูมออกและรักษาความแม่นยำได้ดียิ่งขึ้น ในกรณีนี้ HAL ต้องปรับระบบพิกัดของ ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, และ ANDROID_STATISTICS_FACE_LANDMARKS เพื่อให้ถือว่าขอบเขตการมองเห็น หลังการซูมเป็นอาร์เรย์ที่ใช้งานอยู่ของเซ็นเซอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีที่ ANDROID_SCALER_CROP_REGION ทำงานร่วมกับ ANDROID_CONTROL_ZOOM_RATIO, ได้ที่ camera3_crop_reprocess#cropping
  • สำหรับอุปกรณ์กล้องหลายตัวที่มีกล้องจริงที่มีความสามารถแตกต่างกัน ให้ตรวจสอบว่าอุปกรณ์ประกาศการรองรับค่าหรือช่วงหนึ่งๆ สำหรับการควบคุมก็ต่อเมื่อช่วงการซูมทั้งหมดรองรับค่าหรือช่วงดังกล่าว เช่น หากกล้องตรรกะประกอบด้วยกล้องภาพมุมกว้างพิเศษ กล้องภาพมุมกว้าง และกล้องเทเลโฟโต้ ให้ทำดังนี้
    • หากขนาดอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงแตกต่างกัน Camera HAL ต้องทำการแมปจากอาร์เรย์ที่ใช้งานอยู่ของกล้องจริงไปยัง อาร์เรย์ที่ใช้งานอยู่ของกล้องตรรกะสำหรับ ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLES, และ ANDROID_STATISTICS_FACE_LANDMARKS เพื่อให้ระบบพิกัดมีขนาดอาร์เรย์ที่ใช้งานอยู่ของกล้องตรรกะจากมุมมองของแอป
    • หากกล้องภาพมุมกว้างและกล้องเทเลโฟโต้รองรับระบบโฟกัสอัตโนมัติ แต่กล้องภาพมุมกว้างพิเศษมีโฟกัสคงที่ ให้ตรวจสอบว่ากล้องตรรกะประกาศการรองรับระบบโฟกัสอัตโนมัติ HAL ต้องจำลองเครื่องสถานะระบบโฟกัสอัตโนมัติสำหรับกล้องภาพมุมกว้างพิเศษ เพื่อให้เมื่อแอปซูมออกไปที่เลนส์ภาพมุมกว้างพิเศษ แอปจะไม่ทราบว่ากล้องจริงที่เกี่ยวข้องมีโฟกัสคงที่ และเครื่องสถานะระบบโฟกัสอัตโนมัติสำหรับโหมด AF ที่รองรับจะทำงานตามที่คาดไว้
    • หากกล้องภาพมุมกว้างและกล้องเทเลโฟโต้รองรับ 4K @ 60 fps และกล้องภาพมุมกว้างพิเศษรองรับเฉพาะ 4K @ 30 fps หรือ 1080p @ 60 fps แต่ไม่รองรับ 4K @ 60 fps ให้ตรวจสอบว่ากล้องตรรกะไม่ได้ประกาศ 4k @ 60 fps ในการกำหนดค่าสตรีมที่รองรับ ซึ่งจะรับประกันความสมบูรณ์ของความสามารถของกล้องตรรกะ เพื่อให้แน่ใจว่าแอปจะไม่พบปัญหาที่ไม่สามารถแสดงผล 4k @ 60 fps ที่ค่า ANDROID_CONTROL_ZOOM_RATIO น้อยกว่า 1
  • ใน Android 10 ขึ้นไป กล้องหลายตัวแบบตรรกะไม่จำเป็นต้องรองรับชุดค่าผสมของสตรีมที่มีสตรีมจริง หาก HAL รองรับชุดค่าผสมที่มีสตรีมจริง ให้ทำดังนี้
    • (Android 11 ขึ้นไป) หากต้องการจัดการกรณีการใช้งานต่างๆ ได้ดียิ่งขึ้น เช่น ความลึกจากภาพสามมิติและการติดตามการเคลื่อนไหว ให้กำหนดขอบเขตการมองเห็นของเอาต์พุตสตรีมจริงให้กว้างที่สุดเท่าที่ฮาร์ดแวร์จะทำได้ อย่างไรก็ตาม หากสตรีมจริงและสตรีมตรรกะมาจากกล้องจริงตัวเดียวกัน ข้อจำกัดของฮาร์ดแวร์อาจทำให้ขอบเขตการมองเห็นของสตรีมจริงต้องเหมือนกับสตรีมตรรกะ
    • หากต้องการแก้ไขปัญหาหน่วยความจำเต็มที่เกิดจากสตรีมจริงหลายรายการ ให้ตรวจสอบว่าแอปใช้ discardFreeBuffers เพื่อยกเลิกการจัดสรรบัฟเฟอร์ว่าง (บัฟเฟอร์ที่ผู้ใช้ปล่อย แต่ผู้ผลิตยังไม่ได้นำออกจากคิว) หากคาดว่าสตรีมจริงจะไม่ได้ใช้งานเป็น ระยะเวลาหนึ่ง
    • หากโดยปกติแล้วสตรีมจริงจากกล้องจริงต่างๆ ไม่ได้แนบมากับคำขอเดียวกัน ให้ตรวจสอบว่าแอปใช้ surface groupเพื่อให้คิวบัฟเฟอร์ 1 รายการใช้เพื่อรองรับพื้นผิว 2 รายการที่แอปแสดง ซึ่งจะช่วยลดการใช้หน่วยความจำ