ระบบย่อย HAL

คำขอ

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

รุ่นขอกล้อง

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

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

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

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

เลเยอร์นามธรรมของฮาร์ดแวร์กล้อง

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

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

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

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

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

สรุปการดำเนินงานของ HAL

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

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

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

ส่วนนี้ประกอบด้วยคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดหวังเมื่อใช้ API ของกล้อง โปรดดู แพลตฟอร์ม/ฮาร์ดแวร์/อินเทอร์เฟซ/กล้อง/ สำหรับคำจำกัดความอินเทอร์เฟซ HIDL

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

  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 ด้วยการตั้งค่าตามชุดการตั้งค่าเริ่มต้นชุดใดชุดหนึ่ง และอย่างน้อยหนึ่งสตรีมเอาต์พุตที่ได้รับการลงทะเบียนก่อนหน้านี้โดยกรอบงาน สิ่งนี้จะถูกส่งไปยัง HAL ด้วย ICameraDeviceSession::processCaptureRequest() HAL จะต้องบล็อกการโทรกลับจนกว่าจะพร้อมสำหรับการส่งคำขอครั้งต่อไป
  4. กรอบงานยังคงส่งคำขอและการเรียก ICameraDeviceSession::constructDefaultRequestSettings() เพื่อรับบัฟเฟอร์การตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานอื่น ๆ ตามความจำเป็น
  5. เมื่อการจับคำขอเริ่มต้นขึ้น (เซ็นเซอร์เริ่มเปิดเผยสำหรับการจับภาพ) HAL จะเรียก ICameraDeviceCallback::notify() พร้อมข้อความ SHUTTER รวมถึงหมายเลขเฟรมและการประทับเวลาสำหรับการเริ่มต้นการเปิดเผย การแจ้งเตือนการโทรกลับนี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียก processCaptureResult() ครั้งแรกเพื่อขอคำขอ แต่ไม่มีผลลัพธ์ใดถูกส่งไปยังแอปพลิเคชันสำหรับการจับภาพจนกระทั่งหลังจาก notify() สำหรับการจับภาพนั้นถูกเรียก
  6. หลังจากความล่าช้าไปป์ไลน์ HAL จะเริ่มส่งคืนการจับภาพที่เสร็จสมบูรณ์ไปยังเฟรมเวิร์กด้วย ICameraDeviceCallback::processCaptureResult() สิ่งเหล่านี้จะถูกส่งกลับในลำดับเดียวกับคำขอที่ถูกส่ง สามารถส่งคำขอหลายรายการพร้อมกันได้ ขึ้นอยู่กับความลึกไปป์ไลน์ของอุปกรณ์ HAL ของกล้อง

หลังจากผ่านไประยะหนึ่ง จะเกิดเหตุการณ์อย่างใดอย่างหนึ่งต่อไปนี้:

  • กรอบงานอาจหยุดส่งคำขอใหม่ รอให้การจับภาพที่มีอยู่เสร็จสมบูรณ์ (บัฟเฟอร์ทั้งหมดเต็ม ผลลัพธ์ทั้งหมดส่งคืน) แล้วเรียก ICameraDeviceSession::configureStreams() อีกครั้ง วิธีนี้จะรีเซ็ตฮาร์ดแวร์ของกล้องและไปป์ไลน์สำหรับสตรีมอินพุต/เอาต์พุตชุดใหม่ สตรีมบางรายการอาจนำมาใช้ซ้ำจากการกำหนดค่าครั้งก่อน จากนั้นเฟรมเวิร์กจะดำเนินการต่อจากคำขอจับภาพครั้งแรกไปยัง HAL หากยังคงมีเอาต์พุตสตรีมที่ลงทะเบียนไว้อย่างน้อยหนึ่งสตรีม (มิฉะนั้น จำเป็นต้องมี ICameraDeviceSession::configureStreams() ก่อน)
  • กรอบงานอาจเรียก ICameraDeviceSession::close() เพื่อสิ้นสุดเซสชันของกล้อง สิ่งนี้สามารถเรียกได้ตลอดเวลาเมื่อไม่มีการเรียกอื่นจากเฟรมเวิร์กที่ทำงานอยู่ แม้ว่าการโทรอาจบล็อกจนกว่าการจับภาพบนเครื่องบินทั้งหมดจะเสร็จสิ้น (ผลลัพธ์ทั้งหมดส่งคืน บัฟเฟอร์ทั้งหมดเต็มแล้ว) หลังจากการเรียก close() กลับมา จะไม่อนุญาตให้เรียก ICameraDeviceCallback จาก HAL อีกต่อไป เมื่อมีการเรียกใช้ 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_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 ปิด ไม่มี
โฟกัส_MODE_* android.lens.focusDistance
android.control.videoเสถียรภาพ ปิด ไม่มี
บน สามารถปรับ android.scaler.cropRegion เพื่อใช้ระบบป้องกันภาพสั่นไหวของวิดีโอ
android.control.mode ปิด AE, AWB และ AF ถูกปิดใช้งาน
อัตโนมัติ ใช้การตั้งค่า AE, AWB และ AF ส่วนบุคคล
ฉาก_MODE_* สามารถแทนที่พารามิเตอร์ทั้งหมดที่ระบุไว้ข้างต้นได้ ตัวควบคุม 3A ส่วนบุคคลถูกปิดใช้งาน

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

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

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

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

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

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