ระบบย่อย HAL

คำขอ

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

โมเดลคำขอใช้งานกล้อง

รูปที่ 1 รุ่นของกล้อง

HAL และระบบย่อยของกล้อง

ระบบย่อยของกล้องประกอบด้วยการใช้งานส่วนประกอบต่างๆ ในกล้อง เช่น อัลกอริทึม 3A และการควบคุมการประมวลผล HAL ของกล้อง จะมีอินเทอร์เฟซให้คุณนำเวอร์ชันต่างๆ ขององค์ประกอบเหล่านี้ไปใช้ ถึง รักษาความเข้ากันได้ข้ามแพลตฟอร์มระหว่างผู้ผลิตอุปกรณ์หลายราย ผู้ให้บริการตัวประมวลผลสัญญาณภาพ (ISP หรือเซ็นเซอร์กล้อง) ไปป์ไลน์ของกล้อง เป็นแบบจำลองเสมือนจริงและไม่ตรงกับ ISP จริงใดๆ อย่างไรก็ตาม คล้ายกับไปป์ไลน์การประมวลผลข้อมูลจริง เพื่อให้คุณสามารถแมปกับ ฮาร์ดแวร์ได้อย่างมีประสิทธิภาพ นอกจากนี้ โมเดลนี้มีลักษณะเป็นนามธรรมเพียงพอที่จะทำให้ อัลกอริทึมและลำดับการทำงานต่างๆ โดยไม่กระทบต่อ คุณภาพ ประสิทธิภาพ หรือความเข้ากันได้ข้ามอุปกรณ์

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

ชั้นการจัดการฮาร์ดแวร์กล้อง

รูปที่ 2 ไปป์ไลน์กล้อง

โปรดทราบว่า บล็อกการประมวลผลภาพบางบล็อกที่แสดงในแผนภาพด้านบน ได้รับการกำหนดไว้เป็นอย่างดีในรุ่นแรก ไปป์ไลน์ของกล้องทำสิ่งต่อไปนี้ สมมติฐาน:

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

สรุปการใช้ API
ต่อไปนี้เป็นสรุปขั้นตอนการใช้ API กล้องของ Android โปรดดู เพื่อดูรายละเอียดของการเริ่มต้นทำงานและลำดับการดำเนินการที่คาดไว้ ขั้นตอนเหล่านี้ รวมถึงการเรียก API

  1. ฟังและแจกแจงอุปกรณ์กล้อง
  2. เปิดอุปกรณ์และเชื่อมต่อผู้ฟัง
  3. กำหนดค่าเอาต์พุตสำหรับ Use Case เป้าหมาย (เช่น การจับภาพ การบันทึก เป็นต้น)
  4. สร้างคำขอสำหรับ Use Case เป้าหมาย
  5. จับภาพ/ทำซ้ำคำขอและภาพถ่ายอัจฉริยะ
  6. รับข้อมูลเมตาของผลลัพธ์และข้อมูลรูปภาพ
  7. เมื่อเปลี่ยนกรณีการใช้งาน ให้กลับไปที่ขั้นตอนที่ 3

สรุปการดำเนินการ HAL

  • คำขอแบบไม่พร้อมกันสำหรับการจับภาพมาจากเฟรมเวิร์ก
  • อุปกรณ์ HAL ต้องประมวลผลคำขอตามลำดับ และสำหรับคำขอแต่ละรายการ ข้อมูลเมตาของผลลัพธ์เอาต์พุต และบัฟเฟอร์รูปภาพเอาต์พุตอย่างน้อย 1 รายการ
  • มีสิทธิ์ก่อน ได้ก่อนสำหรับคำขอและผลลัพธ์ และสำหรับสตรีมที่อ้างอิงโดย คำขอที่ตามมา
  • การประทับเวลาต้องเหมือนกันสำหรับเอาต์พุตทั้งหมดจากคำขอที่ระบุ ดังนั้น ของเฟรมเวิร์กสามารถจับคู่ เนื้อหาด้วยกันได้หากจำเป็น
  • การกำหนดค่าและสถานะการบันทึกทั้งหมด (ยกเว้นกิจวัตร 3A) คือ รวมอยู่ในคำขอและผลลัพธ์
