การอ้างอิงโครงสร้าง camera3_device_ops
#include < camera3.h >
เขตข้อมูล | |
อินท์(* | เริ่มต้น )(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
อินท์(* | configuration_streams ) (const struct กล้อง 3_device *, กล้อง 3_stream_configuration_t * stream_list) |
อินท์(* | register_stream_buffers ) (const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
const camera_metadata_t *(* | build_default_request_settings ) (const struct camera3_device *, ประเภท int) |
อินท์(* | process_capture_request ) (สร้างโครงสร้าง กล้อง 3_device *, กล้อง 3_capture_request_t * คำขอ) |
เป็นโมฆะ(* | get_metadata_vendor_tag_ops ) (สร้างโครงสร้าง กล้อง 3_device *, vendor_tag_query_ops_t * ops) |
เป็นโมฆะ(* | ดัมพ์ )(const struct camera3_device *, int fd) |
อินท์(* | ล้าง )(const struct camera3_device *) |
เป็นโมฆะ * | สงวนไว้ [8] |
คำอธิบายโดยละเอียด
เอกสารภาคสนาม
int (* configuration_streams) (สร้างโครงสร้าง กล้อง 3_device *, กล้อง 3_stream_configuration_t * stream_list) |
กำหนดค่า_สตรีม:
CAMERA_DEVICE_API_VERSION_3_0 เท่านั้น:
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกนี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กำหนดไว้ใน stream_list วิธีการนี้จะถูกเรียกอย่างน้อยหนึ่งครั้งหลังจาก เริ่มต้น () ก่อนที่จะส่งคำขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่สามารถส่งออกได้อย่างน้อยหนึ่งรายการ และต้องไม่มีสตรีมที่สามารถป้อนข้อมูลได้มากกว่าหนึ่งรายการ
stream_list อาจมีสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกครั้งก่อนถึง configuration_stream()) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หากสตรีมดังกล่าวได้ลงทะเบียนบัฟเฟอร์ไว้แล้ว register_stream_buffers() จะไม่ถูกเรียกอีกครั้งสำหรับสตรีม และบัฟเฟอร์จากสตรีมสามารถรวมไว้ในคำขออินพุตได้ทันที
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ อาจเขียนค่าการใช้งานและ/หรือ max_buffers ใหม่ในระหว่างการเรียกกำหนดค่า
เฟรมเวิร์กจะตรวจพบการเปลี่ยนแปลงดังกล่าว จากนั้นจะจัดสรรบัฟเฟอร์สตรีมใหม่ และเรียก register_stream_buffers() อีกครั้งก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ไม่รวมอยู่ใน stream_list HAL อาจลบการอ้างอิงถึงสตรีมนั้นอย่างปลอดภัย จะไม่ถูกนำมาใช้ซ้ำในการเรียก configuration() ในภายหลังโดยเฟรมเวิร์ก และบัฟเฟอร์ gralloc ทั้งหมดสำหรับมันจะถูกปล่อยว่างหลังจากการเรียก configuration_streams() กลับคืนมา
โครงสร้าง stream_list เป็นของเฟรมเวิร์ก และอาจไม่สามารถเข้าถึงได้เมื่อการโทรนี้เสร็จสิ้น ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละตัวจะยังคงถูกต้องสำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียก configuration_stream() ครั้งแรก ซึ่งไม่รวม camera3_stream_t นั้นในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่อาจเปลี่ยนค่าในโครงสร้างสตรีมภายนอกตัวชี้ส่วนตัว ยกเว้นการใช้งานและสมาชิก max_buffers ระหว่างการเรียก configuration_streams()
หากสตรีมเป็นสตรีมใหม่ ฟิลด์การใช้งาน max_buffer และตัวชี้ส่วนตัวของโครงสร้างสตรีมทั้งหมดจะถูกตั้งค่าเป็น 0 อุปกรณ์ HAL จะต้องตั้งค่าฟิลด์เหล่านี้ก่อนที่การเรียก configuration_streams() จะกลับมา จากนั้นเฟรมเวิร์กและแพลตฟอร์มโมดูล gralloc จะใช้ฟิลด์เหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สำหรับแต่ละสตรีม
ก่อนที่สตรีมใหม่ดังกล่าวจะสามารถรวมบัฟเฟอร์ไว้ในคำขอจับภาพได้ เฟรมเวิร์กจะเรียก register_stream_buffers() ด้วยสตรีมนั้น อย่างไรก็ตาม เฟรมเวิร์กไม่จำเป็นต้องลงทะเบียนบัฟเฟอร์สำหรับสตรีม ทั้งหมด ก่อนที่จะส่งคำขอ ซึ่งช่วยให้สามารถเริ่มต้น (ตัวอย่าง) สตรีมตัวอย่างได้อย่างรวดเร็ว โดยมีการจัดสรรสตรีมอื่นๆ ที่เกิดขึ้นในภายหลังหรือพร้อมกัน
CAMERA_DEVICE_API_VERSION_3_1 เท่านั้น:
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกนี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กำหนดไว้ใน stream_list วิธีการนี้จะถูกเรียกอย่างน้อยหนึ่งครั้งหลังจาก เริ่มต้น () ก่อนที่จะส่งคำขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่สามารถส่งออกได้อย่างน้อยหนึ่งรายการ และต้องไม่มีสตรีมที่สามารถป้อนข้อมูลได้มากกว่าหนึ่งรายการ
stream_list อาจมีสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกครั้งก่อนถึง configuration_stream()) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หากสตรีมดังกล่าวได้ลงทะเบียนบัฟเฟอร์ไว้แล้ว register_stream_buffers() จะไม่ถูกเรียกอีกครั้งสำหรับสตรีม และบัฟเฟอร์จากสตรีมสามารถรวมไว้ในคำขออินพุตได้ทันที
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ อาจเขียนค่าการใช้งานและ/หรือ max_buffers ใหม่ในระหว่างการเรียกกำหนดค่า
เฟรมเวิร์กจะตรวจพบการเปลี่ยนแปลงดังกล่าว จากนั้นจะจัดสรรบัฟเฟอร์สตรีมใหม่ และเรียก register_stream_buffers() อีกครั้งก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ไม่รวมอยู่ใน stream_list HAL อาจลบการอ้างอิงถึงสตรีมนั้นอย่างปลอดภัย จะไม่ถูกนำมาใช้ซ้ำในการเรียก configuration() ในภายหลังโดยเฟรมเวิร์ก และบัฟเฟอร์ gralloc ทั้งหมดสำหรับมันจะถูกปล่อยว่างหลังจากการเรียก configuration_streams() กลับคืนมา
โครงสร้าง stream_list เป็นของเฟรมเวิร์ก และอาจไม่สามารถเข้าถึงได้เมื่อการโทรนี้เสร็จสิ้น ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละตัวจะยังคงถูกต้องสำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียก configuration_stream() ครั้งแรก ซึ่งไม่รวม camera3_stream_t นั้นในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่อาจเปลี่ยนค่าในโครงสร้างสตรีมภายนอกตัวชี้ส่วนตัว ยกเว้นการใช้งานและสมาชิก max_buffers ระหว่างการเรียก configuration_streams()
หากสตรีมเป็นช่องใหม่ max_buffer และฟิลด์ตัวชี้ส่วนตัวของโครงสร้างสตรีมทั้งหมดจะถูกตั้งค่าเป็น 0 การใช้งานจะถูกตั้งค่าเป็นแฟล็กการใช้งานของผู้บริโภค อุปกรณ์ HAL ต้องตั้งค่าฟิลด์เหล่านี้ก่อนการเรียก configuration_streams() จะส่งกลับ จากนั้นเฟรมเวิร์กและแพลตฟอร์มโมดูล gralloc จะใช้ฟิลด์เหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สำหรับแต่ละสตรีม
ก่อนที่สตรีมใหม่ดังกล่าวจะสามารถรวมบัฟเฟอร์ไว้ในคำขอจับภาพได้ เฟรมเวิร์กจะเรียก register_stream_buffers() ด้วยสตรีมนั้น อย่างไรก็ตาม เฟรมเวิร์กไม่จำเป็นต้องลงทะเบียนบัฟเฟอร์สำหรับสตรีม ทั้งหมด ก่อนที่จะส่งคำขอ ซึ่งช่วยให้สามารถเริ่มต้น (ตัวอย่าง) สตรีมตัวอย่างได้อย่างรวดเร็ว โดยมีการจัดสรรสตรีมอื่นๆ ที่เกิดขึ้นในภายหลังหรือพร้อมกัน
>= CAMERA_DEVICE_API_VERSION_3_2:
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกนี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กำหนดไว้ใน stream_list วิธีการนี้จะถูกเรียกอย่างน้อยหนึ่งครั้งหลังจาก เริ่มต้น () ก่อนที่จะส่งคำขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่สามารถส่งออกได้อย่างน้อยหนึ่งรายการ และต้องไม่มีสตรีมที่สามารถป้อนข้อมูลได้มากกว่าหนึ่งรายการ
stream_list อาจมีสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกครั้งก่อนถึง configuration_stream()) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ อาจเขียนค่าการใช้งานและ/หรือ max_buffers ใหม่ในระหว่างการเรียกกำหนดค่า
กรอบงานจะตรวจพบการเปลี่ยนแปลงดังกล่าว และอาจจัดสรรบัฟเฟอร์สตรีมใหม่ก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ไม่รวมอยู่ใน stream_list HAL อาจลบการอ้างอิงถึงสตรีมนั้นอย่างปลอดภัย จะไม่ถูกนำมาใช้ซ้ำในการเรียก configuration() ในภายหลังโดยเฟรมเวิร์ก และบัฟเฟอร์ gralloc ทั้งหมดสำหรับมันจะถูกปล่อยว่างหลังจากการเรียก configuration_streams() กลับคืนมา
โครงสร้าง stream_list เป็นของเฟรมเวิร์ก และอาจไม่สามารถเข้าถึงได้เมื่อการโทรนี้เสร็จสิ้น ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละตัวจะยังคงถูกต้องสำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียก configuration_stream() ครั้งแรก ซึ่งไม่รวม camera3_stream_t นั้นในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่อาจเปลี่ยนค่าในโครงสร้างสตรีมภายนอกตัวชี้ส่วนตัว ยกเว้นการใช้งานและสมาชิก max_buffers ระหว่างการเรียก configuration_streams()
หากสตรีมเป็นช่องใหม่ max_buffer และฟิลด์ตัวชี้ส่วนตัวของโครงสร้างสตรีมทั้งหมดจะถูกตั้งค่าเป็น 0 การใช้งานจะถูกตั้งค่าเป็นแฟล็กการใช้งานของผู้บริโภค อุปกรณ์ HAL ต้องตั้งค่าฟิลด์เหล่านี้ก่อนการเรียก configuration_streams() จะส่งกลับ จากนั้นเฟรมเวิร์กและแพลตฟอร์มโมดูล gralloc จะใช้ฟิลด์เหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สำหรับแต่ละสตรีม
บัฟเฟอร์ที่จัดสรรใหม่อาจรวมอยู่ในคำขอจับภาพเมื่อใดก็ได้โดยกรอบงาน เมื่อบัฟเฟอร์ gralloc ถูกส่งกลับไปยังเฟรมเวิร์กด้วย process_capture_result (และมีการส่งสัญญาณ release_fence ตามลำดับ) เฟรมเวิร์กอาจว่างหรือนำกลับมาใช้ใหม่ได้ตลอดเวลา
เงื่อนไขเบื้องต้น:
เฟรมเวิร์กจะเรียกใช้เมธอดนี้เมื่อไม่มีการประมวลผลการจับภาพเท่านั้น นั่นคือ ผลลัพธ์ทั้งหมดถูกส่งกลับไปยังเฟรมเวิร์ก และบัฟเฟอร์อินพุตและเอาท์พุตในเที่ยวบินทั้งหมดได้รับการส่งคืน และรั้วการซิงค์การเผยแพร่ได้รับการส่งสัญญาณโดย HAL เฟรมเวิร์กจะไม่ส่งคำขอใหม่สำหรับการจับภาพในขณะที่การเรียก configuration_streams() กำลังดำเนินการอยู่
เงื่อนไขภายหลัง:
อุปกรณ์ HAL ต้องกำหนดค่าตัวเองเพื่อให้อัตราเฟรมเอาท์พุตสูงสุดที่เป็นไปได้ โดยพิจารณาจากขนาดและรูปแบบของสตรีมเอาท์พุต ดังที่บันทึกไว้ในเมตาดาต้าคงที่ของอุปกรณ์กล้อง
ต้องการประสิทธิภาพการทำงาน:
คาดว่าการโทรนี้จะหนักหน่วงและอาจใช้เวลาหลายร้อยมิลลิวินาทีจึงจะเสร็จสมบูรณ์ เนื่องจากอาจต้องรีเซ็ตและกำหนดค่าเซ็นเซอร์ภาพและไปป์ไลน์การประมวลผลของกล้องใหม่ อย่างไรก็ตาม อุปกรณ์ HAL ควรพยายามลดความล่าช้าในการกำหนดค่าใหม่ให้เหลือน้อยที่สุดเพื่อลดการหยุดชั่วคราวที่ผู้ใช้มองเห็นได้ในระหว่างการเปลี่ยนแปลงโหมดการทำงานของแอปพลิเคชัน (เช่น การเปลี่ยนจากการจับภาพนิ่งเป็นการบันทึกวิดีโอ)
HAL ควรกลับจากการเรียกนี้ภายใน 500 มิลลิวินาที และต้องกลับจากการเรียกนี้ใน 1,000 มิลลิวินาที
ส่งกลับค่า:
0: เมื่อกำหนดค่าสตรีมสำเร็จ
-EINVAL: หากการกำหนดค่าสตรีมที่ร้องขอไม่ถูกต้อง ตัวอย่างของการกำหนดค่าสตรีมที่ไม่ถูกต้อง ได้แก่:
- รวมสตรีมที่สามารถป้อนข้อมูลได้มากกว่า 1 รายการ (INPUT หรือ BIDIRECTIONAL)
- ไม่รวมสตรีมที่สามารถส่งออกได้ (OUTPUT หรือ BIDIRECTIONAL)
- รวมสตรีมที่มีรูปแบบที่ไม่รองรับ หรือขนาดที่ไม่รองรับสำหรับรูปแบบนั้น
- รวมเอาต์พุตสตรีมในรูปแบบใดรูปแบบหนึ่งมากเกินไป
- การกำหนดค่าการหมุนที่ไม่รองรับ (ใช้กับอุปกรณ์ที่มีเวอร์ชัน> = CAMERA_DEVICE_API_VERSION_3_3 เท่านั้น)
- ขนาด/รูปแบบสตรีมไม่เป็นไปตามข้อกำหนดของ camera3_stream_configuration_t->operation_mode สำหรับโหมดที่ไม่ใช่ปกติ หรือ operation_mode ที่ร้องขอไม่ได้รับการสนับสนุนโดย HAL (ใช้กับอุปกรณ์ที่มีเวอร์ชัน>= CAMERA_DEVICE_API_VERSION_3_3 เท่านั้น)
โปรดทราบว่าเฟรมเวิร์กที่ส่งการกำหนดค่าสตรีมที่ไม่ถูกต้องนั้นไม่ใช่การทำงานปกติ เนื่องจากมีการตรวจสอบการกำหนดค่าสตรีมก่อนกำหนดค่า การกำหนดค่าที่ไม่ถูกต้องหมายความว่ามีจุดบกพร่องอยู่ในโค้ดเฟรมเวิร์ก หรือมีข้อมูลเมตาแบบคงที่ของ HAL และข้อกำหนดในสตรีมไม่ตรงกัน
-ENODEV: หากมีข้อผิดพลาดร้ายแรงและอุปกรณ์ไม่ทำงานอีกต่อไป เฉพาะกรอบงานเท่านั้นที่สามารถเรียก close() ได้สำเร็จหลังจากข้อผิดพลาดนี้ถูกส่งคืน
const camera_metadata_t *(* build_default_request_settings) (const struct camera3_device *, ประเภท int) |
โครงสร้าง_default_request_settings:
สร้างการตั้งค่าการจับภาพสำหรับกรณีการใช้งานกล้องมาตรฐาน
อุปกรณ์จะต้องส่งคืนบัฟเฟอร์การตั้งค่าที่ได้รับการกำหนดค่าให้ตรงตามกรณีการใช้งานที่ร้องขอ ซึ่งจะต้องเป็นหนึ่งใน enums CAMERA3_TEMPLATE_* ต้องรวมฟิลด์ควบคุมคำขอทั้งหมดไว้ด้วย
HAL ยังคงเป็นเจ้าของโครงสร้างนี้ แต่ตัวชี้ไปยังโครงสร้างจะต้องถูกต้องจนกว่าอุปกรณ์จะถูกปิด กรอบงานและ HAL อาจไม่ปรับเปลี่ยนบัฟเฟอร์เมื่อมีการส่งคืนโดยการเรียกนี้ บัฟเฟอร์เดียวกันอาจถูกส่งคืนสำหรับการเรียกเทมเพลตเดียวกันหรือเทมเพลตอื่นในภายหลัง
ต้องการประสิทธิภาพการทำงาน:
นี่ควรเป็นการโทรที่ไม่บล็อค HAL ควรกลับจากการโทรนี้ใน 1 มิลลิวินาที และต้องกลับจากการโทรนี้ใน 5 มิลลิวินาที
ส่งกลับค่า:
ข้อมูลเมตาที่ถูกต้อง: เมื่อสร้างบัฟเฟอร์การตั้งค่าเริ่มต้นสำเร็จ
NULL: ในกรณีที่มีข้อผิดพลาดร้ายแรง หลังจากที่สิ่งนี้ถูกส่งคืน เฉพาะเมธอด close() เท่านั้นที่สามารถเรียกได้สำเร็จโดยเฟรมเวิร์ก
เป็นโมฆะ (* ดัมพ์) (const struct camera3_device *, int fd) |
ทิ้ง:
พิมพ์สถานะการแก้ไขข้อบกพร่องสำหรับอุปกรณ์กล้อง สิ่งนี้จะถูกเรียกโดยเฟรมเวิร์กเมื่อบริการกล้องถูกถามถึงดัมพ์การดีบัก ซึ่งเกิดขึ้นเมื่อใช้เครื่องมือ dumpsys หรือเมื่อบันทึกรายงานจุดบกพร่อง
ตัวอธิบายไฟล์ที่ส่งผ่านสามารถใช้เพื่อเขียนข้อความการดีบักโดยใช้ dprintf() หรือ write() ข้อความควรอยู่ในการเข้ารหัส ASCII เท่านั้น
ต้องการประสิทธิภาพการทำงาน:
นี่จะต้องเป็นการโทรที่ไม่บล็อค HAL ควรกลับจากการโทรนี้ใน 1 มิลลิวินาที และต้องกลับจากการโทรนี้ใน 10 มิลลิวินาที การโทรนี้ต้องหลีกเลี่ยงการหยุดชะงัก เนื่องจากอาจถูกเรียกเมื่อใดก็ได้ระหว่างการทำงานของกล้อง การซิงโครไนซ์พื้นฐานใดๆ ที่ใช้ (เช่น ล็อค mutex หรือเซมาฟอร์) ควรได้รับพร้อมกับการหมดเวลา
int (* ล้าง) (สร้างโครงสร้าง กล้อง 3_device *) |
ล้าง:
ล้างการจับภาพที่กำลังดำเนินการอยู่ทั้งหมดและบัฟเฟอร์ทั้งหมดในไปป์ไลน์บนอุปกรณ์ที่กำหนด เฟรมเวิร์กจะใช้สิ่งนี้เพื่อดัมพ์สถานะทั้งหมดโดยเร็วที่สุดเพื่อเตรียมสำหรับการเรียก configuration_streams()
ไม่จำเป็นต้องส่งคืนบัฟเฟอร์สำเร็จ ดังนั้นทุกบัฟเฟอร์ที่เก็บไว้ ณ เวลาที่ ล้าง () (ไม่ว่าจะเติมสำเร็จหรือไม่ก็ตาม) อาจถูกส่งคืนพร้อมกับ CAMERA3_BUFFER_STATUS_ERROR โปรดทราบว่า HAL ยังคงได้รับอนุญาตให้ส่งคืนบัฟเฟอร์ที่ถูกต้อง (CAMERA3_BUFFER_STATUS_OK) ในระหว่างการโทรนี้ หากกรอกข้อมูลเรียบร้อยแล้ว
คำขอทั้งหมดที่อยู่ใน HAL ในปัจจุบันคาดว่าจะได้รับการส่งคืนโดยเร็วที่สุด คำขอที่ไม่อยู่ในกระบวนการควรส่งคืนข้อผิดพลาดทันที บล็อกฮาร์ดแวร์ที่ขัดจังหวะใดๆ ควรหยุด และควรรอบล็อกฮาร์ดแวร์ที่ไม่ขัดจังหวะใดๆ ต่อไป
flush() อาจถูกเรียกพร้อมกันกับ process_capture_request() ด้วยความคาดหวังว่า process_capture_request จะกลับมาอย่างรวดเร็วและคำขอที่ส่งในการเรียก process_capture_request นั้นจะได้รับการปฏิบัติเหมือนกับคำขอในเที่ยวบินอื่น ๆ ทั้งหมด เนื่องจากปัญหาการทำงานพร้อมกัน จึงเป็นไปได้ว่าจากมุมมองของ HAL การเรียก process_capture_request() อาจเริ่มต้นขึ้นหลังจากการเรียกใช้ฟลัชแล้ว แต่ยังไม่ได้ส่งคืน หากการเรียกดังกล่าวเกิดขึ้นก่อนที่ Flush() จะกลับมา HAL ควรปฏิบัติต่อคำขอจับภาพใหม่เช่นเดียวกับคำขอที่รอดำเนินการในเที่ยวบินอื่นๆ (ดู #4 ด้านล่าง)
โดยเฉพาะอย่างยิ่ง HAL จะต้องปฏิบัติตามข้อกำหนดด้านล่างสำหรับกรณีต่างๆ:
- สำหรับการจับที่สายเกินไปที่ HAL จะยกเลิก/หยุด และจะเสร็จสิ้นตามปกติโดย HAL กล่าวคือ HAL สามารถส่งชัตเตอร์/แจ้งเตือน และ process_capture_result และบัฟเฟอร์ได้ตามปกติ
- สำหรับคำขอที่รอดำเนินการซึ่งยังไม่ได้ดำเนินการใดๆ HAL จะต้องเรียกใช้การแจ้งเตือน CAMERA3_MSG_ERROR_REQUEST และส่งคืนบัฟเฟอร์เอาต์พุตทั้งหมดที่มี process_capture_result ในสถานะข้อผิดพลาด (CAMERA3_BUFFER_STATUS_ERROR) HAL จะต้องไม่วางกรอบการเปิดตัวไว้ในสถานะข้อผิดพลาด แต่จะต้องตั้งค่ากรอบการเปิดตัวเป็นรั้วรับที่ส่งผ่านโดยกรอบงานแทน หรือ -1 หาก HAL รอไว้แล้ว นี่เป็นเส้นทางที่ต้องติดตามสำหรับการบันทึกใดๆ ที่ HAL เรียก notify() ด้วย CAMERA3_MSG_SHUTTER แล้ว แต่จะไม่สร้างข้อมูลเมตา/บัฟเฟอร์ที่ถูกต้องใดๆ หลังจาก CAMERA3_MSG_ERROR_REQUEST สำหรับเฟรมที่กำหนด จะอนุญาตเฉพาะ process_capture_results ที่มีบัฟเฟอร์ใน CAMERA3_BUFFER_STATUS_ERROR เท่านั้น ไม่อนุญาตให้มีการแจ้งเตือนหรือ process_capture_result เพิ่มเติมด้วยข้อมูลเมตาที่ไม่เป็นค่าว่าง
สำหรับคำขอที่รอดำเนินการที่เสร็จสมบูรณ์บางส่วนซึ่งจะไม่มีบัฟเฟอร์เอาต์พุตทั้งหมดหรืออาจไม่มีข้อมูลเมตา HAL ควรปฏิบัติตามด้านล่าง:
3.1. แจ้งเตือนการโทรด้วย CAMERA3_MSG_ERROR_RESULT หากข้อมูลเมตาผลลัพธ์ที่คาดหวังบางส่วน (เช่น ข้อมูลเมตาบางส่วนอย่างน้อยหนึ่งรายการ) ไม่สามารถใช้งานได้สำหรับการบันทึก
3.2. แจ้งเตือนการโทรด้วย CAMERA3_MSG_ERROR_BUFFER สำหรับทุกบัฟเฟอร์ที่จะไม่ถูกสร้างสำหรับการจับภาพ
3.3 แจ้งเตือนการโทรด้วย CAMERA3_MSG_SHUTTER พร้อมการประทับเวลาการจับภาพก่อนที่บัฟเฟอร์/ข้อมูลเมตาใด ๆ จะถูกส่งกลับด้วย process_capture_result
3.4 สำหรับการจับที่จะสร้างผลลัพธ์บางอย่าง HAL จะต้องไม่เรียก CAMERA3_MSG_ERROR_REQUEST เนื่องจากนั่นบ่งชี้ถึงความล้มเหลวโดยสมบูรณ์
3.5. บัฟเฟอร์/ข้อมูลเมตาที่ถูกต้องควรถูกส่งผ่านไปยังเฟรมเวิร์กตามปกติ
3.6. บัฟเฟอร์ที่ล้มเหลวควรถูกส่งกลับไปยังกรอบงานตามที่อธิบายไว้สำหรับกรณีที่ 2 แต่บัฟเฟอร์ที่ล้มเหลวไม่จำเป็นต้องปฏิบัติตามลำดับบัฟเฟอร์ที่ถูกต้องที่เข้มงวด และอาจไม่อยู่ในลำดับที่เกี่ยวข้องกับบัฟเฟอร์ที่ถูกต้อง ตัวอย่างเช่น หากบัฟเฟอร์ A, B, C, D, E ถูกส่งไป, D และ E ล้มเหลว ดังนั้น A, E, B, D, C จะเป็นใบสั่งส่งคืนที่ยอมรับได้
3.7. สำหรับข้อมูลเมตาที่ขาดหายไปทั้งหมด การเรียก CAMERA3_MSG_ERROR_RESULT ก็เพียงพอแล้ว ไม่จำเป็นต้องเรียก process_capture_result ด้วยข้อมูลเมตา NULL หรือเทียบเท่า
- หากมีการเรียกใช้ flush() ในขณะที่การเรียกใช้ process_capture_request() ทำงานอยู่ การเรียกกระบวนการนั้นควรกลับมาโดยเร็วที่สุด นอกจากนี้ หากการเรียก process_capture_request() เกิดขึ้นหลังจากเรียกใช้ ฟลัช() แล้ว แต่ก่อนที่ ฟลัช() จะถูกส่งกลับ คำขอจับภาพที่ได้รับจากการเรียกกระบวนการที่ล่าช้าของ process_capture_request ควรได้รับการปฏิบัติเหมือนเป็นคำขอที่รอดำเนินการในกรณีที่ #2 ข้างต้น
flush() ควรส่งคืนเฉพาะเมื่อไม่มีบัฟเฟอร์หรือคำขอที่ค้างอยู่ใน HAL อีกต่อไป เฟรมเวิร์กอาจเรียก configuration_streams (เนื่องจากสถานะ HAL ถูกระงับแล้ว) หรืออาจออกคำขอใหม่
โปรดทราบว่าการสนับสนุนเฉพาะกรณีผลลัพธ์ที่สำเร็จอย่างสมบูรณ์และล้มเหลวอย่างสมบูรณ์ก็เพียงพอแล้ว อย่างไรก็ตาม เป็นที่ต้องการอย่างมากที่จะสนับสนุนกรณีความล้มเหลวบางส่วนด้วย เนื่องจากสามารถช่วยปรับปรุงประสิทธิภาพโดยรวมของการเรียกแบบฟลัชได้
ต้องการประสิทธิภาพการทำงาน:
HAL ควรกลับจากการเรียกนี้ภายใน 100 มิลลิวินาที และต้องกลับจากการเรียกนี้ใน 1000 มิลลิวินาที และการโทรนี้จะต้องไม่ถูกบล็อกนานกว่าเวลาแฝงของไปป์ไลน์ (ดูคำจำกัดความ S7)
ข้อมูลเวอร์ชัน:
ใช้ได้เฉพาะในกรณีที่อุปกรณ์รุ่น> = CAMERA_DEVICE_API_VERSION_3_1
ส่งกลับค่า:
0: เมื่อทำการล้างกล้อง HAL สำเร็จ
-EINVAL: หากอินพุตมีรูปแบบไม่ถูกต้อง (อุปกรณ์ไม่ถูกต้อง)
-ENODEV: หากอุปกรณ์กล้องพบข้อผิดพลาดร้ายแรง หลังจากที่ข้อผิดพลาดนี้ถูกส่งกลับ เฉพาะเมธอด close() เท่านั้นที่สามารถเรียกโดยเฟรมเวิร์กได้สำเร็จ
เป็นโมฆะ (* get_metadata_vendor_tag_ops) (const struct camera3_device *, vendor_tag_query_ops_t *ops) |
get_metadata_vendor_tag_ops:
รับวิธีการค้นหาข้อมูลแท็กข้อมูลเมตาส่วนขยายของผู้ขาย HAL ควรกรอกวิธีการทำงานของแท็กผู้ขายทั้งหมด หรือปล่อยให้การดำเนินการไม่เปลี่ยนแปลงหากไม่มีการกำหนดแท็กผู้ขาย
คำจำกัดความของ vendor_tag_query_ops_t สามารถพบได้ในระบบ/สื่อ/กล้อง/รวม/ระบบ/กล้อง_metadata.h
>= CAMERA_DEVICE_API_VERSION_3_2: เลิกใช้งานแล้ว ฟังก์ชันนี้เลิกใช้แล้ว และควรตั้งค่าเป็น NULL โดย HAL โปรดใช้ get_vendor_tag_ops ใน camera_common.h แทน
int (* เริ่มต้น) (const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
เริ่มต้น:
การเริ่มต้นครั้งเดียวเพื่อส่งผ่านตัวชี้ฟังก์ชันการเรียกกลับของเฟรมเวิร์กไปยัง HAL จะถูกเรียกหนึ่งครั้งหลังจากการเรียก open() สำเร็จ ก่อนที่จะเรียกใช้ฟังก์ชันอื่นๆ บนโครงสร้าง camera3_device_ops
ต้องการประสิทธิภาพการทำงาน:
นี่ควรเป็นการโทรที่ไม่บล็อค HAL ควรกลับจากการโทรนี้ภายใน 5 มิลลิวินาที และต้องกลับจากการโทรนี้ภายใน 10 มิลลิวินาที
ส่งกลับค่า:
0: เมื่อเริ่มต้นได้สำเร็จ
-ENODEV: หากการเริ่มต้นล้มเหลว หลังจากนี้เฟรมเวิร์กสามารถเรียกใช้ close() ได้สำเร็จเท่านั้น
int (* process_capture_request) (สร้างโครงสร้าง กล้อง 3_ อุปกรณ์ *, กล้อง 3_capture_request_t * คำขอ) |
กระบวนการ_จับ_คำขอ:
ส่งคำขอจับภาพใหม่ไปยัง HAL HAL ไม่ควรกลับจากการเรียกนี้จนกว่าจะพร้อมที่จะยอมรับคำขอถัดไปที่จะดำเนินการ เฟรมเวิร์กจะทำการเรียก process_capture_request() เพียงครั้งเดียวเท่านั้น และการเรียกทั้งหมดจะมาจากเธรดเดียวกัน การเรียก process_capture_request() ครั้งถัดไปจะเกิดขึ้นทันทีที่มีคำขอใหม่และบัฟเฟอร์ที่เกี่ยวข้อง ในสถานการณ์แสดงตัวอย่างปกติ หมายความว่าฟังก์ชันจะถูกเรียกอีกครั้งโดยเฟรมเวิร์กเกือบจะในทันที
การประมวลผลคำขอจริงเป็นแบบอะซิงโครนัส โดย HAL จะส่งคืนผลลัพธ์ของการจับภาพผ่านการเรียก process_capture_result() การเรียกนี้จำเป็นต้องมีข้อมูลเมตาของผลลัพธ์ แต่บัฟเฟอร์เอาต์พุตอาจจัดเตรียมรั้วการซิงค์ให้รอ คาดว่าคำขอหลายรายการจะดำเนินการพร้อมกัน เพื่อรักษาอัตราเฟรมเอาต์พุตเต็ม
กรอบงานยังคงรักษาความเป็นเจ้าของโครงสร้างคำขอ รับประกันว่าจะใช้ได้เฉพาะในระหว่างการโทรนี้เท่านั้น อุปกรณ์ HAL ต้องทำสำเนาข้อมูลที่จำเป็นเพื่อเก็บไว้สำหรับการประมวลผลการจับ HAL มีหน้าที่รับผิดชอบในการรอและปิดรั้วของบัฟเฟอร์และส่งคืนหมายเลขอ้างอิงบัฟเฟอร์ไปยังกรอบงาน
HAL จะต้องเขียนตัวอธิบายไฟล์สำหรับ release sync Fenge ของบัฟเฟอร์อินพุตลงใน input_buffer->release_fence หาก input_buffer ไม่ใช่ NULL หาก HAL ส่งคืน -1 สำหรับรั้วการซิงค์การปล่อยบัฟเฟอร์อินพุต กรอบงานจะมีอิสระในการนำบัฟเฟอร์อินพุตกลับมาใช้ใหม่ได้ทันที มิฉะนั้น เฟรมเวิร์กจะรอบนรั้วการซิงค์ก่อนที่จะเติมและนำบัฟเฟอร์อินพุตกลับมาใช้ใหม่
>= CAMERA_DEVICE_API_VERSION_3_2:
บัฟเฟอร์อินพุต/เอาท์พุตที่กรอบงานระบุไว้ในแต่ละคำขออาจเป็นบัฟเฟอร์ใหม่ (HAL ไม่เคยเห็นมาก่อน)
ข้อควรพิจารณาด้านประสิทธิภาพ:
การจัดการบัฟเฟอร์ใหม่ควรมีน้ำหนักเบามาก และไม่ควรมีการลดอัตราเฟรมหรือความกระวนกระวายใจของเฟรม
การเรียกนี้จะต้องกลับมาเร็วเพียงพอเพื่อให้แน่ใจว่าอัตราเฟรมที่ร้องขอสามารถคงอยู่ได้ โดยเฉพาะในกรณีการสตรีม (การตั้งค่าคุณภาพหลังการประมวลผลตั้งเป็น FAST) HAL ควรส่งคืนการเรียกนี้ในช่วงเวลา 1 เฟรม และต้องส่งคืนจากการเรียกนี้ในช่วงเวลา 4 เฟรม
ส่งกลับค่า:
0: เมื่อเริ่มต้นการประมวลผลคำขอจับภาพได้สำเร็จ
-EINVAL: หากอินพุตมีรูปแบบไม่ถูกต้อง (การตั้งค่าเป็น NULL เมื่อไม่ได้รับอนุญาต จะมีบัฟเฟอร์เอาต์พุต 0 เป็นต้น) และการประมวลผลการจับไม่สามารถเริ่มต้นได้ ความล้มเหลวระหว่างการประมวลผลคำขอควรได้รับการจัดการโดยการเรียก camera3_callback_ops_t.notify() ในกรณีของข้อผิดพลาดนี้ กรอบงานจะยังคงรับผิดชอบสำหรับรั้วของบัฟเฟอร์สตรีมและตัวจัดการบัฟเฟอร์ HAL ไม่ควรปิดรั้วหรือส่งคืนบัฟเฟอร์เหล่านี้ด้วย process_capture_result
-ENODEV: หากอุปกรณ์กล้องพบข้อผิดพลาดร้ายแรง หลังจากที่ข้อผิดพลาดนี้ถูกส่งกลับ เฉพาะเมธอด close() เท่านั้นที่สามารถเรียกโดยเฟรมเวิร์กได้สำเร็จ
int (* register_stream_buffers) (const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
register_stream_buffers:
>= CAMERA_DEVICE_API_VERSION_3_2:
เลิกใช้แล้ว สิ่งนี้จะไม่ถูกเรียกและจะต้องตั้งค่าเป็น NULL
<= CAMERA_DEVICE_API_VERSION_3_1:
ลงทะเบียนบัฟเฟอร์สำหรับสตรีมที่กำหนดด้วยอุปกรณ์ HAL เมธอดนี้ถูกเรียกโดยเฟรมเวิร์กหลังจากสตรีมใหม่ถูกกำหนดโดย configuration_streams และก่อนที่บัฟเฟอร์จากสตรีมนั้นจะถูกรวมไว้ในคำขอจับภาพ หากสตรีมเดียวกันแสดงอยู่ในการเรียก configuration_streams() ครั้งต่อไป register_stream_buffers จะ ไม่ ถูกเรียกอีกครั้งสำหรับสตรีมนั้น
เฟรมเวิร์กไม่จำเป็นต้องลงทะเบียนบัฟเฟอร์สำหรับสตรีมที่กำหนดค่าไว้ทั้งหมดก่อนที่จะส่งคำขอจับภาพครั้งแรก ซึ่งช่วยให้สามารถเริ่มต้นดูตัวอย่างได้อย่างรวดเร็ว (หรือกรณีการใช้งานที่คล้ายกัน) ในขณะที่สตรีมอื่นๆ ยังคงได้รับการจัดสรร
วิธีการนี้มีวัตถุประสงค์เพื่อให้อุปกรณ์ HAL แมปหรือเตรียมบัฟเฟอร์เพื่อใช้ในภายหลัง บัฟเฟอร์ที่ส่งผ่านจะถูกล็อคเพื่อใช้งานอยู่แล้ว เมื่อสิ้นสุดการโทร บัฟเฟอร์ทั้งหมดจะต้องพร้อมที่จะส่งคืนไปยังสตรีม อาร์กิวเมนต์ buffer_set ใช้ได้เฉพาะในช่วงระยะเวลาของการโทรนี้เท่านั้น
หากตั้งค่ารูปแบบสตรีมเป็น HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED กล้อง HAL ควรตรวจสอบบัฟเฟอร์ที่ส่งผ่านที่นี่เพื่อกำหนดข้อมูลรูปแบบพิกเซลส่วนตัวของแพลตฟอร์ม
ต้องการประสิทธิภาพการทำงาน:
นี่ควรเป็นการโทรที่ไม่บล็อค HAL ควรกลับจากการโทรนี้ใน 1 มิลลิวินาที และต้องกลับจากการโทรนี้ใน 5 มิลลิวินาที
ส่งกลับค่า:
0: เมื่อลงทะเบียนบัฟเฟอร์สตรีมใหม่สำเร็จ
-EINVAL: หาก stream_buffer_set ไม่ได้อ้างอิงถึงสตรีมที่ใช้งานอยู่ที่ถูกต้อง หรือหากอาร์เรย์บัฟเฟอร์ไม่ถูกต้อง
-ENOMEM: หากมีความล้มเหลวในการลงทะเบียนบัฟเฟอร์ เฟรมเวิร์กจะต้องพิจารณาว่าบัฟเฟอร์สตรีมทั้งหมดถูกยกเลิกการลงทะเบียน และสามารถลองลงทะเบียนอีกครั้งในภายหลังได้
-ENODEV: หากมีข้อผิดพลาดร้ายแรง และอุปกรณ์ใช้งานไม่ได้อีกต่อไป เฉพาะกรอบงานเท่านั้นที่สามารถเรียก close() ได้สำเร็จหลังจากข้อผิดพลาดนี้ถูกส่งคืน
เอกสารประกอบสำหรับโครงสร้างนี้สร้างขึ้นจากไฟล์ต่อไปนี้:
- ฮาร์ดแวร์ / libhardware / รวม / ฮาร์ดแวร์ / กล้อง 3.h