หน้านี้อธิบายระบบย่อย HAL ซึ่งรวมถึงคำขอ ระบบย่อยของกล้อง ลำดับการเริ่มต้นและการทำงาน ระดับฮาร์ดแวร์ และการโต้ตอบ
คำขอ
เฟรมเวิร์กแอปจะส่งคำขอผลลัพธ์การจับภาพไปยังระบบย่อยของกล้อง คําขอ 1 รายการจะสอดคล้องกับผลลัพธ์ 1 ชุด คำขอจะรวมข้อมูลการกำหนดค่าทั้งหมดเกี่ยวกับการจับภาพและประมวลผลผลลัพธ์เหล่านั้น ซึ่งรวมถึงความละเอียดและรูปแบบพิกเซล การควบคุมเซ็นเซอร์ เลนส์ และแฟลชด้วยตนเอง โหมดการทำงานของ 3A การควบคุมการประมวลผล RAW เป็น YUV และการสร้างสถิติ ซึ่งช่วยให้ควบคุมเอาต์พุตและการประมวลผลของผลลัพธ์ได้มากขึ้น ระบบสามารถส่งคำขอหลายรายการพร้อมกันได้ และการส่งคำขอจะไม่บล็อก และคำขอจะได้รับการดำเนินการตามลำดับที่ได้รับเสมอ
รูปที่ 1 รุ่นของกล้อง
HAL และระบบย่อยของกล้อง
ระบบย่อยของกล้องประกอบด้วยการติดตั้งใช้งานสำหรับองค์ประกอบในไปป์ไลน์ของกล้อง เช่น อัลกอริทึม 3A และการควบคุมการประมวลผล HAL ของกล้องมีอินเทอร์เฟซสำหรับให้คุณใช้คอมโพเนนต์เหล่านี้ในเวอร์ชันของคุณ โมเดลไปป์ไลน์ของกล้องเป็นแบบเสมือนจริงและไม่เกี่ยวข้องกับ ISP จริงโดยตรง เพื่อรักษาความเข้ากันได้ข้ามแพลตฟอร์มระหว่างผู้ผลิตอุปกรณ์หลายรายและผู้จำหน่ายหน่วยประมวลผลสัญญาณภาพ (ISP หรือเซ็นเซอร์กล้อง) อย่างไรก็ตาม ข้อมูลจำลองนี้คล้ายกับไปป์ไลน์การประมวลผลจริงมากพอที่คุณจะแมปกับฮาร์ดแวร์ได้อย่างมีประสิทธิภาพ นอกจากนี้ รูปแบบนี้ยังเป็นแบบนามธรรมมากพอที่จะรองรับอัลกอริทึมและลําดับการทํางานที่แตกต่างกันหลายรายการโดยไม่กระทบต่อคุณภาพ ประสิทธิภาพ หรือการทํางานร่วมกันข้ามอุปกรณ์
นอกจากนี้ ไปป์ไลน์ของกล้องยังรองรับทริกเกอร์ที่เฟรมเวิร์กของแอปสามารถเริ่มต้น เพื่อเปิดฟีเจอร์ต่างๆ เช่น โฟกัสอัตโนมัติ นอกจากนี้ ยังส่งการแจ้งเตือนกลับไปยังเฟรมเวิร์กของแอป เพื่อแจ้งให้แอปทราบถึงเหตุการณ์ต่างๆ เช่น การล็อกโฟกัสอัตโนมัติหรือข้อผิดพลาด
รูปที่ 2 ไปป์ไลน์ของกล้อง
โปรดทราบว่าบล็อกการประมวลผลรูปภาพบางรายการที่แสดงในไดอะแกรมด้านบนยังไม่ ได้รับการกำหนดไว้อย่างชัดเจนในการเปิดตัวครั้งแรก ไปป์ไลน์ของกล้องมีสมมติฐานต่อไปนี้
- เอาต์พุต RAW Bayer จะไม่มีการประมวลผลภายใน ISP
- ระบบจะสร้างสถิติโดยอิงตามข้อมูลเซ็นเซอร์ดิบ
- บล็อกการประมวลผลต่างๆ ที่แปลงข้อมูลเซ็นเซอร์ดิบเป็น YUV จะอยู่ในลำดับใดก็ได้
- แม้ว่าจะมีการแสดงการครอบตัดและการปรับขนาดหลายหน่วย แต่หน่วยการปรับขนาดทั้งหมดจะใช้ตัวควบคุมพื้นที่เอาต์พุต (การซูมดิจิทัล) ร่วมกัน อย่างไรก็ตาม แต่ละหน่วยอาจมีความละเอียดเอาต์พุตและรูปแบบพิกเซลแตกต่างกัน
สรุปการใช้ API
นี่คือสรุปขั้นตอนสั้นๆ สำหรับการใช้ Android Camera API ดูรายละเอียดขั้นตอนเหล่านี้ รวมถึงการเรียก 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::processCaptureRequestHAL ต้องบล็อกการเรียกกลับนี้จนกว่าจะพร้อมส่งคำขอถัดไป - เฟรมเวิร์กจะส่งคำขอและเรียกใช้
ICameraDeviceSession::constructDefaultRequestSettingsต่อไปเพื่อรับ บัฟเฟอร์การตั้งค่าเริ่มต้นสำหรับกรณีการใช้งานอื่นๆ ตามที่จำเป็น - เมื่อการจับภาพคำขอเริ่มต้น (เซ็นเซอร์เริ่มเปิดรับแสงสำหรับการ
จับภาพ) HAL จะเรียกใช้
ICameraDeviceCallback::notifyพร้อม ข้อความ SHUTTER ซึ่งรวมถึงหมายเลขเฟรมและการประทับเวลาสำหรับการเริ่มต้น การเปิดรับแสง การเรียกกลับ notify นี้ไม่จำเป็นต้องเกิดขึ้นก่อนการเรียก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 |
OFF |
ไม่มี |
ON |
android.sensor.exposureTime, android.sensor.frameDuration,
android.sensor.sensitivity, android.lens.aperture (หากรองรับ)
และ android.lens.filterDensity (หากรองรับ) |
|
ON_AUTO_FLASH |
ทุกอย่างเป็น ON พร้อมด้วย 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 |
OFF |
ไม่มี |
WHITE_BALANCE_* |
android.colorCorrection.transform การปรับเฉพาะแพลตฟอร์มหาก android.colorCorrection.mode เป็น FAST หรือ HIGH_QUALITY |
|
android.control.afMode |
OFF |
ไม่มี |
FOCUS_MODE_* |
android.lens.focusDistance |
|
android.control.videoStabilization |
OFF |
ไม่มี |
ON |
สามารถปรับ android.scaler.cropRegion เพื่อใช้ระบบกันภาพสั่นสำหรับวิดีโอ |
|
android.control.mode |
OFF |
ปิดใช้ AE, AWB และ AF |
AUTO |
ระบบจะใช้การตั้งค่า AE, AWB และ AF แต่ละรายการ | |
SCENE_MODE_* |
สามารถลบล้างพารามิเตอร์ทั้งหมดที่ระบุไว้ข้างต้น ปิดใช้การควบคุม 3A แต่ละรายการอยู่ |
การควบคุมในบล็อกการประมวลผลรูปภาพในรูปที่ 2 ทั้งหมดทำงานตามหลักการที่คล้ายกัน และแต่ละบล็อกมี 3 โหมด ได้แก่
OFF: ปิดใช้การบล็อกการประมวลผลนี้แล้ว ปิดใช้บล็อกการแยกสี การแก้สี และการปรับเส้นโค้งของโทนไม่ได้FAST: ในโหมดนี้ บล็อกการประมวลผลอาจไม่ทำให้อัตราเฟรมเอาต์พุตช้าลงเมื่อเทียบกับโหมดOFFแต่ควรให้เอาต์พุตที่มีคุณภาพดีที่สุดเท่าที่จะทำได้ภายใต้ข้อจำกัดดังกล่าว โดยปกติแล้วจะใช้สำหรับโหมดแสดงตัวอย่างหรือโหมดบันทึกวิดีโอ หรือการถ่ายภาพต่อเนื่องสำหรับภาพนิ่ง ในอุปกรณ์บางเครื่อง การตั้งค่านี้อาจเทียบเท่ากับโหมดOFF(ระบบจะประมวลผลไม่ได้หากไม่ลดอัตราเฟรม) และในอุปกรณ์บางเครื่อง การตั้งค่านี้อาจเทียบเท่ากับโหมดHIGH_QUALITY(ภาพนิ่งคุณภาพสูงสุด โดยไม่ลดอัตราเฟรม)HIGH_QUALITY: ในโหมดนี้ บล็อกการประมวลผลควรให้ผลลัพธ์ที่มีคุณภาพดีที่สุดเท่าที่จะเป็นไปได้ โดยลดอัตราเฟรมเอาต์พุตลงตามที่จำเป็น โดยปกติแล้วจะใช้สำหรับการจับภาพนิ่งคุณภาพสูง บล็อกบางรายการมีการควบคุมด้วยตนเองซึ่งสามารถเลือกได้แทนFASTหรือHIGH_QUALITYเช่น บล็อกการแก้สีรองรับเมทริกซ์การเปลี่ยนรูปแบบสี ส่วนการปรับเส้นโค้งของโทนรองรับเส้นโค้งการแมปโทนสีส่วนกลางแบบกำหนดเอง
อัตราเฟรมสูงสุดที่ระบบย่อยของกล้องรองรับได้ขึ้นอยู่กับหลายปัจจัย ดังนี้
- ความละเอียดที่ขอของสตรีมรูปภาพเอาต์พุต
- ความพร้อมใช้งานของโหมดการรวม/การข้ามในโปรแกรมประมวลผลภาพ
- แบนด์วิดท์ของอินเทอร์เฟซของอิมเมจเจอร์
- แบนด์วิดท์ของบล็อกการประมวลผล ISP ต่างๆ
ปัจจัยเหล่านี้อาจแตกต่างกันอย่างมากระหว่าง ISP และเซ็นเซอร์ต่างๆ ดังนั้นอินเทอร์เฟซ HAL ของกล้องจึงพยายามสรุปข้อจำกัดของแบนด์วิดท์ให้เป็นโมเดลที่ง่ายที่สุดเท่าที่จะเป็นไปได้ โมเดลที่นำเสนอมีลักษณะดังนี้
- เซ็นเซอร์ภาพได้รับการกำหนดค่าให้แสดงผลความละเอียดต่ำสุดเสมอเมื่อพิจารณาจากขนาดสตรีมเอาต์พุตที่แอปขอ ความละเอียดที่เล็กที่สุดจะถูกกำหนดให้มีขนาดใหญ่อย่างน้อยเท่ากับขนาดสตรีมเอาต์พุตที่ร้องขอที่ใหญ่ที่สุด
- คำขอใดก็ได้สามารถใช้สตรีมเอาต์พุตที่กำหนดค่าไว้ในปัจจุบันทั้งหมดหรือบางส่วน ดังนั้นจึงต้องกำหนดค่าเซ็นเซอร์และ ISP ให้รองรับการปรับขนาดการจับภาพเดียวเป็น สตรีมทั้งหมดพร้อมกัน
- สําหรับคําขอที่ไม่ได้รวมไว้ สตรีม JPEG จะทํางานเหมือนสตรีม YUV ที่ประมวลผลแล้ว ส่วนคําขอที่มีการอ้างอิงโดยตรง สตรีม JPEG จะทํางานเป็นสตรีม JPEG
- โปรเซสเซอร์ JPEG สามารถทำงานพร้อมกับส่วนอื่นๆ ของไปป์ไลน์กล้องได้ แต่ ไม่สามารถประมวลผลการจับภาพมากกว่า 1 รายการในครั้งเดียว