ระบบย่อย HAL

หน้านี้อธิบายระบบย่อย HAL ซึ่งรวมถึงคำขอ ระบบย่อยของกล้อง ลำดับการเริ่มต้นและ การทำงาน ระดับฮาร์ดแวร์ และการโต้ตอบ

คำขอ

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

รูปแบบคำขอของกล้อง

รูปที่ 1 โมเดลกล้อง

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

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

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

ระดับชั้นการจัดการฮาร์ดแวร์โดยตรงของกล้อง

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

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

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

สรุปการใช้ API

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

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

สรุปการทำงานของ HAL

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

ภาพรวม HAL ของกล้อง

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

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

ส่วนนี้มีคำอธิบายโดยละเอียดเกี่ยวกับขั้นตอนที่คาดไว้เมื่อใช้ Camera API ดูคำจำกัดความของอินเทอร์เฟซ HIDL ได้ที่ platform/hardware/interfaces/camera/

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

  1. หลังจากการเริ่มต้นใช้งาน เฟรมเวิร์กจะเริ่มรอการเชื่อมต่อผู้ให้บริการกล้องที่มีอยู่ซึ่งใช้อินเทอร์เฟซ ICameraProvider หากมีผู้ให้บริการดังกล่าว เฟรมเวิร์กจะพยายามสร้างการเชื่อมต่อ
  2. เฟรมเวิร์กจะแจกแจงอุปกรณ์กล้องผ่าน ICameraProvider::getCameraIdList
  3. เฟรมเวิร์กจะสร้างอินสแตนซ์ ICameraDevice ใหม่โดยเรียกใช้ ICameraProvider::getCameraDeviceInterface_VX_X ที่เกี่ยวข้อง
  4. เฟรมเวิร์กจะเรียกใช้ ICameraDevice::open เพื่อสร้างเซสชันการจับภาพที่ใช้งานอยู่ใหม่ ICameraDeviceSession

ใช้เซสชันกล้องที่ใช้งานอยู่

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