ภาพรวม HAL ของกล้อง

รูปที่ 3 ภาพรวม HAL ของกล้อง

ลำดับการเริ่มต้นและการดำเนินงานที่คาดไว้

ส่วนนี้ประกอบด้วยคำอธิบายโดยละเอียดของขั้นตอนที่ควรมีเมื่อใช้ API กล้องถ่ายรูป โปรดดู แพลตฟอร์ม/ฮาร์ดแวร์/อินเทอร์เฟซ/กล้อง/สำหรับอินเทอร์เฟซ HIDL คำจำกัดความ

แจกแจง เปิดอุปกรณ์กล้อง และสร้างเซสชันที่ใช้งานอยู่

  1. หลังจากเริ่มต้น เฟรมเวิร์กจะเริ่มรอฟังเหตุการณ์ปัจจุบัน ผู้ให้บริการกล้องที่ใช้ อินเทอร์เฟซของ ICameraProvider หากผู้ให้บริการดังกล่าวหรือ ให้บริการ เฟรมเวิร์กจะพยายามสร้างการเชื่อมต่อ
  2. เฟรมเวิร์กแจกแจงอุปกรณ์กล้องผ่าน ICameraProvider::getCameraIdList()
  3. เฟรมเวิร์กนี้จะสร้างอินสแตนซ์ ICameraDevice ใหม่โดยเรียกใช้โอเปอเรเตอร์ ICameraProvider::getCameraDeviceInterface_VX_X()
  4. เฟรมเวิร์กนี้เรียกใช้ ICameraDevice::open() เพื่อสร้าง เซสชันการจับภาพ IcameraDeviceSession ที่ทำงานอยู่

ใช้เซสชันกล้องที่ใช้งานอยู่

  1. เฟรมเวิร์กนี้เรียก ICameraDeviceSession::configureStreams() ด้วยรายการสตรีมอินพุต/เอาต์พุตไปยังอุปกรณ์ HAL
  2. เฟรมเวิร์กขอการตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานบางกรณีที่มี โทรหา ICameraDeviceSession::constructDefaultRequestSettings() ซึ่งอาจเกิดขึ้นได้ตลอดเวลาหลังจาก ICameraDeviceSession สร้างโดย ICameraDevice::open
  3. เฟรมเวิร์กนี้จะสร้างและส่งคำขอดักจับรายการแรกไปยัง HAL โดยมี ตามชุดการตั้งค่าเริ่มต้น และมีอย่างน้อยหนึ่งชุด สตรีมเอาต์พุตที่ลงทะเบียนก่อนหน้านี้โดยเฟรมเวิร์ก ส่งข้อความนี้แล้ว ในการแข่งขัน HAL กับ ICameraDeviceSession::processCaptureRequest() HAL ต้องบล็อกการกลับมาของการโทรนี้จนกว่าจะพร้อมสำหรับการประชุมครั้งถัดไป ให้ส่งคำขอ
  4. เฟรมเวิร์กจะยังคงส่งคำขอและการเรียกใช้อย่างต่อเนื่อง ICameraDeviceSession::constructDefaultRequestSettings()เพื่อรับ การตั้งค่าเริ่มต้นของการบัฟเฟอร์สำหรับกรณีการใช้งานอื่นๆ ตามความจำเป็น
  5. เมื่อการจับภาพคำขอเริ่มขึ้น (เซ็นเซอร์เริ่มแสดง การจับภาพ) การโทร HAL ICameraDeviceCallback::notify() ด้วย ข้อความ SHUTTER รวมถึงหมายเลขเฟรมและการประทับเวลาของการเริ่ม ของจำนวนผู้ที่เห็น การเรียกกลับที่แจ้งเตือนนี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียก มีการเรียกคำขอ processCaptureResult() ครั้ง แต่ไม่มีผลลัพธ์ ไปยังแอปเพื่อจับภาพได้จนกว่า ระบบจะเรียกใช้ notify() สำหรับการจับภาพนั้น
  6. หลังจากเกิดความล่าช้าในไปป์ไลน์ HAL จะเริ่มส่งกลับการบันทึกที่เสร็จสมบูรณ์แล้วไปยัง เฟรมเวิร์กด้วย ICameraDeviceCallback::processCaptureResult() ซึ่งจะส่งคืนในลำดับเดียวกับคำขอที่ส่ง หลายสกุลเงิน คำขออาจอยู่ระหว่างดำเนินการพร้อมกัน ทั้งนี้ขึ้นอยู่กับความลึกไปป์ไลน์ของ ระดับ HAL ของกล้อง

