คำขอ
เฟรมเวิร์กแอปจะส่งคำขอผลลัพธ์การจับภาพไปยังระบบย่อยของกล้อง คําขอ 1 รายการจะสอดคล้องกับผลลัพธ์ 1 ชุด คําขอจะรวมข้อมูลการกําหนดค่าทั้งหมดเกี่ยวกับการจับภาพและประมวลผลผลลัพธ์เหล่านั้น ซึ่งรวมถึงความละเอียดและรูปแบบพิกเซล การควบคุมเซ็นเซอร์ เลนส์ และแฟลชด้วยตนเอง โหมดการทำงานของ 3A การควบคุมการประมวลผล RAW เป็น YUV และการสร้างสถิติ ซึ่งช่วยให้ควบคุมเอาต์พุตและการประมวลผลของผลลัพธ์ได้มากขึ้น ระบบสามารถส่งคำขอหลายรายการพร้อมกันได้ และการส่งคำขอจะไม่บล็อก และคำขอจะได้รับการดำเนินการตามลำดับที่ได้รับเสมอ
รูปที่ 1 รุ่นของกล้อง
HAL และระบบย่อยของกล้อง
ระบบย่อยของกล้องประกอบด้วยการติดตั้งใช้งานสำหรับองค์ประกอบในไปป์ไลน์ของกล้อง เช่น อัลกอริทึม 3A และการควบคุมการประมวลผล HAL ของกล้องมีอินเทอร์เฟซสำหรับให้คุณใช้คอมโพเนนต์เหล่านี้ในเวอร์ชันของคุณ โมเดลไปป์ไลน์ของกล้องเป็นแบบเสมือนจริงและไม่เกี่ยวข้องกับ ISP จริงโดยตรง เพื่อรักษาความเข้ากันได้ข้ามแพลตฟอร์มระหว่างผู้ผลิตอุปกรณ์หลายรายและผู้จำหน่ายหน่วยประมวลผลสัญญาณภาพ (ISP หรือเซ็นเซอร์กล้อง) อย่างไรก็ตาม ข้อมูลจำลองนี้คล้ายกับไปป์ไลน์การประมวลผลจริงมากพอที่คุณจะแมปกับฮาร์ดแวร์ได้อย่างมีประสิทธิภาพ นอกจากนี้ รูปแบบนี้ยังเป็นแบบนามธรรมมากพอที่จะรองรับอัลกอริทึมและลําดับการทํางานที่แตกต่างกันหลายรายการโดยไม่กระทบต่อคุณภาพ ประสิทธิภาพ หรือการทํางานร่วมกันข้ามอุปกรณ์
ไปป์ไลน์กล้องยังรองรับทริกเกอร์ที่เฟรมเวิร์กแอปสามารถเริ่มทำงาน เพื่อเปิดฟีเจอร์ต่างๆ เช่น การโฟกัสอัตโนมัติ นอกจากนี้ ยังส่งการแจ้งเตือนกลับไปยัง เฟรมเวิร์กแอปเพื่อแจ้งให้แอปทราบถึงเหตุการณ์ต่างๆ เช่น การล็อกการโฟกัสอัตโนมัติหรือข้อผิดพลาด
รูปที่ 2 ไปป์ไลน์กล้อง
โปรดทราบว่าบล็อกการประมวลผลภาพบางรายการที่แสดงในไดอะแกรมด้านบนยังไม่มีการกำหนดไว้อย่างชัดเจนในเวอร์ชันเริ่มต้น ไปป์ไลน์กล้องมีสมมติฐานดังนี้
- เอาต์พุต RAW Bayer จะไม่ได้รับการประมวลผลภายใน ISP
- ระบบจะสร้างสถิติจากข้อมูลเซ็นเซอร์ RAW
- บล็อกการประมวลผลต่างๆ ที่แปลงข้อมูลเซ็นเซอร์ RAW เป็น YUV จะอยู่ในลำดับที่กำหนดเอง
- แม้ว่าจะมีการแสดงการครอบตัดและการปรับขนาดหลายหน่วย แต่หน่วยการปรับขนาดทั้งหมดจะใช้ตัวควบคุมพื้นที่เอาต์พุต (การซูมดิจิทัล) ร่วมกัน อย่างไรก็ตาม แต่ละหน่วยอาจมีความละเอียดเอาต์พุตและรูปแบบพิกเซลแตกต่างกัน
สรุปการใช้ API
นี่คือสรุปขั้นตอนการใช้ Camera API ของ Android แบบย่อ ดูรายละเอียดขั้นตอนเหล่านี้ รวมถึงการเรียก API ได้ในส่วนลำดับการเริ่มต้นและการทำงานที่คาดไว้
- รอการเชื่อมต่อและแจกแจงอุปกรณ์กล้อง
- เปิดอุปกรณ์และเชื่อมต่อ Listener
- กําหนดค่าเอาต์พุตสําหรับ Use Case เป้าหมาย (เช่น การจับภาพนิ่ง การบันทึกวิดีโอ ฯลฯ)
- สร้างคําขอสําหรับ Use Case เป้าหมาย
- จับภาพ/ทำซ้ำคำขอและการจับภาพต่อเนื่อง
- รับข้อมูลเมตาของผลลัพธ์และข้อมูลรูปภาพ
- เมื่อเปลี่ยน Use Case ให้กลับไปที่ขั้นตอนที่ 3
สรุปการทำงานของ HAL
- คำขอแบบอะซิงโครนัสสำหรับการจับภาพมาจากเฟรมเวิร์ก
- อุปกรณ์ HAL ต้องประมวลผลคำขอตามลำดับ และสร้างข้อมูลเมตาของผลลัพธ์เอาต์พุตและบัฟเฟอร์รูปภาพเอาต์พุตอย่างน้อย 1 รายการสำหรับแต่ละคำขอ
- คำขอและผลลัพธ์ รวมถึงสตรีมที่คำขอในภายหลังอ้างอิงจะได้รับการประมวลผลแบบเข้าก่อนออกก่อน
- การประทับเวลาของเอาต์พุตทั้งหมดจากคำขอหนึ่งๆ ต้องเหมือนกัน เพื่อให้ เฟรมเวิร์กจับคู่เอาต์พุตเหล่านั้นเข้าด้วยกันได้หากจำเป็น
- การกําหนดค่าและสถานะการจับภาพทั้งหมด (ยกเว้นรูทีน 3A) จะรวมอยู่ในคําขอและผลลัพธ์
รูปที่ 3 ภาพรวมของ HAL ของกล้อง
ลำดับการเริ่มต้นและการทำงานที่คาดไว้
ส่วนนี้มีคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดไว้เมื่อใช้ Camera API โปรดดูคำจำกัดความของอินเทอร์เฟซ HIDL ได้ที่ platform/hardware/interfaces/camera/
แจกแจง เปิดอุปกรณ์กล้อง และสร้างเซสชันที่ใช้งานอยู่
- หลังจากการเริ่มต้นใช้งาน เฟรมเวิร์กจะเริ่มรอการเชื่อมต่อผู้ให้บริการกล้องที่มีอยู่ซึ่งใช้อินเทอร์เฟซ
ICameraProviderหากมีผู้ให้บริการดังกล่าว เฟรมเวิร์กจะพยายามสร้างการเชื่อมต่อ - เฟรมเวิร์กจะแจกแจงอุปกรณ์กล้องผ่าน
ICameraProvider::getCameraIdList() - เฟรมเวิร์กจะสร้างอินสแตนซ์
ICameraDeviceใหม่โดยเรียกใช้ ที่เกี่ยวข้องICameraProvider::getCameraDeviceInterface_VX_X() - เฟรมเวิร์กจะเรียกใช้
ICameraDevice::open()เพื่อสร้างเซสชันการจับภาพที่ใช้งานอยู่ใหม่ ICameraDeviceSession
ใช้เซสชันกล้องที่ใช้งานอยู่
- เฟรมเวิร์กจะเรียกใช้
ICameraDeviceSession::configureStreams()พร้อมรายการสตรีมอินพุต/เอาต์พุตไปยังอุปกรณ์ HAL - เฟรมเวิร์กจะขอการตั้งค่าเริ่มต้นสำหรับ Use Case บางรายการด้วย
การเรียกใช้
ICameraDeviceSession::constructDefaultRequestSettings()การดำเนินการนี้อาจเกิดขึ้นเมื่อใดก็ได้หลังจากที่ICameraDeviceSessionสร้างขึ้นโดยICameraDevice::open - เฟรมเวิร์กจะสร้างและส่งคำขอการจับภาพครั้งแรกไปยัง HAL พร้อมการตั้งค่าตามชุดการตั้งค่าเริ่มต้นชุดใดชุดหนึ่ง และมีสตรีมเอาต์พุตอย่างน้อย 1 รายการที่เฟรมเวิร์กได้ลงทะเบียนไว้ก่อนหน้านี้ ระบบจะส่งข้อมูลนี้ไปที่ HAL ด้วย
ICameraDeviceSession::processCaptureRequest()HAL ต้องบล็อกการเรียกกลับนี้จนกว่าจะพร้อมส่งคำขอถัดไป - เฟรมเวิร์กจะส่งคำขอต่อไปและเรียกใช้
ICameraDeviceSession::constructDefaultRequestSettings()เพื่อรับ บัฟเฟอร์การตั้งค่าเริ่มต้นสำหรับ Use Case อื่นๆ ตามที่จำเป็น - เมื่อการจับภาพของคำขอเริ่มต้นขึ้น (เซ็นเซอร์เริ่มเปิดรับแสงสำหรับการ
จับภาพ) 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 ทั้งหมดทำงานตามหลักการที่คล101} ้ายกัน และโดยทั่วไปแต่ละบล็อกจะมี 3 โหมดดังนี้
- ปิด: บล็อกการประมวลผลนี้ปิดใช้อยู่ คุณจะปิดใช้บล็อกการปรับเส้นโค้งของโทน บล็อกการแก้สี และ บล็อกการปรับเส้นโค้งของโทนไม่ได้
- เร็ว: ในโหมดนี้ บล็อกการประมวลผลอาจไม่ทำให้อัตราเฟรมเอาต์พุตช้าลงเมื่อเทียบกับโหมดปิด แต่ควรให้เอาต์พุตที่มีคุณภาพดีที่สุดเท่าที่จะทำได้ภายใต้ข้อจำกัดดังกล่าว โดยปกติแล้วจะใช้สำหรับโหมดแสดงตัวอย่างหรือโหมดบันทึกวิดีโอ หรือการถ่ายภาพต่อเนื่องสำหรับภาพนิ่ง ในอุปกรณ์บางเครื่อง การตั้งค่านี้อาจเทียบเท่ากับโหมด "ปิด" (ระบบจะประมวลผลไม่ได้หากไม่ลดอัตราเฟรม) และในอุปกรณ์บางเครื่อง การตั้งค่านี้อาจเทียบเท่ากับโหมด HIGH_QUALITY (ภาพนิ่งคุณภาพสูงสุด โดยไม่ลดอัตราเฟรม)
- HIGH_QUALITY: ในโหมดนี้ บล็อกการประมวลผลควรให้ผลลัพธ์ที่มีคุณภาพดีที่สุดเท่าที่จะเป็นไปได้ โดยลดอัตราเฟรมเอาต์พุตลงตามที่จำเป็น โดยปกติแล้วจะใช้สำหรับการจับภาพนิ่งคุณภาพสูง บล็อกบางรายการมีการควบคุมด้วยตนเองซึ่งสามารถเลือกได้แทน FAST หรือ HIGH_QUALITY เช่น บล็อกการแก้สีรองรับเมทริกซ์การเปลี่ยนรูปแบบสี ส่วนการปรับเส้นโค้งของโทนรองรับเส้นโค้งการแมปโทนสีส่วนกลางแบบกำหนดเอง
อัตราเฟรมสูงสุดที่ระบบย่อยของกล้องรองรับได้ขึ้นอยู่กับปัจจัยหลายอย่าง ได้แก่
- ความละเอียดที่ขอของสตรีมรูปภาพเอาต์พุต
- ความพร้อมใช้งานของโหมดการรวม/การข้ามในโปรแกรมประมวลผลภาพ
- แบนด์วิดท์ของอินเทอร์เฟซโปรแกรมประมวลผลภาพ
- แบนด์วิดท์ของบล็อกการประมวลผล ISP ต่างๆ
เนื่องจากปัจจัยเหล่านี้อาจแตกต่างกันอย่างมากระหว่าง ISP และเซ็นเซอร์ต่างๆ อินเทอร์เฟซ HAL ของกล้องจึงพยายามสรุปข้อจำกัดด้านแบนด์วิดท์เป็นโมเดลที่ง่ายที่สุดเท่าที่จะเป็นไปได้ โมเดลที่นำเสนอมีลักษณะดังนี้
- เซ็นเซอร์ภาพได้รับการกำหนดค่าให้แสดงผลความละเอียดต่ำสุดเสมอเมื่อพิจารณาจากขนาดสตรีมเอาต์พุตที่แอปขอ ความละเอียดที่เล็กที่สุดจะถูกกำหนดให้มีขนาดใหญ่อย่างน้อยเท่ากับขนาดสตรีมเอาต์พุตที่ร้องขอที่ใหญ่ที่สุด
- เนื่องจากคำขอใดๆ ก็ตามอาจใช้สตรีมเอาต์พุตที่กำหนดค่าไว้ในปัจจุบันทั้งหมดหรือบางส่วน เซ็นเซอร์และ ISP จึงต้องได้รับการกำหนดค่าให้รองรับการปรับขนาดการจับภาพครั้งเดียวให้เป็น สตรีมทั้งหมดพร้อมกัน
- สําหรับคําขอที่ไม่ได้รวมไว้ สตรีม JPEG จะทํางานเหมือนสตรีม YUV ที่ประมวลผลแล้ว ส่วนคําขอที่มีการอ้างอิงโดยตรง สตรีม JPEG จะทํางานเป็นสตรีม JPEG
- โปรเซสเซอร์ JPEG สามารถทำงานพร้อมกันกับไปป์ไลน์กล้องที่เหลือได้ แต่ จะประมวลผลการจับภาพได้ครั้งละไม่เกิน 1 รายการ