การอ้างอิง Struct camera3_device_ops

การอ้างอิง 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]
 

คำอธิบายโดยละเอียด

คําจํากัดความที่บรรทัด 2509 ของไฟล์ camera3.h .

เอกสารประกอบในสนาม

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 และตัวชี้ส่วนตัวอยู่แล้ว

หากสตรีมดังกล่าวลงทะเบียนบัฟเฟอร์ไว้แล้ว ระบบจะไม่เรียกใช้ register_stream_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 และตัวชี้ส่วนตัวอยู่แล้ว

หากสตรีมดังกล่าวลงทะเบียนบัฟเฟอร์ไว้แล้ว ระบบจะไม่เรียกใช้ register_stream_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() ได้สําเร็จหลังจากแสดงข้อผิดพลาดนี้

คําจํากัดความที่บรรทัด 2769 ของไฟล์ camera3.h .

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() เท่านั้นที่เฟรมเวิร์กเรียกใช้ได้สําเร็จ

คําจํากัดความที่บรรทัด 2859 ของไฟล์ camera3.h .

void(* dump)(const struct camera3_device *, int fd)

ดัมพ์:

พิมพ์สถานะการแก้ไขข้อบกพร่องของอุปกรณ์กล้อง เฟรมเวิร์กจะเรียกใช้เมธอดนี้เมื่อมีการขอการแก้ไขข้อบกพร่องจากบริการกล้อง ซึ่งเกิดขึ้นเมื่อใช้เครื่องมือ dumpsys หรือเมื่อบันทึกรายงานข้อบกพร่อง

สามารถใช้ตัวระบุไฟล์ที่ส่งผ่านเพื่อเขียนข้อความการแก้ไขข้อบกพร่องโดยใช้ dprintf() หรือ write() โดยข้อความควรเป็นการเข้ารหัส ASCII เท่านั้น

ข้อกำหนดด้านประสิทธิภาพ

ต้องเป็นคอลที่ไม่บล็อก HAL ควรกลับมาจากคอลนี้ใน 1 มิลลิวินาที ต้องกลับมาจากคอลนี้ใน 10 มิลลิวินาที การเรียกนี้ต้องหลีกเลี่ยง Deadlock เนื่องจากอาจมีการเรียกใช้ได้ทุกเมื่อระหว่างที่กล้องทำงาน ควรใช้ค่าเริ่มต้นการซิงค์ที่ใช้ (เช่น ล็อกมิวเทคหรือเซมาโฟร์) ด้วยระยะหมดเวลา

คําจํากัดความที่บรรทัด 2971 ของไฟล์ camera3.h .

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 ต้องเป็นไปตามข้อกำหนดด้านล่างสำหรับกรณีต่างๆ

  1. สำหรับการจับภาพที่ HAL ยกเลิก/หยุดไม่ทัน และ HAL จะดำเนินการให้เสร็จสมบูรณ์ตามปกติ กล่าวคือ HAL สามารถส่งชัตเตอร์/การแจ้งเตือนและ process_capture_result และบัฟเฟอร์ได้ตามปกติ
  2. สําหรับคําขอที่รอดําเนินการซึ่งยังไม่ได้ประมวลผล 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 เพิ่มเติมที่มีข้อมูลเมตาที่ไม่ใช่ค่าว่าง
  3. สำหรับคำขอที่รอดำเนินการซึ่งดำเนินการเสร็จสมบูรณ์เพียงบางส่วนซึ่งจะไม่มีบัฟเฟอร์เอาต์พุตทั้งหมดหรืออาจไม่มีข้อมูลเมตา 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 หรือเทียบเท่า

  4. หากมีการเรียกใช้ 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() ได้สําเร็จเท่านั้น

คําจํากัดความที่บรรทัด 3077 ของไฟล์ camera3.h .

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 แทน

คําจํากัดความที่บรรทัด 2950 ของไฟล์ camera3.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() ได้สําเร็จ

คําจํากัดความที่บรรทัด 2530 ของไฟล์ camera3.h .

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() ได้สําเร็จเท่านั้น

คําจํากัดความที่บรรทัด 2928 ของไฟล์ camera3.h .

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() ได้สําเร็จหลังจากแสดงข้อผิดพลาดนี้

คําจํากัดความที่บรรทัด 2823 ของไฟล์ camera3.h .

void* reserved[8]

คําจํากัดความที่บรรทัด 3080 ของไฟล์ camera3.h .


เอกสารประกอบสำหรับโครงสร้างนี้สร้างขึ้นจากไฟล์ต่อไปนี้