หลังจากนั้นสักครู่ สิ่งต่อไปนี้จะเกิดขึ้น

  • เฟรมเวิร์กอาจหยุดส่งคำขอใหม่ โปรดรอ การจับภาพที่มีอยู่เพื่อดำเนินการให้เสร็จสมบูรณ์ (การบัฟเฟอร์ทั้งหมด, ผลลัพธ์ทั้งหมด) ส่งคืนแล้ว) แล้วโทรไปที่ ICameraDeviceSession::configureStreams() อีกครั้ง การดำเนินการนี้จะรีเซ็ตฮาร์ดแวร์กล้องและไปป์ไลน์สำหรับชุดใหม่ สตรีมอินพุต/เอาต์พุต ระบบอาจนำสตรีมบางรายการมาใช้ซ้ำจากสตรีมก่อนหน้า การกำหนดค่า จากนั้นเฟรมเวิร์กจะดำเนินการต่อจากคำขอบันทึกรายการแรก สำหรับ HAL หากมีอย่างน้อย 1 ข้อ สตรีมเอาต์พุตที่ลงทะเบียนไว้ยังคงอยู่ (มิฉะนั้น ต้องระบุ ICameraDeviceSession::configureStreams() ก่อน)
  • เฟรมเวิร์กอาจเรียกใช้ ICameraDeviceSession::close() เพื่อจบเซสชันของกล้อง ระบบอาจโทรติดต่อนี้เมื่อใดก็ได้เมื่อไม่มีการโทรอื่นๆ จากเฟรมเวิร์กทำงานอยู่ แม้ว่าการเรียกอาจบล็อก การบันทึกขณะอยู่บนเครื่องบินเสร็จสมบูรณ์แล้ว (ผลลัพธ์ทั้งหมดแสดงกลับมา และบัฟเฟอร์ทั้งหมด เติมพื้น) หลังจากโทรกลับ close() แล้ว จะไม่มีการโทรหา ICameraDeviceCallback ได้รับอนุญาตจาก HAL เมื่อ กำลังเรียก close() อยู่ เฟรมเวิร์กนี้ไม่สามารถเรียก ฟังก์ชันของอุปกรณ์ HAL
  • ในกรณีที่เกิดข้อผิดพลาดหรือเหตุการณ์ที่ไม่พร้อมกันอื่นๆ HAL จะต้องเรียกใช้ ICameraDeviceCallback::notify() พร้อม ข้อความแสดงข้อผิดพลาด/เหตุการณ์ หลังจากกลับมาจากการแจ้งเตือนข้อผิดพลาดร้ายแรงทั่วทั้งอุปกรณ์ HAL ควร ดำเนินการราวกับว่ามีการเรียก close() ในอุปกรณ์นั้นแล้ว อย่างไรก็ตาม HAL จะต้อง ยกเลิกเลยก็ได้ หรือดำเนินการจับภาพที่รอดำเนินการทั้งหมดก่อนโทรหา notify() เพื่อที่ว่า ระบบเรียก notify() ด้วยข้อผิดพลาดร้ายแรง เฟรมเวิร์กนี้จะไม่ ได้รับการติดต่อกลับจากอุปกรณ์อีก วิธีการนอกเหนือจาก close() ควรส่งคืน -ENODEV หรือ NULL หลังจากเมธอด notify() แสดงผลจากข้อผิดพลาดร้ายแรง ข้อความแสดงข้อผิดพลาด
