ระบบย่อย 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. เมื่อเปลี่ยนกรณีการใช้งาน ให้กลับไปที่ขั้นตอนที่ 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. เฟรมเวิร์กจะขอการตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานบางอย่างด้วย การเรียกไปยัง ICameraDeviceSession::constructDefaultRequestSettings() ซึ่งอาจเกิดขึ้นได้ทุกเมื่อหลังจากที่ ICameraDeviceSession สร้างโดย ICameraDevice::open
  3. เฟรมเวิร์กจะสร้างและส่งคำขอการจับภาพครั้งแรกไปยัง HAL พร้อมการตั้งค่าตามชุดการตั้งค่าเริ่มต้นชุดใดชุดหนึ่ง และมีสตรีมเอาต์พุตอย่างน้อย 1 รายการที่เฟรมเวิร์กได้ลงทะเบียนไว้ก่อนหน้านี้ ระบบจะส่งข้อมูลนี้ไปที่ 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() กลับมาแล้ว 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 ทั้งหมดทำงานตามหลักการที่คล้ายกัน และโดยทั่วไปแต่ละบล็อกจะมี 3 โหมด ได้แก่

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

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

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

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

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