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

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

รูปที่ 2 ไปป์ไลน์ของกล้อง
โปรดทราบว่าบล็อกการประมวลผลรูปภาพบางรายการที่แสดงในแผนภาพด้านบนไม่ได้มีการกําหนดไว้อย่างชัดเจนในรุ่นแรก ไปป์ไลน์ของกล้องจะตั้งสมมติฐานต่อไปนี้
- เอาต์พุต RAW Bayer จะไม่ได้รับการประมวลผลภายใน ISP
- ระบบจะสร้างสถิติตามข้อมูลเซ็นเซอร์ดิบ
- บล็อกการประมวลผลต่างๆ ที่แปลงข้อมูลเซ็นเซอร์ดิบเป็น YUV จะอยู่ในลําดับที่ไม่เจาะจง
- แม้ว่าจะมีการแสดงการครอบตัดและการปรับขนาดหลายหน่วย แต่หน่วยการปรับขนาดทั้งหมดจะใช้ตัวควบคุมพื้นที่เอาต์พุต (การซูมดิจิตอล) ร่วมกัน อย่างไรก็ตาม แต่ละหน่วยอาจมีความละเอียดเอาต์พุตและรูปแบบพิกเซลแตกต่างกัน
สรุปการใช้ API
นี่เป็นสรุปสั้นๆ ของขั้นตอนการใช้ Android Camera API ดูรายละเอียดของขั้นตอนเหล่านี้ รวมถึงการเรียก API ได้ที่ส่วนการเริ่มต้นและลําดับการทํางานที่คาดไว้
- ฟังและแจกแจงอุปกรณ์กล้อง
- เปิดอุปกรณ์และเชื่อมต่ออุปกรณ์รับฟัง
- กำหนดค่าเอาต์พุตสำหรับกรณีการใช้งานเป้าหมาย (เช่น การจับภาพนิ่ง บันทึก ฯลฯ)
- สร้างคําขอสําหรับ Use Case เป้าหมาย
- จับภาพ/ทำซ้ำคำขอและภาพต่อเนื่อง
- รับข้อมูลเมตาของผลการค้นหาและข้อมูลรูปภาพ
- เมื่อเปลี่ยนกรณีการใช้งาน ให้กลับไปที่ขั้นตอนที่ 3
สรุปการดำเนินการ HAL
- คำขอที่โหลดแบบอะซิงโครนัสสำหรับการจับภาพมาจากเฟรมเวิร์ก
- อุปกรณ์ HAL ต้องประมวลผลคำขอตามลำดับ และสร้างข้อมูลเมตาของผลลัพธ์เอาต์พุตและบัฟเฟอร์รูปภาพเอาต์พุตอย่างน้อย 1 รายการสําหรับคําขอแต่ละรายการ
- เข้าก่อนออกก่อนสำหรับคำขอและผลลัพธ์ รวมถึงสตรีมที่คำขอที่ตามมาอ้างอิง
- การประทับเวลาต้องเหมือนกันสำหรับเอาต์พุตทั้งหมดจากคำขอหนึ่งๆ เพื่อให้เฟรมเวิร์กจับคู่เอาต์พุตเหล่านั้นเข้าด้วยกันได้หากจำเป็น
- การกําหนดค่าและสถานะการบันทึกทั้งหมด (ยกเว้นกิจวัตร 3A) จะรวมอยู่ในคําขอและผลลัพธ์

รูปที่ 3 ภาพรวมของ HAL ของกล้อง
ลำดับการเริ่มต้นและการดำเนินการที่คาดไว้
ส่วนนี้มีคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดไว้เมื่อใช้ API กล้อง โปรดดูคำจำกัดความของอินเทอร์เฟซ HIDL ที่ platform/hardware/interfaces/camera/
แจกแจง เปิดอุปกรณ์กล้อง และสร้างเซสชันที่ใช้งานอยู่
- หลังจากการเริ่มต้นใช้งาน เฟรมเวิร์กจะเริ่มฟังผู้ให้บริการกล้องที่มีอยู่ซึ่งใช้อินเทอร์เฟซ
ICameraProvider
หากมีผู้ให้บริการดังกล่าว เฟรมเวิร์กจะพยายามสร้างการเชื่อมต่อ - เฟรมเวิร์กจะแสดงรายการอุปกรณ์กล้องผ่าน
ICameraProvider::getCameraIdList()
- เฟรมเวิร์กจะสร้างอินสแตนซ์
ICameraDevice
ใหม่โดยการเรียกใช้ICameraProvider::getCameraDeviceInterface_VX_X()
ที่เกี่ยวข้อง - เฟรมเวิร์กเรียก
ICameraDevice::open()
เพื่อสร้างเซสชันการจับภาพที่ใช้งานอยู่ใหม่ ICameraDeviceSession
ใช้เซสชันกล้องที่ใช้งานอยู่
- เฟรมเวิร์กเรียก
ICameraDeviceSession::configureStreams()
พร้อมรายการสตรีมอินพุต/เอาต์พุตไปยังอุปกรณ์ HAL - เฟรมเวิร์กจะขอการตั้งค่าเริ่มต้นสำหรับบาง Use Case ด้วยการเรียกใช้
ICameraDeviceSession::constructDefaultRequestSettings()
ซึ่งอาจเกิดขึ้นได้ทุกเมื่อหลังจากที่ICameraDevice::open
สร้างICameraDeviceSession
- เฟรมเวิร์กจะสร้างและส่งคำขอบันทึกแรกไปยัง HAL พร้อมการตั้งค่าตามชุดการตั้งค่าเริ่มต้นชุดใดชุดหนึ่ง และมีสตรีมเอาต์พุตอย่างน้อย 1 รายการที่เฟรมเวิร์กได้ลงทะเบียนไว้ก่อนหน้านี้ ระบบจะส่งข้อมูลนี้ไปที่ HAL ด้วย
ICameraDeviceSession::processCaptureRequest()
HAL ต้องบล็อกการเรียกกลับนี้จนกว่าจะพร้อมส่งคำขอถัดไป - เฟรมเวิร์กจะส่งคําขอและเรียกใช้
ICameraDeviceSession::constructDefaultRequestSettings()
ต่อไปเพื่อรับบัฟเฟอร์การตั้งค่าเริ่มต้นสําหรับกรณีการใช้งานอื่นๆ ตามจําเป็น - เมื่อการจับภาพคำขอเริ่มต้นขึ้น (เซ็นเซอร์เริ่มเปิดรับแสงสำหรับการจับภาพ) HAL จะเรียก
ICameraDeviceCallback::notify()
ด้วยข้อความ SHUTTER ซึ่งรวมถึงหมายเลขเฟรมและการประทับเวลาสำหรับการเริ่มเปิดรับแสง การเรียกกลับเพื่อแจ้งเตือนนี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียกprocessCaptureResult()
ครั้งแรกสําหรับคําขอ แต่ระบบจะไม่ส่งผลลัพธ์ไปยังแอปสําหรับการจับภาพจนกว่าจะเรียกnotify()
สําหรับการจับภาพนั้น - หลังจากเกิดความล่าช้าในไปป์ไลน์ 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 รายการ