ขั้นตอนการดำเนินการของกล้อง

รูปที่ 4 ขั้นตอนการดำเนินการของกล้อง

ระดับฮาร์ดแวร์

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

การโต้ตอบระหว่างคำขอบันทึกแอป การควบคุม 3A และไปป์ไลน์การประมวลผล

ไปป์ไลน์ของกล้องจะไม่สนใจการตั้งค่าดังกล่าว ทั้งนี้ขึ้นอยู่กับการตั้งค่าในบล็อกการควบคุม 3A พารามิเตอร์บางตัวในคำขอบันทึกของแอปและใช้ค่า จากกิจวัตรการควบคุม 3A แทน เช่น เมื่อการรับแสงอัตโนมัติ เวลาเปิดรับแสง ระยะเวลาของเฟรม และพารามิเตอร์ความไวของ เซ็นเซอร์จะควบคุมโดยอัลกอริทึม Platform 3A และค่าต่างๆ ที่ระบุโดยแอป จะถูกละเว้น ต้องรายงานค่าที่กิจวัตร 3A เลือกไว้สำหรับเฟรมตามกิจวัตร ในข้อมูลเมตาของเอาต์พุต ตารางต่อไปนี้อธิบายโหมดต่างๆ ของ 3A บล็อกควบคุมและคุณสมบัติที่ควบคุมโดยโหมดเหล่านี้ โปรดดู Platform/system/media/camera/docs/docs.html เพื่อดูคำจำกัดความของพร็อพเพอร์ตี้เหล่านี้

พารามิเตอร์ รัฐ ควบคุมคุณสมบัติแล้ว
android.control.aeMode ปิด ไม่มี
เปิด android.sensor.exposureTime android.sensor.frameDuration android.sensor.sensitivity android.lens.aperture (หากรองรับ) android.lens.filterDensity (หากรองรับ)
เปิดแฟลชอัตโนมัติ ทุกอย่างเปิดอยู่ รวมทั้ง android.flash.firingPower, android.flash.firingTime และ android.flash.mode
เปิดทุกครั้งแฟลช เหมือนกับ ON_AUTO_FLASH
ON_AUTO_FLASH_สีแดง_EYE เหมือนกับ ON_AUTO_FLASH
android.control.awbMode ปิด ไม่มี
ไวท์_บาลานซ์* android.colorCorrection.transform การปรับเฉพาะแพลตฟอร์มหาก android.colorFixion.mode เป็น FAST หรือ HIGH_QUALITY
android.control.afMode ปิด ไม่มี
โฟกัส_โหมด_* android.lens.FocusDistance
android.control.videoStabilization ปิด ไม่มี
เปิด ปรับ android.scaler.cropRegion เพื่อใช้ระบบกันภาพวิดีโอสั่นได้
android.control.mode ปิด ปิดใช้ AE, AWB และ AF อยู่
อัตโนมัติ ใช้การตั้งค่า AE, AWB และ AF แต่ละรายการ
โหมด_* ลบล้างพารามิเตอร์ทั้งหมดที่แสดงด้านบนได้ ปิดใช้การควบคุม 3A แต่ละรายการอยู่

