ระบบย่อย HAL

หน้านี้อธิบายระบบย่อย HAL ซึ่งรวมถึงคำขอ ระบบย่อยของกล้อง ลำดับการเริ่มต้นและการทำงาน ระดับฮาร์ดแวร์ และการโต้ตอบ

คำขอ

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

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

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

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

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

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

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

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

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

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

สรุปการใช้ API

นี่คือสรุปขั้นตอนสั้นๆ สำหรับการใช้ Android Camera API ดูรายละเอียดขั้นตอนเหล่านี้ รวมถึงการเรียก 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 ต่อไปเพื่อรับ บัฟเฟอร์การตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานอื่นๆ ตามที่จำเป็น
  5. เมื่อการจับภาพคำขอเริ่มต้น (เซ็นเซอร์เริ่มเปิดรับแสงสำหรับการ จับภาพ) HAL จะเรียกใช้ ICameraDeviceCallback::notify พร้อม ข้อความ SHUTTER ซึ่งรวมถึงหมายเลขเฟรมและการประทับเวลาสำหรับการเริ่มต้น การเปิดรับแสง การเรียกกลับ notify นี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียก 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 OFF ไม่มี
ON android.sensor.exposureTime, android.sensor.frameDuration, android.sensor.sensitivity, android.lens.aperture (หากรองรับ) และ android.lens.filterDensity (หากรองรับ)
ON_AUTO_FLASH ทุกอย่างเป็น ON พร้อมด้วย 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 OFF ไม่มี
WHITE_BALANCE_* android.colorCorrection.transform การปรับเฉพาะแพลตฟอร์มหาก android.colorCorrection.mode เป็น FAST หรือ HIGH_QUALITY
android.control.afMode OFF ไม่มี
FOCUS_MODE_* android.lens.focusDistance
android.control.videoStabilization OFF ไม่มี
ON สามารถปรับ android.scaler.cropRegion เพื่อใช้ระบบกันภาพสั่นสำหรับวิดีโอ
android.control.mode OFF ปิดใช้ AE, AWB และ AF
AUTO ระบบจะใช้การตั้งค่า AE, AWB และ AF แต่ละรายการ
SCENE_MODE_* สามารถลบล้างพารามิเตอร์ทั้งหมดที่ระบุไว้ข้างต้น ปิดใช้การควบคุม 3A แต่ละรายการอยู่

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

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

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

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

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

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