ระบบย่อย 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 ของกล้อง

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

ส่วนนี้มีคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดไว้เมื่อใช้ 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() ซึ่งอาจเกิดขึ้นได้ทุกเมื่อหลังจากที่ ICameraDevice::open สร้าง ICameraDeviceSession
  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 รายการ