การควบคุมในบล็อกการประมวลผลภาพในรูปที่ 2 ทั้งหมดทำงานใน และโดยทั่วไปแต่ละบล็อกจะมี 3 โหมด ดังนี้

  • ปิด: การบล็อกการประมวลผลนี้ปิดใช้อยู่ การสาธิต การแก้สี และ ปิดใช้บล็อกการปรับเส้นโค้งโทนไม่ได้
  • รวดเร็ว: ในโหมดนี้ บล็อกการประมวลผลอาจไม่ทำให้เฟรมเอาต์พุตช้าลง เมื่อเทียบกับโหมด ปิด แต่ควรให้ประสิทธิภาพการทำงานดีที่สุด อาจมีข้อจำกัดดังกล่าว โดยปกติจะใช้สำหรับ โหมดแสดงตัวอย่างหรือโหมดบันทึกวิดีโอ หรือถ่ายภาพต่อเนื่องสำหรับภาพนิ่ง ในบางส่วน อุปกรณ์ ซึ่งอาจเทียบเท่ากับโหมดปิด (ไม่สามารถประมวลผลข้อมูลได้หากไม่มี ทำให้อัตราเฟรมช้าลง) และในอุปกรณ์บางเครื่อง อาจเทียบเท่ากับ โหมด HIGH_QUALITY (คุณภาพที่ดีที่สุดจะไม่ทำให้อัตราเฟรมช้าลง)
  • HIGH_QUALITY: ในโหมดนี้ บล็อกการประมวลผลควรสร้าง เพื่อให้ได้ผลลัพธ์ที่มีคุณภาพได้ ทำให้อัตราเฟรมของเอาต์พุตช้าลงตามความจำเป็น โดยปกติมักจะใช้สำหรับการจับภาพต่อเนื่องที่มีคุณภาพสูง บางบล็อก รวมการควบคุมด้วยตนเอง ซึ่งสามารถเลือกแทน FAST หรือ HIGH_QUALITY เช่น บล็อกการแก้สีรองรับสี แปลงเมทริกซ์ ในขณะที่การปรับเส้นโค้งโทนสีจะสนับสนุน ของเส้นโค้งการแมปโทนสี

อัตราเฟรมสูงสุดที่ระบบย่อยของกล้องรองรับได้คือฟังก์ชัน จากหลายปัจจัย

  • ความละเอียดที่ขอของสตรีมรูปภาพเอาต์พุต
  • ความพร้อมใช้งานของโหมด Binning/ข้ามในอิมเมจ
  • แบนด์วิดท์ของอินเทอร์เฟซอิมเมจr
  • แบนด์วิดท์ของบล็อกการประมวลผลของ ISP ต่างๆ

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

  • เซ็นเซอร์รูปภาพจะได้รับการกำหนดค่าให้แสดงด้วยความละเอียดที่เล็กที่สุดเสมอ ที่เป็นไปได้ตามขนาดของสตรีมเอาต์พุตที่ขอของแอป โฆษณาขนาดเล็กที่สุด ความละเอียดต่ำสุดหมายถึงใหญ่พอๆ กับความละเอียดสูงสุดที่ขอเป็นอย่างน้อย ขนาดสตรีมเอาต์พุต
  • เนื่องจากคำขอใดก็ตามอาจใช้สตรีมเอาต์พุตที่กำหนดค่าในปัจจุบันทั้งหมดหรือบางส่วน เซ็นเซอร์และ ISP ต้องได้รับการกำหนดค่าเพื่อรองรับการปรับขนาดการจับภาพเพียงครั้งเดียว สตรีมทั้งหมดพร้อมกันได้
  • สตรีม JPEG ทำหน้าที่เหมือนสตรีม YUV ที่ประมวลผลแล้วสำหรับคำขอที่จะประมวลผล ไม่รวม ในคำขอที่มีการอ้างอิงโดยตรง ผู้ลงโฆษณาจะทำหน้าที่เป็น สตรีม JPEG
  • โปรเซสเซอร์ JPEG สามารถทํางานพร้อมกันกับไปป์ไลน์กล้องอื่นๆ แต่ ไม่สามารถประมวลผลการจับภาพพร้อมกันมากกว่า 1 รายการ