ระบบย่อย HAL

คำขอ

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

รุ่นคำขอกล้อง

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

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

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

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

เลเยอร์การจัดการฮาร์ดแวร์โดยตรงของกล้อง

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

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

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

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

  1. ฟังและแจกแจงอุปกรณ์กล้อง
  2. เปิดอุปกรณ์และเชื่อมต่ออุปกรณ์รับฟัง
  3. กำหนดค่าเอาต์พุตสำหรับกรณีการใช้งานเป้าหมาย (เช่น การจับภาพนิ่ง บันทึก ฯลฯ)
  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 รายการ