คำขอ
กรอบงานแอปส่งคำขอผลลัพธ์ที่บันทึกไว้ไปยังระบบย่อยของกล้อง หนึ่งคำขอสอดคล้องกับผลลัพธ์หนึ่งชุด คำขอสรุปข้อมูลการกำหนดค่าทั้งหมดเกี่ยวกับการจับภาพและการประมวลผลผลลัพธ์เหล่านั้น ซึ่งรวมถึงสิ่งต่างๆ เช่น ความละเอียดและรูปแบบพิกเซล เซ็นเซอร์แบบแมนนวล เลนส์ และการควบคุมแฟลช โหมดการทำงาน 3A; การควบคุมการประมวลผล RAW ถึง YUV; และการสร้างสถิติ ซึ่งช่วยให้สามารถควบคุมเอาต์พุตและการประมวลผลผลลัพธ์ได้มากขึ้น สามารถส่งคำขอได้หลายคำขอพร้อมกัน และการส่งคำขอจะไม่ถูกบล็อก และคำขอจะได้รับการประมวลผลตามลำดับที่ได้รับเสมอ
HAL และระบบย่อยของกล้อง
ระบบย่อยของกล้องประกอบด้วยการใช้งานส่วนประกอบต่างๆ ในไปป์ไลน์ของกล้อง เช่น อัลกอริธึม 3A และการควบคุมการประมวลผล กล้อง HAL มีอินเทอร์เฟซสำหรับคุณในการปรับใช้ส่วนประกอบเหล่านี้ในเวอร์ชันของคุณ เพื่อรักษาความเข้ากันได้ข้ามแพลตฟอร์มระหว่างผู้ผลิตอุปกรณ์หลายรายและผู้ขายโปรเซสเซอร์สัญญาณภาพ (ISP หรือเซ็นเซอร์กล้อง) โมเดลไปป์ไลน์ของกล้องจึงเป็นแบบเสมือนและไม่สอดคล้องกับ ISP จริงใดๆ โดยตรง อย่างไรก็ตาม มันคล้ายกับไปป์ไลน์การประมวลผลจริงมากพอ ดังนั้นคุณจึงสามารถแมปกับฮาร์ดแวร์ของคุณได้อย่างมีประสิทธิภาพ นอกจากนี้ ยังเป็นนามธรรมเพียงพอที่จะอนุญาตให้ใช้อัลกอริธึมและลำดับการทำงานที่แตกต่างกันได้หลากหลาย โดยไม่กระทบต่อคุณภาพ ประสิทธิภาพ หรือความเข้ากันได้ข้ามอุปกรณ์
ไปป์ไลน์ของกล้องยังรองรับทริกเกอร์ที่เฟรมเวิร์กแอปสามารถเริ่มต้นเพื่อเปิดสิ่งต่างๆ เช่น โฟกัสอัตโนมัติ นอกจากนี้ยังส่งการแจ้งเตือนกลับไปยังเฟรมเวิร์กของแอป โดยแจ้งเตือนแอปเกี่ยวกับเหตุการณ์ต่างๆ เช่น การล็อคโฟกัสอัตโนมัติหรือข้อผิดพลาด
โปรดทราบว่า บล็อกการประมวลผลภาพบางส่วนที่แสดงในแผนภาพด้านบนไม่ได้มีการกำหนดไว้อย่างชัดเจนในการเปิดตัวครั้งแรก ไปป์ไลน์ของกล้องมีสมมติฐานดังต่อไปนี้:
- เอาต์พุต RAW Bayer ไม่มีการประมวลผลภายใน ISP
- สถิติถูกสร้างขึ้นตามข้อมูลเซ็นเซอร์ดิบ
- บล็อกการประมวลผลต่างๆ ที่แปลงข้อมูลเซ็นเซอร์ดิบเป็น YUV อยู่ในลำดับที่กำหนดเอง
- ในขณะที่แสดงหน่วยมาตราส่วนและส่วนครอบตัดหลายหน่วย หน่วยมาตราส่วนทั้งหมดจะใช้การควบคุมขอบเขตเอาต์พุตร่วมกัน (ซูมแบบดิจิทัล) อย่างไรก็ตาม แต่ละหน่วยอาจมีความละเอียดเอาต์พุตและรูปแบบพิกเซลที่แตกต่างกัน
สรุปการใช้งาน API
นี่เป็นบทสรุปโดยย่อของขั้นตอนในการใช้ API กล้อง Android ดูส่วนการเริ่มต้นและลำดับการดำเนินการที่คาดหวังสำหรับรายละเอียดรายละเอียดของขั้นตอนเหล่านี้ รวมถึงการเรียก API
- ฟังและแจกแจงอุปกรณ์กล้อง
- เปิดอุปกรณ์และเชื่อมต่อผู้ฟัง
- กำหนดค่าเอาต์พุตสำหรับกรณีการใช้งานเป้าหมาย (เช่น การบันทึกภาพนิ่ง การบันทึก ฯลฯ)
- สร้างคำขอสำหรับกรณีการใช้งานเป้าหมาย
- จับภาพ/ทำซ้ำคำขอและการระเบิด
- รับข้อมูลเมตาของผลลัพธ์และข้อมูลรูปภาพ
- เมื่อเปลี่ยนกรณีการใช้งาน ให้กลับไปที่ขั้นตอนที่ 3
สรุปการดำเนินงานของ HAL
- คำขอจับภาพแบบอะซิงโครนัสมาจากกรอบงาน
- อุปกรณ์ HAL ต้องดำเนินการตามคำขอตามลำดับ และสำหรับแต่ละคำขอ ให้สร้างข้อมูลเมตาของผลลัพธ์เอาต์พุต และบัฟเฟอร์รูปภาพเอาต์พุตอย่างน้อยหนึ่งบัฟเฟอร์
- เข้าก่อนออกก่อนสำหรับคำขอและผลลัพธ์ และสำหรับสตรีมที่อ้างอิงโดยคำขอที่ตามมา
- การประทับเวลาจะต้องเหมือนกันสำหรับเอาต์พุตทั้งหมดจากคำขอที่กำหนด เพื่อให้กรอบงานสามารถจับคู่เข้าด้วยกันได้หากจำเป็น
- การกำหนดค่าและสถานะการบันทึกทั้งหมด (ยกเว้นรูทีน 3A) ถูกรวมไว้ในคำขอและผลลัพธ์
การเริ่มต้นและลำดับการดำเนินการที่คาดไว้
ส่วนนี้ประกอบด้วยคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดหวังเมื่อใช้ API ของกล้อง โปรดดู แพลตฟอร์ม/ฮาร์ดแวร์/อินเทอร์เฟซ/กล้อง/ สำหรับคำจำกัดความอินเทอร์เฟซ HIDL
การแจกแจง การเปิดอุปกรณ์กล้อง และสร้างเซสชันที่ใช้งานอยู่
- หลังจากการเริ่มต้น เฟรมเวิร์กจะเริ่มรับฟังผู้ให้บริการกล้องปัจจุบันที่ใช้อินเทอร์เฟซ
ICameraProvider
หากมีผู้ให้บริการดังกล่าว กรอบงานจะพยายามสร้างการเชื่อมต่อ - กรอบงานจะระบุอุปกรณ์กล้องผ่าน
ICameraProvider::getCameraIdList()
- กรอบงานสร้างอินสแตนซ์
ICameraDevice
ใหม่โดยการเรียกICameraProvider::getCameraDeviceInterface_VX_X()
ที่เกี่ยวข้อง - กรอบงานเรียก
ICameraDevice::open()
เพื่อสร้างเซสชันการจับภาพที่ใช้งานอยู่ใหม่ ICameraDeviceSession
การใช้เซสชันกล้องที่ใช้งานอยู่
- กรอบงานเรียก
ICameraDeviceSession::configureStreams()
พร้อมด้วยรายการสตรีมอินพุต/เอาท์พุตไปยังอุปกรณ์ HAL - เฟรมเวิร์กร้องขอการตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานบางกรณีที่มีการเรียกไปยัง
ICameraDeviceSession::constructDefaultRequestSettings()
สิ่งนี้อาจเกิดขึ้นได้ตลอดเวลาหลังจากที่ICameraDeviceSession
ถูกสร้างขึ้นโดยICameraDevice::open
- กรอบงานสร้างและส่งคำขอจับภาพครั้งแรกไปยัง HAL ด้วยการตั้งค่าตามชุดการตั้งค่าเริ่มต้นชุดใดชุดหนึ่ง และอย่างน้อยหนึ่งสตรีมเอาต์พุตที่ได้รับการลงทะเบียนก่อนหน้านี้โดยกรอบงาน สิ่งนี้จะถูกส่งไปยัง HAL ด้วย
ICameraDeviceSession::processCaptureRequest()
HAL จะต้องบล็อกการโทรกลับจนกว่าจะพร้อมสำหรับการส่งคำขอครั้งต่อไป - กรอบงานยังคงส่งคำขอและการเรียก
ICameraDeviceSession::constructDefaultRequestSettings()
เพื่อรับบัฟเฟอร์การตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานอื่น ๆ ตามความจำเป็น - เมื่อการจับคำขอเริ่มต้นขึ้น (เซ็นเซอร์เริ่มเปิดเผยสำหรับการจับภาพ) HAL จะเรียก
ICameraDeviceCallback::notify()
พร้อมข้อความ SHUTTER รวมถึงหมายเลขเฟรมและการประทับเวลาสำหรับการเริ่มต้นการเปิดเผย การแจ้งเตือนการโทรกลับนี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียกprocessCaptureResult()
ครั้งแรกเพื่อขอคำขอ แต่ไม่มีผลลัพธ์ใดถูกส่งไปยังแอปพลิเคชันสำหรับการจับภาพจนกระทั่งหลังจากnotify()
สำหรับการจับภาพนั้นถูกเรียก - หลังจากความล่าช้าไปป์ไลน์ 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()
ส่งคืนจากข้อความแสดงข้อผิดพลาดร้ายแรง
ระดับฮาร์ดแวร์
อุปกรณ์กล้องสามารถใช้ฮาร์ดแวร์ได้หลายระดับขึ้นอยู่กับความสามารถ สำหรับข้อมูลเพิ่มเติม โปรดดูที่ ระดับฮาร์ดแวร์ที่รองรับ
การโต้ตอบระหว่างคำขอจับภาพแอปพลิเคชัน การควบคุม 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 สามารถทำงานพร้อมกันกับส่วนที่เหลือของไปป์ไลน์ของกล้อง แต่ไม่สามารถประมวลผลการจับภาพได้มากกว่าหนึ่งรายการในแต่ละครั้ง