การอ้างอิง Struct camera3_device_ops
#include <
camera3.h
>
ฟิลด์ข้อมูล |
|
int(* | initialize )(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
int(* | configure_streams )(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
int(* | register_stream_buffers )(const struct camera3_device *, const camera3_stream_buffer_set_t *buffer_set) |
const camera_metadata_t *(* | construct_default_request_settings )(const struct camera3_device *, int type) |
int(* | process_capture_request )(const struct camera3_device *, camera3_capture_request_t *request) |
void(* | get_metadata_vendor_tag_ops )(const struct camera3_device *, vendor_tag_query_ops_t *ops) |
void(* | dump )(const struct camera3_device *, int fd) |
int(* | flush )(const struct camera3_device *) |
void * | reserved [8] |
คำอธิบายโดยละเอียด
เอกสารประกอบในสนาม
int(* configure_streams)(const struct camera3_device *, camera3_stream_configuration_t *stream_list) |
configure_streams:
CAMERA_DEVICE_API_VERSION_3_0 เท่านั้น
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกใช้นี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กําหนดไว้ใน stream_list ระบบจะเรียกใช้เมธอดนี้อย่างน้อย 1 ครั้งหลังจาก initialize() ก่อนที่จะส่งคําขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่มีความสามารถในการส่งออกอย่างน้อย 1 รายการ และต้องมีสตรีมที่มีความสามารถในการรับอินพุตได้ไม่เกิน 1 รายการ
stream_list อาจเป็นสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกใช้ configure_stream() ก่อนหน้านี้) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ HAL อาจเขียนค่าของ usage และ/หรือ max_buffers ใหม่ระหว่างการเรียกใช้การกําหนดค่า
เฟรมเวิร์กจะตรวจหาการเปลี่ยนแปลงดังกล่าว จากนั้นจะจัดสรรบัฟเฟอร์สตรีมใหม่ และเรียกใช้ register_stream_buffers() อีกครั้งก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ในปัจจุบันไม่ได้อยู่ใน stream_list ทาง HAL อาจนําการอ้างอิงถึงสตรีมนั้นออกได้อย่างปลอดภัย เฟรมเวิร์กจะไม่นำข้อมูลนี้ไปใช้ซ้ำในการเรียกใช้ configure() ในภายหลัง และระบบจะปลดปล่อยบัฟเฟอร์ gralloc ทั้งหมดสำหรับข้อมูลนี้หลังจากที่การเรียกใช้ configure_streams() เสร็จสิ้น
เฟรมเวิร์กเป็นเจ้าของโครงสร้าง stream_list และอาจเข้าถึงไม่ได้เมื่อการเรียกนี้เสร็จสมบูรณ์ ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละรายการจะยังคงใช้งานได้สำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียกใช้ configure_stream() ครั้งแรกซึ่งไม่มี camera3_stream_t นั้นอยู่ในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่สามารถเปลี่ยนค่าในโครงสร้างสตรีมนอกพอยน์เตอร์ส่วนตัว ยกเว้นสมาชิกการใช้งานและ max_buffers ระหว่างการเรียกใช้ configure_streams()
หากสตรีมใหม่ ระบบจะตั้งค่าฟิลด์การใช้งาน, max_buffer และตัวชี้ส่วนตัวของโครงสร้างสตรีมเป็น 0 ทั้งหมด อุปกรณ์ HAL ต้องตั้งค่าช่องเหล่านี้ก่อนที่การเรียกใช้ configure_streams() จะแสดงผล จากนั้นเฟรมเวิร์กและโมดูล gralloc ของแพลตฟอร์มจะใช้ช่องเหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สําหรับแต่ละสตรีม
ก่อนที่สตรีมใหม่ดังกล่าวจะมีบัฟเฟอร์รวมอยู่ในคำขอบันทึก เฟรมเวิร์กจะเรียกใช้ register_stream_buffers() กับสตรีมนั้น อย่างไรก็ตาม เฟรมเวิร์กไม่จำเป็นต้องลงทะเบียนบัฟเฟอร์สำหรับสตรีม ทั้งหมด ก่อนส่งคำขอ วิธีนี้ช่วยให้เริ่มต้น (เช่น) สตรีมตัวอย่างได้อย่างรวดเร็ว โดยมีการกําหนดสตรีมอื่นๆ ในภายหลังหรือพร้อมกัน
CAMERA_DEVICE_API_VERSION_3_1 เท่านั้น
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกใช้นี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กําหนดไว้ใน stream_list ระบบจะเรียกใช้เมธอดนี้อย่างน้อย 1 ครั้งหลังจาก initialize() ก่อนที่จะส่งคําขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่มีความสามารถในการส่งออกอย่างน้อย 1 รายการ และต้องมีสตรีมที่มีความสามารถในการรับอินพุตได้ไม่เกิน 1 รายการ
stream_list อาจเป็นสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกใช้ configure_stream() ก่อนหน้านี้) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ HAL อาจเขียนค่าของ usage และ/หรือ max_buffers ใหม่ระหว่างการเรียกใช้การกําหนดค่า
เฟรมเวิร์กจะตรวจหาการเปลี่ยนแปลงดังกล่าว จากนั้นจะจัดสรรบัฟเฟอร์สตรีมใหม่ และเรียกใช้ register_stream_buffers() อีกครั้งก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ในปัจจุบันไม่ได้อยู่ใน stream_list ทาง HAL อาจนําการอ้างอิงถึงสตรีมนั้นออกได้อย่างปลอดภัย เฟรมเวิร์กจะไม่นำข้อมูลนี้ไปใช้ซ้ำในการเรียกใช้ configure() ในภายหลัง และระบบจะปลดปล่อยบัฟเฟอร์ gralloc ทั้งหมดสำหรับข้อมูลนี้หลังจากที่การเรียกใช้ configure_streams() เสร็จสิ้น
เฟรมเวิร์กเป็นเจ้าของโครงสร้าง stream_list และอาจเข้าถึงไม่ได้เมื่อการเรียกนี้เสร็จสมบูรณ์ ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละรายการจะยังคงใช้งานได้สำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียกใช้ configure_stream() ครั้งแรกซึ่งไม่มี camera3_stream_t นั้นอยู่ในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่สามารถเปลี่ยนค่าในโครงสร้างสตรีมนอกพอยน์เตอร์ส่วนตัว ยกเว้นสมาชิกการใช้งานและ max_buffers ระหว่างการเรียกใช้ configure_streams()
หากสตรีมใหม่ ระบบจะตั้งค่าช่อง max_buffer และช่องพอยน์เตอร์ส่วนตัวของโครงสร้างสตรีมเป็น 0 ทั้งหมด ระบบจะตั้งค่าการใช้งานเป็น Flag การใช้งานสำหรับผู้บริโภค อุปกรณ์ HAL ต้องตั้งค่าช่องเหล่านี้ก่อนที่การเรียกใช้ configure_streams() จะแสดงผล จากนั้นเฟรมเวิร์กและโมดูล gralloc ของแพลตฟอร์มจะใช้ช่องเหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สําหรับแต่ละสตรีม
ก่อนที่สตรีมใหม่ดังกล่าวจะมีบัฟเฟอร์รวมอยู่ในคำขอบันทึก เฟรมเวิร์กจะเรียกใช้ register_stream_buffers() กับสตรีมนั้น อย่างไรก็ตาม เฟรมเวิร์กไม่จำเป็นต้องลงทะเบียนบัฟเฟอร์สำหรับสตรีม ทั้งหมด ก่อนส่งคำขอ วิธีนี้ช่วยให้เริ่มต้น (เช่น) สตรีมตัวอย่างได้อย่างรวดเร็ว โดยมีการกําหนดสตรีมอื่นๆ ในภายหลังหรือพร้อมกัน
>= CAMERA_DEVICE_API_VERSION_3_2:
รีเซ็ตไปป์ไลน์การประมวลผลอุปกรณ์กล้อง HAL และตั้งค่าสตรีมอินพุตและเอาต์พุตใหม่ การเรียกใช้นี้จะแทนที่การกำหนดค่าสตรีมที่มีอยู่ด้วยสตรีมที่กําหนดไว้ใน stream_list ระบบจะเรียกใช้เมธอดนี้อย่างน้อย 1 ครั้งหลังจาก initialize() ก่อนที่จะส่งคําขอด้วย process_capture_request()
stream_list ต้องมีสตรีมที่มีความสามารถในการส่งออกอย่างน้อย 1 รายการ และต้องมีสตรีมที่มีความสามารถในการรับอินพุตได้ไม่เกิน 1 รายการ
stream_list อาจเป็นสตรีมที่อยู่ในชุดสตรีมที่ใช้งานอยู่ในปัจจุบันด้วย (จากการเรียกใช้ configure_stream() ก่อนหน้านี้) สตรีมเหล่านี้จะมีค่าที่ถูกต้องสำหรับการใช้งาน, max_buffers และตัวชี้ส่วนตัวอยู่แล้ว
หาก HAL จำเป็นต้องเปลี่ยนการกำหนดค่าสตรีมสำหรับสตรีมที่มีอยู่เนื่องจากการกำหนดค่าใหม่ HAL อาจเขียนค่าของ usage และ/หรือ max_buffers ใหม่ระหว่างการเรียกใช้การกําหนดค่า
เฟรมเวิร์กจะตรวจหาการเปลี่ยนแปลงดังกล่าว และอาจจัดสรรบัฟเฟอร์สตรีมใหม่ก่อนที่จะใช้บัฟเฟอร์จากสตรีมนั้นในคำขอ
หากสตรีมที่ใช้งานอยู่ในปัจจุบันไม่ได้อยู่ใน stream_list ทาง HAL อาจนําการอ้างอิงถึงสตรีมนั้นออกได้อย่างปลอดภัย เฟรมเวิร์กจะไม่นำข้อมูลนี้ไปใช้ซ้ำในการเรียกใช้ configure() ในภายหลัง และระบบจะปลดปล่อยบัฟเฟอร์ gralloc ทั้งหมดสำหรับข้อมูลนี้หลังจากที่การเรียกใช้ configure_streams() เสร็จสิ้น
เฟรมเวิร์กเป็นเจ้าของโครงสร้าง stream_list และอาจเข้าถึงไม่ได้เมื่อการเรียกนี้เสร็จสมบูรณ์ ที่อยู่ของโครงสร้าง camera3_stream_t แต่ละรายการจะยังคงใช้งานได้สำหรับการเข้าถึงโดย HAL จนกว่าจะสิ้นสุดการเรียกใช้ configure_stream() ครั้งแรกซึ่งไม่มี camera3_stream_t นั้นอยู่ในอาร์กิวเมนต์ stream_list อีกต่อไป HAL ไม่สามารถเปลี่ยนค่าในโครงสร้างสตรีมนอกพอยน์เตอร์ส่วนตัว ยกเว้นสมาชิกการใช้งานและ max_buffers ระหว่างการเรียกใช้ configure_streams()
หากสตรีมใหม่ ระบบจะตั้งค่าช่อง max_buffer และช่องพอยน์เตอร์ส่วนตัวของโครงสร้างสตรีมเป็น 0 ทั้งหมด ระบบจะตั้งค่าการใช้งานเป็น Flag การใช้งานสำหรับผู้บริโภค อุปกรณ์ HAL ต้องตั้งค่าช่องเหล่านี้ก่อนที่การเรียกใช้ configure_streams() จะแสดงผล จากนั้นเฟรมเวิร์กและโมดูล gralloc ของแพลตฟอร์มจะใช้ช่องเหล่านี้เพื่อจัดสรรบัฟเฟอร์ gralloc สําหรับแต่ละสตรีม
เฟรมเวิร์กอาจรวมบัฟเฟอร์ที่จัดสรรใหม่ไว้ในคำขอบันทึกได้ทุกเมื่อ เมื่อระบบส่งบัฟเฟอร์ gralloc กลับไปยังเฟรมเวิร์กพร้อม process_capture_result (และมีการแจ้งสัญญาณ release_fence ที่เกี่ยวข้อง) เฟรมเวิร์กอาจเพิ่มหรือใช้บัฟเฟอร์นั้นซ้ำได้ทุกเมื่อ
เงื่อนไขเบื้องต้น
เฟรมเวิร์กจะเรียกใช้เมธอดนี้เมื่อไม่มีการประมวลผลภาพเท่านั้น กล่าวคือ ผลลัพธ์ทั้งหมดส่งกลับไปยังเฟรมเวิร์กแล้ว และส่งบัฟเฟอร์อินพุตและเอาต์พุตที่อยู่ระหว่างดำเนินการทั้งหมดกลับแล้ว และ HAL ได้ส่งสัญญาณให้รั้วการซิงค์การปล่อย เฟรมเวิร์กจะไม่ส่งคําขอใหม่สําหรับการบันทึกขณะที่การเรียกใช้ configure_streams() กําลังดําเนินการอยู่
เงื่อนไขหลัง
อุปกรณ์ HAL ต้องกำหนดค่าตัวเองเพื่อให้อัตราเฟรมเอาต์พุตสูงสุดที่เป็นไปได้ตามขนาดและรูปแบบของสตรีมเอาต์พุตตามที่ระบุไว้ในข้อมูลเมตาแบบคงที่ของอุปกรณ์กล้อง
ข้อกำหนดด้านประสิทธิภาพ
การเรียกใช้นี้จะใช้เวลานานและอาจใช้เวลาหลายร้อยมิลลิวินาทีจึงจะเสร็จสมบูรณ์ เนื่องจากอาจต้องรีเซ็ตและกำหนดค่าเซ็นเซอร์ภาพและไปป์ไลน์การประมวลผลของกล้องใหม่ อย่างไรก็ตาม อุปกรณ์ HAL ควรพยายามลดเวลาในการหน่วงเวลาการกำหนดค่าใหม่เพื่อลดการหยุดชั่วคราวที่ผู้ใช้มองเห็นได้ในระหว่างการเปลี่ยนแปลงโหมดการทํางานของแอปพลิเคชัน (เช่น การเปลี่ยนจากการจับภาพนิ่งเป็นการบันทึกวิดีโอ)
HAL ควรกลับมาจากคอลนี้ใน 500 มิลลิวินาที และต้องกลับมาจากคอลนี้ใน 1, 000 มิลลิวินาที
ผลลัพธ์
0: กำหนดค่าสตรีมสำเร็จ
-EINVAL: หากการกำหนดค่าสตรีมที่ขอไม่ถูกต้อง ตัวอย่างการกำหนดค่าสตรีมที่ไม่ถูกต้องมีดังนี้
- รวมถึงสตรีมที่มีอินพุตได้มากกว่า 1 รายการ (INPUT หรือ 2 ทิศทาง)
- ไม่รวมสตรีมที่มีเอาต์พุต (OUTPUT หรือ 2 ทิศทาง)
- รวมถึงสตรีมที่มีรูปแบบที่ไม่รองรับหรือมีขนาดที่ไม่รองรับสำหรับรูปแบบนั้น
- รวมถึงสตรีมเอาต์พุตของรูปแบบหนึ่งๆ มากเกินไป
- การกำหนดค่าการหมุนที่ไม่รองรับ (ใช้ได้กับอุปกรณ์ที่มีเวอร์ชัน >= CAMERA_DEVICE_API_VERSION_3_3 เท่านั้น)
- ขนาด/รูปแบบสตรีมไม่เป็นไปตามข้อกําหนดของ camera3_stream_configuration_t->operation_mode สําหรับโหมดที่ไม่ใช่ "ปกติ" หรือ HAL ไม่รองรับ operation_mode ที่ขอ (ใช้ได้กับอุปกรณ์ที่มีเวอร์ชัน >= CAMERA_DEVICE_API_VERSION_3_3 เท่านั้น)
โปรดทราบว่าเฟรมเวิร์กที่ส่งการกำหนดค่าสตรีมที่ไม่ถูกต้องไม่ใช่การดำเนินการตามปกติ เนื่องจากระบบจะตรวจสอบการกำหนดค่าสตรีมก่อนดำเนินการกำหนดค่า การกําหนดค่าที่ไม่ถูกต้องหมายความว่าโค้ดเฟรมเวิร์กมีข้อบกพร่อง หรือข้อมูลเมตาแบบคงที่ของ HAL ไม่ตรงกับข้อกําหนดในสตรีม
-ENODEV: หากเกิดข้อผิดพลาดร้ายแรงและอุปกรณ์ไม่ทำงานอีกต่อไป เฟรมเวิร์กจะเรียกใช้เฉพาะ close() ได้สําเร็จหลังจากแสดงข้อผิดพลาดนี้
const camera_metadata_t *(* construct_default_request_settings)(const struct camera3_device *, int type) |
construct_default_request_settings:
สร้างการตั้งค่าการจับภาพสำหรับกรณีการใช้งานกล้องมาตรฐาน
อุปกรณ์ต้องแสดงผลบัฟเฟอร์การตั้งค่าที่กำหนดค่าให้เป็นไปตาม Use Case ที่ขอ ซึ่งต้องเป็นค่าใดค่าหนึ่งจาก CAMERA3_TEMPLATE_* ต้องระบุช่องควบคุมคําขอทั้งหมด
HAL จะยังคงเป็นเจ้าของโครงสร้างนี้ แต่พอยน์เตอร์ไปยังโครงสร้างต้องใช้งานได้จนกว่าอุปกรณ์จะปิด เฟรมเวิร์กและ HAL อาจไม่แก้ไขบัฟเฟอร์เมื่อการเรียกนี้แสดงผล ระบบอาจแสดงบัฟเฟอร์เดียวกันสำหรับการเรียกใช้เทมเพลตเดียวกันหรือเทมเพลตอื่นๆ ในภายหลัง
ข้อกำหนดด้านประสิทธิภาพ
ซึ่งควรเป็นการเรียกที่ไม่บล็อก HAL ควรกลับมาจากคอลนี้ใน 1 มิลลิวินาที และต้องกลับมาจากคอลนี้ใน 5 มิลลิวินาที
ผลลัพธ์
ข้อมูลเมตาที่ถูกต้อง: การสร้างบัฟเฟอร์การตั้งค่าเริ่มต้นสำเร็จ
NULL: ในกรณีที่เกิดข้อผิดพลาดร้ายแรง หลังจากแสดงผลแล้ว จะมีเพียงเมธอด close() เท่านั้นที่เฟรมเวิร์กเรียกใช้ได้สําเร็จ
void(* dump)(const struct camera3_device *, int fd) |
ดัมพ์:
พิมพ์สถานะการแก้ไขข้อบกพร่องของอุปกรณ์กล้อง เฟรมเวิร์กจะเรียกใช้เมธอดนี้เมื่อมีการขอการแก้ไขข้อบกพร่องจากบริการกล้อง ซึ่งเกิดขึ้นเมื่อใช้เครื่องมือ dumpsys หรือเมื่อบันทึกรายงานข้อบกพร่อง
สามารถใช้ตัวระบุไฟล์ที่ส่งผ่านเพื่อเขียนข้อความการแก้ไขข้อบกพร่องโดยใช้ dprintf() หรือ write() โดยข้อความควรเป็นการเข้ารหัส ASCII เท่านั้น
ข้อกำหนดด้านประสิทธิภาพ
ต้องเป็นคอลที่ไม่บล็อก HAL ควรกลับมาจากคอลนี้ใน 1 มิลลิวินาที ต้องกลับมาจากคอลนี้ใน 10 มิลลิวินาที การเรียกนี้ต้องหลีกเลี่ยง Deadlock เนื่องจากอาจมีการเรียกใช้ได้ทุกเมื่อระหว่างที่กล้องทำงาน ควรใช้ค่าเริ่มต้นการซิงค์ที่ใช้ (เช่น ล็อกมิวเทคหรือเซมาโฟร์) ด้วยระยะหมดเวลา
int(* flush)(const struct camera3_device *) |
flush:
ล้างการบันทึกที่อยู่ระหว่างดำเนินการทั้งหมดและบัฟเฟอร์ทั้งหมดในไปป์ไลน์บนอุปกรณ์ที่ระบุ เฟรมเวิร์กจะใช้สิ่งนี้เพื่อถ่ายโอนข้อมูลสถานะทั้งหมดโดยเร็วที่สุดเพื่อเตรียมพร้อมสำหรับการเรียกใช้ configure_streams()
ระบบไม่จำเป็นต้องส่งคืนบัฟเฟอร์ให้สำเร็จ ดังนั้นบัฟเฟอร์ทั้งหมดที่มี ณ เวลาเรียกใช้ flush() (ไม่ว่าจะกรอกข้อมูลสำเร็จหรือไม่) อาจแสดงผลพร้อม 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 ต้องเรียก notify 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 หากข้อมูลเมตาผลลัพธ์ที่คาดไว้บางส่วน (เช่น ข้อมูลเมตาบางส่วนอย่างน้อย 1 รายการ) ไม่พร้อมใช้งานสำหรับการจับภาพ
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() หลังจากที่มีการเรียกใช้ flush() แต่ก่อนที่ flush() จะแสดงผล ระบบควรถือว่าคำขอบันทึกที่ได้จากคําเรียก process_capture_request ที่เรียกใช้ล่าช้าเป็นคำขอที่รอดําเนินการในเคส #2 ด้านบน
flush() ควรแสดงผลก็ต่อเมื่อไม่มีบัฟเฟอร์หรือคำขอที่รอดำเนินการใน HAL อีกต่อไป เฟรมเวิร์กอาจเรียกใช้ configure_streams (เนื่องจากตอนนี้สถานะ HAL อยู่ในสถานะ "ไม่มีการใช้งาน") หรืออาจส่งคำขอใหม่
โปรดทราบว่าคุณเพียงต้องรองรับกรณีที่ได้ผลลัพธ์สำเร็จทั้งหมดและล้มเหลวทั้งหมดก็เพียงพอแล้ว อย่างไรก็ตาม คุณควรรองรับกรณีที่ดำเนินการไม่สำเร็จบางส่วนด้วย เนื่องจากอาจช่วยปรับปรุงประสิทธิภาพโดยรวมของการเรียกใช้การล้างข้อมูลได้
ข้อกำหนดด้านประสิทธิภาพ
HAL ควรกลับมาจากคอลนี้ใน 100 มิลลิวินาที และต้องกลับมาจากคอลนี้ใน 1, 000 มิลลิวินาที และการเรียกใช้นี้ต้องไม่ถูกบล็อกนานกว่าเวลาในการตอบสนองของไปป์ไลน์ (ดูคำจำกัดความใน S7)
ข้อมูลเวอร์ชัน
ใช้ได้เฉพาะในกรณีที่เวอร์ชันอุปกรณ์ >= CAMERA_DEVICE_API_VERSION_3_1
ผลลัพธ์
0: ล้างข้อมูล HAL ของกล้องเรียบร้อยแล้ว
-EINVAL: หากอินพุตมีรูปแบบไม่ถูกต้อง (อุปกรณ์ไม่ถูกต้อง)
-ENODEV: หากอุปกรณ์กล้องพบข้อผิดพลาดร้ายแรง หลังจากแสดงข้อผิดพลาดนี้ เฟรมเวิร์กจะเรียกใช้เมธอด close() ได้สําเร็จเท่านั้น
void(* 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 ได้ใน system/media/camera/include/system/camera_metadata.h
>= CAMERA_DEVICE_API_VERSION_3_2: เลิกใช้งานแล้ว ฟังก์ชันนี้เลิกใช้งานแล้ว และ HAL ควรตั้งค่าเป็น NULL โปรดใช้ get_vendor_tag_ops ใน camera_common.h แทน
int(* initialize)(const struct camera3_device *, const camera3_callback_ops_t *callback_ops) |
initialize:
เริ่มต้นแบบครั้งเดียวเพื่อส่งตัวชี้ฟังก์ชัน Callback ของเฟรมเวิร์กไปยัง HAL ระบบจะเรียกใช้ 1 ครั้งหลังจากการเรียกใช้ open() สําเร็จ ก่อนที่จะเรียกใช้ฟังก์ชันอื่นๆ ในโครงสร้าง camera3_device_ops
ข้อกำหนดด้านประสิทธิภาพ
ซึ่งควรเป็นการเรียกที่ไม่บล็อก HAL ควรแสดงผลจากคําเรียกนี้ใน 5 มิลลิวินาที และต้องแสดงผลจากคําเรียกนี้ใน 10 มิลลิวินาที
ผลลัพธ์
0: เริ่มต้นสําเร็จ
-ENODEV: หากการเริ่มต้นไม่สำเร็จ หลังจากนั้นเฟรมเวิร์กจะเรียกใช้เฉพาะ close() ได้สําเร็จ
int(* process_capture_request)(const struct camera3_device *, camera3_capture_request_t *request) |
process_capture_request:
ส่งคำขอจับภาพใหม่ไปยัง HAL HAL ไม่ควรกลับมาจากคําเรียกนี้จนกว่าจะพร้อมรับคําขอถัดไปเพื่อประมวลผล เฟรมเวิร์กจะเรียกใช้ process_capture_request() ครั้งเดียวเท่านั้น และการเรียกใช้ทั้งหมดจะมาจากเธรดเดียวกัน การเรียกใช้ process_capture_request() ครั้งถัดไปจะเกิดขึ้นทันทีที่มีคำขอใหม่และบัฟเฟอร์ที่เกี่ยวข้อง ในการแสดงตัวอย่างปกติ หมายความว่าเฟรมเวิร์กจะเรียกใช้ฟังก์ชันอีกครั้งเกือบจะทันที
การประมวลผลคําขอจริงเป็นแบบไม่พร้อมกัน โดย HAL จะแสดงผลลัพธ์ของการจับภาพผ่านการเรียกใช้ process_capture_result() การเรียกใช้นี้กำหนดให้ข้อมูลเมตาของผลลัพธ์ต้องพร้อมใช้งาน แต่บัฟเฟอร์เอาต์พุตอาจให้รั้วการซิงค์เพื่อรอ ระบบคาดว่าจะมีคำขอหลายรายการที่ดำเนินการพร้อมกันเพื่อรักษาอัตราเฟรมเอาต์พุตให้เต็ม
เฟรมเวิร์กจะยังคงเป็นเจ้าของโครงสร้างคำขอ แต่จะรับประกันว่าใช้ได้ในระหว่างการโทรนี้เท่านั้น อุปกรณ์ HAL ต้องทำสำเนาข้อมูลที่ต้องเก็บไว้สำหรับการประมวลผลการจับภาพ HAL มีหน้าที่รับผิดชอบในการรอและปิดรั้วของบัฟเฟอร์ รวมถึงส่งคืนแฮนเดิลบัฟเฟอร์ไปยังเฟรมเวิร์ก
HAL ต้องเขียนตัวระบุไฟล์สำหรับรั้วการซิงค์การปล่อยของบัฟเฟอร์อินพุตลงใน input_buffer->release_fence หาก input_buffer ไม่ใช่ NULL หาก HAL แสดงผล -1 สำหรับรั้วการซิงค์การปล่อยบัฟเฟอร์อินพุต เฟรมเวิร์กจะใช้บัฟเฟอร์อินพุตซ้ำได้ทันที มิเช่นนั้น เฟรมเวิร์กจะรอที่รั้วการซิงค์ก่อนที่จะเติมและนำบัฟเฟอร์อินพุตมาใช้ซ้ำ
>= CAMERA_DEVICE_API_VERSION_3_2:
บัฟเฟอร์อินพุต/เอาต์พุตที่เฟรมเวิร์กระบุในแต่ละคำขออาจเป็นบัฟเฟอร์ใหม่ (HAL ไม่เคยเห็นมาก่อน)
ข้อควรพิจารณาด้านประสิทธิภาพ
การจัดการบัฟเฟอร์ใหม่ควรมีน้ำหนักเบามากและไม่ควรทำให้อัตราเฟรมลดลงหรือเฟรมกระตุก
การเรียกใช้นี้ต้องแสดงผลเร็วพอเพื่อให้เฟรมเรตที่ขอใช้งานได้อย่างต่อเนื่อง โดยเฉพาะสำหรับกรณีสตรีมมิง (การตั้งค่าคุณภาพหลังการประมวลผลเป็น "เร็ว") 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 เฟรมเวิร์กจะเรียกใช้เมธอดนี้หลังจากที่ configure_streams กำหนดสตรีมใหม่ และก่อนที่บัฟเฟอร์จากสตรีมนั้นๆ จะรวมอยู่ในคำขอบันทึก หากมีสตรีมเดียวกันแสดงอยู่ในการเรียกใช้ configure_streams() ในภายหลัง ระบบจะไม่เรียกใช้ register_stream_buffers สําหรับสตรีมนั้นอีก
เฟรมเวิร์กไม่จําเป็นต้องลงทะเบียนบัฟเฟอร์สําหรับสตรีมที่กําหนดค่าไว้ทั้งหมดก่อนที่จะส่งคําขอบันทึกแรก วิธีนี้ช่วยให้เริ่มต้นใช้งานตัวอย่างเพลง (หรือกรณีการใช้งานที่คล้ายกัน) ได้อย่างรวดเร็วขณะที่ระบบกําลังจัดสรรสตรีมอื่นๆ
วิธีนี้มีไว้เพื่อให้อุปกรณ์ HAL แมปหรือเตรียมบัฟเฟอร์เพื่อใช้ภายหลัง บัฟเฟอร์ที่ส่งผ่านจะล็อกไว้เพื่อใช้งานแล้ว เมื่อสิ้นสุดการโทร บัฟเฟอร์ทั้งหมดต้องพร้อมที่จะส่งกลับไปยังสตรีม โดยอาร์กิวเมนต์ buffer_set จะมีผลเฉพาะระหว่างการเรียกใช้นี้เท่านั้น
หากตั้งค่ารูปแบบสตรีมเป็น HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED แล้ว HAL ของกล้องควรตรวจสอบบัฟเฟอร์ที่ส่งผ่านที่นี่เพื่อระบุข้อมูลรูปแบบพิกเซลที่เป็นส่วนตัวของแพลตฟอร์ม
ข้อกำหนดด้านประสิทธิภาพ
ซึ่งควรเป็นการเรียกที่ไม่บล็อก HAL ควรกลับมาจากคอลนี้ใน 1 มิลลิวินาที และต้องกลับมาจากคอลนี้ใน 5 มิลลิวินาที
ผลลัพธ์
0: ลงทะเบียนบัฟเฟอร์สตรีมใหม่สำเร็จ
-EINVAL: หาก stream_buffer_set ไม่ได้อ้างอิงสตรีมที่มีการใช้งานที่ถูกต้อง หรือหากอาร์เรย์บัฟเฟอร์ไม่ถูกต้อง
-ENOMEM: หากลงทะเบียนบัฟเฟอร์ไม่สำเร็จ เฟรมเวิร์กต้องถือว่าบัฟเฟอร์สตรีมทั้งหมดไม่ได้ลงทะเบียน และสามารถลองลงทะเบียนอีกครั้งในภายหลัง
-ENODEV: หากมีข้อผิดพลาดร้ายแรงและอุปกรณ์ไม่ทำงานอีกต่อไป เฟรมเวิร์กจะเรียกใช้เฉพาะ close() ได้สําเร็จหลังจากแสดงข้อผิดพลาดนี้
เอกสารประกอบสำหรับโครงสร้างนี้สร้างขึ้นจากไฟล์ต่อไปนี้
- hardware/libhardware/include/hardware/ camera3.h