ระบบย่อย HAL

คำขอ

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

รูปแบบคำขอของกล้อง

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

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

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

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

ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของกล้อง

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

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

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

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

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

สรุปการทำงานของ HAL

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

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

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

ส่วนนี้มีคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดไว้เมื่อใช้ Camera API โปรดดูคำจำกัดความของอินเทอร์เฟซ HIDL ได้ที่ platform/hardware/interfaces/camera/

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

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

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

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

หลังจากผ่านไปสักระยะเวลาหนึ่ง ระบบจะดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

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

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

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

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

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

ไปป์ไลน์กล้องจะละเว้นพารามิเตอร์บางรายการในคำขอจับภาพของแอป และใช้ค่าที่ได้จากรูทีนการควบคุม 3A แทน ทั้งนี้ขึ้นอยู่กับการตั้งค่าในบล็อกการควบคุม 3A ตัวอย่างเช่น เมื่อการเปิดรับแสงอัตโนมัติทำงานอยู่ พารามิเตอร์เวลาการเปิดรับแสง ระยะเวลาเฟรม และระดับความไวของเซ็นเซอร์จะควบคุมโดยอัลกอริทึม 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 (หากรองรับ)
ON_AUTO_FLASH ทุกอย่างเปิดอยู่ รวมถึง android.flash.firingPower, android.flash.firingTime และ android.flash.mode
ON_ALWAYS_FLASH เหมือนกับ ON_AUTO_FLASH
ON_AUTO_FLASH_RED_EYE เหมือนกับ ON_AUTO_FLASH
android.control.awbMode ปิด ไม่มี
WHITE_BALANCE_* android.colorCorrection.transform การปรับเฉพาะแพลตฟอร์มหาก android.colorCorrection.mode เป็น FAST หรือ HIGH_QUALITY
android.control.afMode ปิด ไม่มี
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization ปิด ไม่มี
เปิด สามารถปรับ android.scaler.cropRegion เพื่อใช้ระบบกันภาพสั่นสำหรับวิดีโอ
android.control.mode ปิด ปิดใช้ AE, AWB และ AF
อัตโนมัติ ใช้การตั้งค่า AE, AWB และ AF แต่ละรายการ
SCENE_MODE_* สามารถลบล้างพารามิเตอร์ทั้งหมดที่ระบุไว้ด้านบน ปิดใช้การควบคุม 3A แต่ละรายการ

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

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

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

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

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

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