Tài liệu tham khảo về cấu trúc camera3_device_ops

Tài liệu tham khảo về cấu trúc camera3_device_ops

#include < camera3.h >

Trường dữ liệu

int(*  khởi động )(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]
 

Nội dung mô tả chi tiết

Định nghĩa tại dòng 2509 của tệp camera3.h .

Tài liệu về trường

int(* configure_streams)(const struct camera3_device *, camera3_stream_configuration_t *stream_list)

configure_streams:

Chỉ CAMERA_DEVICE_API_VERSION_3_0:

Đặt lại quy trình xử lý thiết bị máy ảnh HAL và thiết lập luồng đầu vào và đầu ra mới. Lệnh gọi này sẽ thay thế mọi cấu hình luồng hiện có bằng các luồng được xác định trong stream_list. Phương thức này sẽ được gọi ít nhất một lần sau khi initialize() trước khi gửi yêu cầu bằng process_capture_request() .

stream_list phải chứa ít nhất một luồng có khả năng đầu ra và không được chứa nhiều luồng có khả năng đầu vào.

stream_list có thể chứa các luồng cũng nằm trong nhóm luồng đang hoạt động (từ lệnh gọi trước đến configure_stream()). Các luồng này sẽ có giá trị hợp lệ cho mức sử dụng, max_buffers và con trỏ riêng tư.

Nếu luồng như vậy đã được đăng ký vùng đệm, thì register_stream_buffers() sẽ không được gọi lại cho luồng và vùng đệm từ luồng có thể được đưa vào yêu cầu đầu vào ngay lập tức.

Nếu cần thay đổi cấu hình luồng cho một luồng hiện có do cấu hình mới, thì HAL có thể ghi đè các giá trị của mức sử dụng và/hoặc max_buffers trong lệnh gọi định cấu hình.

Khung này sẽ phát hiện sự thay đổi như vậy, sau đó phân bổ lại vùng đệm luồng và gọi lại register_stream_buffers() trước khi sử dụng vùng đệm từ luồng đó trong một yêu cầu.

Nếu một luồng đang hoạt động không có trong stream_list, thì HAL có thể xoá mọi tệp tham chiếu đến luồng đó một cách an toàn. Khung sẽ không sử dụng lại trong lệnh gọi configure() sau này và tất cả các vùng đệm gralloc cho lệnh gọi đó sẽ được giải phóng sau khi lệnh gọi configure_streams() trả về.

Cấu trúc stream_list thuộc quyền sở hữu của khung và có thể không truy cập được sau khi lệnh gọi này hoàn tất. Địa chỉ của một cấu trúc camera3_stream_t riêng lẻ sẽ vẫn hợp lệ để HAL truy cập cho đến khi kết thúc lệnh gọi configure_stream() đầu tiên không còn bao gồm camera3_stream_t đó trong đối số stream_list. HAL không được thay đổi các giá trị trong cấu trúc luồng bên ngoài con trỏ riêng tư, ngoại trừ các thành phần sử dụng và max_buffers trong lệnh gọi configure_streams() .

Nếu luồng là mới, các trường usage, max_buffer và con trỏ riêng tư của cấu trúc luồng sẽ đều được đặt thành 0. Thiết bị HAL phải đặt các trường này trước khi lệnh gọi configure_streams() trả về. Sau đó, khung và mô-đun gralloc của nền tảng sẽ sử dụng các trường này để phân bổ vùng đệm gralloc cho từng luồng.

Trước khi luồng mới như vậy có thể đưa vùng đệm vào yêu cầu chụp, khung sẽ gọi register_stream_buffers() với luồng đó. Tuy nhiên, khung này không bắt buộc phải đăng ký vùng đệm cho tất cả luồng trước khi gửi yêu cầu. Điều này cho phép khởi động nhanh (ví dụ:) luồng xem trước, với việc phân bổ cho các luồng khác diễn ra sau hoặc đồng thời.


Chỉ CAMERA_DEVICE_API_VERSION_3_1:

Đặt lại quy trình xử lý thiết bị máy ảnh HAL và thiết lập luồng đầu vào và đầu ra mới. Lệnh gọi này sẽ thay thế mọi cấu hình luồng hiện có bằng các luồng được xác định trong stream_list. Phương thức này sẽ được gọi ít nhất một lần sau khi initialize() trước khi gửi yêu cầu bằng process_capture_request() .

stream_list phải chứa ít nhất một luồng có khả năng đầu ra và không được chứa nhiều luồng có khả năng đầu vào.

stream_list có thể chứa các luồng cũng nằm trong nhóm luồng đang hoạt động (từ lệnh gọi trước đến configure_stream()). Các luồng này sẽ có các giá trị hợp lệ cho mức sử dụng, max_buffers và con trỏ riêng tư.

Nếu luồng như vậy đã được đăng ký vùng đệm, thì register_stream_buffers() sẽ không được gọi lại cho luồng và vùng đệm từ luồng có thể được đưa vào yêu cầu đầu vào ngay lập tức.

Nếu cần thay đổi cấu hình luồng cho một luồng hiện có do cấu hình mới, thì HAL có thể ghi đè các giá trị của mức sử dụng và/hoặc max_buffers trong lệnh gọi định cấu hình.

Khung này sẽ phát hiện sự thay đổi như vậy, sau đó phân bổ lại vùng đệm luồng và gọi lại register_stream_buffers() trước khi sử dụng vùng đệm từ luồng đó trong một yêu cầu.

Nếu một luồng đang hoạt động không có trong stream_list, thì HAL có thể xoá mọi tệp tham chiếu đến luồng đó một cách an toàn. Khung sẽ không sử dụng lại trong lệnh gọi configure() sau này và tất cả các vùng đệm gralloc cho lệnh gọi đó sẽ được giải phóng sau khi lệnh gọi configure_streams() trả về.

Cấu trúc stream_list thuộc quyền sở hữu của khung và có thể không truy cập được sau khi lệnh gọi này hoàn tất. Địa chỉ của một cấu trúc camera3_stream_t riêng lẻ sẽ vẫn hợp lệ để HAL truy cập cho đến khi kết thúc lệnh gọi configure_stream() đầu tiên không còn bao gồm camera3_stream_t đó trong đối số stream_list. HAL không được thay đổi các giá trị trong cấu trúc luồng bên ngoài con trỏ riêng tư, ngoại trừ các thành phần sử dụng và max_buffers trong lệnh gọi configure_streams() .

Nếu luồng là mới, các trường max_buffer và con trỏ riêng tư của cấu trúc luồng sẽ được đặt thành 0. Mức sử dụng sẽ được đặt thành cờ sử dụng của người dùng. Thiết bị HAL phải đặt các trường này trước khi lệnh gọi configure_streams() trả về. Sau đó, khung và mô-đun gralloc của nền tảng sẽ sử dụng các trường này để phân bổ vùng đệm gralloc cho từng luồng.

Trước khi luồng mới như vậy có thể đưa vùng đệm vào yêu cầu chụp, khung sẽ gọi register_stream_buffers() với luồng đó. Tuy nhiên, khung này không bắt buộc phải đăng ký vùng đệm cho tất cả luồng trước khi gửi yêu cầu. Điều này cho phép khởi động nhanh (ví dụ:) luồng xem trước, với việc phân bổ cho các luồng khác diễn ra sau hoặc đồng thời.


>= CAMERA_DEVICE_API_VERSION_3_2:

Đặt lại quy trình xử lý thiết bị máy ảnh HAL và thiết lập luồng đầu vào và đầu ra mới. Lệnh gọi này sẽ thay thế mọi cấu hình luồng hiện có bằng các luồng được xác định trong stream_list. Phương thức này sẽ được gọi ít nhất một lần sau khi initialize() trước khi gửi yêu cầu bằng process_capture_request() .

stream_list phải chứa ít nhất một luồng có khả năng đầu ra và không được chứa nhiều luồng có khả năng đầu vào.

stream_list có thể chứa các luồng cũng nằm trong nhóm luồng đang hoạt động (từ lệnh gọi trước đến configure_stream()). Các luồng này sẽ có các giá trị hợp lệ cho mức sử dụng, max_buffers và con trỏ riêng tư.

Nếu cần thay đổi cấu hình luồng cho một luồng hiện có do cấu hình mới, HAL có thể ghi đè các giá trị của mức sử dụng và/hoặc max_buffers trong lệnh gọi định cấu hình.

Khung này sẽ phát hiện sự thay đổi như vậy và sau đó có thể phân bổ lại vùng đệm luồng trước khi sử dụng vùng đệm từ luồng đó trong một yêu cầu.

Nếu một luồng đang hoạt động không có trong stream_list, thì HAL có thể xoá mọi tệp tham chiếu đến luồng đó một cách an toàn. Khung sẽ không sử dụng lại trong lệnh gọi configure() sau này và tất cả các vùng đệm gralloc cho lệnh gọi đó sẽ được giải phóng sau khi lệnh gọi configure_streams() trả về.

Cấu trúc stream_list thuộc quyền sở hữu của khung và có thể không truy cập được sau khi lệnh gọi này hoàn tất. Địa chỉ của một cấu trúc camera3_stream_t riêng lẻ sẽ vẫn hợp lệ để HAL truy cập cho đến khi kết thúc lệnh gọi configure_stream() đầu tiên không còn bao gồm camera3_stream_t đó trong đối số stream_list. HAL không được thay đổi các giá trị trong cấu trúc luồng bên ngoài con trỏ riêng tư, ngoại trừ các thành phần sử dụng và max_buffers trong lệnh gọi configure_streams() .

Nếu luồng là mới, các trường max_buffer và con trỏ riêng tư của cấu trúc luồng sẽ được đặt thành 0. Mức sử dụng sẽ được đặt thành cờ sử dụng của người dùng. Thiết bị HAL phải đặt các trường này trước khi lệnh gọi configure_streams() trả về. Sau đó, khung và mô-đun gralloc của nền tảng sẽ sử dụng các trường này để phân bổ vùng đệm gralloc cho từng luồng.

Khung có thể đưa vùng đệm được phân bổ mới vào yêu cầu chụp bất cứ lúc nào. Sau khi một vùng đệm gralloc được trả về khung bằng process_capture_result (và release_fence tương ứng đã được báo hiệu), khung có thể giải phóng hoặc sử dụng lại vùng đệm đó bất cứ lúc nào.


Điều kiện tiên quyết:

Khung này sẽ chỉ gọi phương thức này khi không có bản ghi nào đang được xử lý. Tức là tất cả kết quả đã được trả về khung, tất cả vùng đệm đầu vào và đầu ra đang diễn ra đã được trả về và hàng rào đồng bộ hoá bản phát hành của chúng đã được HAL báo hiệu. Khung này sẽ không gửi yêu cầu mới để ghi lại trong khi lệnh gọi configure_streams() đang diễn ra.

Điều kiện sau:

Thiết bị HAL phải tự định cấu hình để cung cấp tốc độ khung hình đầu ra tối đa có thể, dựa trên kích thước và định dạng của luồng đầu ra, như được ghi lại trong siêu dữ liệu tĩnh của thiết bị máy ảnh.

Yêu cầu về hiệu suất:

Lệnh gọi này dự kiến sẽ có trọng tải lớn và có thể mất vài trăm mili giây để hoàn tất, vì có thể cần đặt lại và định cấu hình lại cảm biến hình ảnh cũng như quy trình xử lý máy ảnh. Tuy nhiên, thiết bị HAL phải cố gắng giảm thiểu độ trễ định cấu hình lại để giảm thiểu thời gian tạm dừng mà người dùng nhìn thấy trong quá trình thay đổi chế độ hoạt động của ứng dụng (chẳng hạn như chuyển từ chụp ảnh tĩnh sang quay video).

HAL sẽ trả về từ lệnh gọi này trong 500 mili giây và phải trả về từ lệnh gọi này trong 1000 mili giây.

Giá trị trả về:

0: Khi định cấu hình luồng thành công

-EINVAL: Nếu cấu hình luồng được yêu cầu không hợp lệ. Sau đây là một số ví dụ về cấu hình luồng không hợp lệ:

  • Bao gồm nhiều luồng có khả năng nhập (INPUT hoặc BIDIRECTIONAL)
  • Không bao gồm bất kỳ luồng nào có khả năng đầu ra (OUTPUT hoặc BIDIRECTIONAL)
  • Bao gồm các luồng có định dạng không được hỗ trợ hoặc kích thước không được hỗ trợ cho định dạng đó.
  • Bao gồm quá nhiều luồng đầu ra của một định dạng nhất định.
  • Cấu hình xoay không được hỗ trợ (chỉ áp dụng cho các thiết bị có phiên bản >= CAMERA_DEVICE_API_VERSION_3_3)
  • Kích thước/định dạng luồng không đáp ứng các yêu cầu của camera3_stream_configuration_t->operation_mode đối với chế độ KHÔNG PHỔ THÔNG hoặc HAL không hỗ trợ operation_mode đã yêu cầu. (chỉ áp dụng cho các thiết bị có phiên bản >= CAMERA_DEVICE_API_VERSION_3_3)

Xin lưu ý rằng việc khung gửi cấu hình luồng không hợp lệ không phải là hoạt động bình thường, vì cấu hình luồng được kiểm tra trước khi định cấu hình. Cấu hình không hợp lệ có nghĩa là có lỗi trong mã khung hoặc có sự không khớp giữa siêu dữ liệu tĩnh của HAL và các yêu cầu đối với luồng.

-ENODEV: Nếu đã xảy ra lỗi nghiêm trọng và thiết bị không còn hoạt động. Khung chỉ có thể gọi thành công close() sau khi lỗi này được trả về.

Định nghĩa tại dòng 2769 của tệp camera3.h .

const camera_metadata_t *(* construct_default_request_settings)(const struct camera3_device *, int type)

construct_default_request_settings:

Tạo chế độ cài đặt chụp cho các trường hợp sử dụng máy ảnh tiêu chuẩn.

Thiết bị phải trả về một vùng đệm cài đặt được định cấu hình để đáp ứng trường hợp sử dụng được yêu cầu, vùng đệm này phải là một trong các enum CAMERA3_TEMPLATE_* Bạn phải đưa vào tất cả các trường kiểm soát yêu cầu.

HAL giữ lại quyền sở hữu cấu trúc này, nhưng con trỏ đến cấu trúc phải hợp lệ cho đến khi thiết bị đóng. Khung và HAL không được sửa đổi vùng đệm sau khi lệnh gọi này trả về vùng đệm. Hệ thống có thể trả về cùng một vùng đệm cho các lệnh gọi tiếp theo cho cùng một mẫu hoặc cho các mẫu khác.

Yêu cầu về hiệu suất:

Đây phải là lệnh gọi không chặn. HAL phải trả về từ lệnh gọi này trong 1 mili giây và phải trả về từ lệnh gọi này trong 5 mili giây.

Giá trị trả về:

Siêu dữ liệu hợp lệ: Khi tạo thành công vùng đệm cài đặt mặc định.

NULL: Trong trường hợp xảy ra lỗi nghiêm trọng. Sau khi giá trị này được trả về, khung chỉ có thể gọi thành công phương thức close().

Định nghĩa tại dòng 2859 của tệp camera3.h .

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

tệp kết xuất:

In trạng thái gỡ lỗi cho thiết bị máy ảnh. Khung này sẽ gọi phương thức này khi yêu cầu dịch vụ máy ảnh tạo tệp báo lỗi gỡ lỗi. Điều này xảy ra khi sử dụng công cụ dumpsys hoặc khi chụp báo cáo lỗi.

Bạn có thể dùng chỉ số mô tả tệp được truyền vào để ghi văn bản gỡ lỗi bằng dprintf() hoặc write(). Văn bản chỉ được mã hoá theo ASCII.

Yêu cầu về hiệu suất:

Đây phải là lệnh gọi không chặn. HAL phải trả về từ lệnh gọi này trong 1 mili giây, phải trả về từ lệnh gọi này trong 10 mili giây. Lệnh gọi này phải tránh tình trạng tắc nghẽn, vì lệnh gọi này có thể được gọi tại bất kỳ thời điểm nào trong quá trình hoạt động của máy ảnh. Mọi dữ liệu gốc đồng bộ hoá được sử dụng (chẳng hạn như khoá mutex hoặc semaphore) đều phải được lấy với thời gian chờ.

Định nghĩa tại dòng 2971 của tệp camera3.h .

int(* flush)(const struct camera3_device *)

flush:

Xoá tất cả các ảnh chụp đang trong quá trình xử lý và tất cả vùng đệm trong quy trình trên thiết bị đã cho. Khung này sẽ sử dụng thông tin này để kết xuất tất cả trạng thái nhanh nhất có thể để chuẩn bị cho lệnh gọi configure_streams() .

Không yêu cầu phải trả về vùng đệm nào, vì vậy, mọi vùng đệm được giữ lại tại thời điểm flush() (dù đã được lấp đầy thành công hay chưa) đều có thể được trả về bằng CAMERA3_BUFFER_STATUS_ERROR. Lưu ý rằng HAL vẫn được phép trả về các vùng đệm hợp lệ (CAMERA3_BUFFER_STATUS_OK) trong lệnh gọi này, miễn là các vùng đệm đó được điền đầy đủ.

Tất cả các yêu cầu hiện có trong HAL dự kiến sẽ được trả về trong thời gian sớm nhất có thể. Các yêu cầu không đang xử lý phải trả về lỗi ngay lập tức. Bạn nên dừng mọi khối phần cứng có thể gián đoạn và chờ mọi khối không thể gián đoạn.

Bạn có thể gọi đồng thời flush() với process_capture_request() , với kỳ vọng rằng process_capture_request sẽ trả về nhanh chóng và yêu cầu được gửi trong lệnh gọi process_capture_request đó sẽ được xử lý như tất cả các yêu cầu đang diễn ra khác. Do các vấn đề về đồng thời, có thể theo quan điểm của HAL, lệnh gọi process_capture_request() có thể được bắt đầu sau khi lệnh flush được gọi nhưng chưa trả về. Nếu lệnh gọi như vậy xảy ra trước khi flush() trả về, HAL sẽ coi yêu cầu chụp mới giống như các yêu cầu đang chờ xử lý khác (xem #4 bên dưới).

Cụ thể hơn, HAL phải tuân theo các yêu cầu dưới đây cho nhiều trường hợp:

  1. Đối với các ảnh chụp quá muộn để HAL huỷ/dừng và sẽ được HAL hoàn tất như bình thường; tức là HAL có thể gửi màn trập/thông báo và process_capture_result và vùng đệm như bình thường.
  2. Đối với các yêu cầu đang chờ xử lý chưa được xử lý, HAL phải gọi thông báo CAMERA3_MSG_ERROR_REQUEST và trả về tất cả vùng đệm đầu ra có process_capture_result ở trạng thái lỗi (CAMERA3_BUFFER_STATUS_ERROR). HAL không được đặt hàng rào phát hành vào trạng thái lỗi, thay vào đó, hàng rào phát hành phải được đặt thành hàng rào thu nạp do khung truyền hoặc -1 nếu HAL đã chờ các hàng rào đó. Đây cũng là đường dẫn cần tuân theo cho mọi ảnh chụp mà HAL đã gọi notify() bằng CAMERA3_MSG_SHUTTER nhưng sẽ không tạo siêu dữ liệu/vùng đệm hợp lệ nào cho ảnh chụp đó. Sau CAMERA3_MSG_ERROR_REQUEST, đối với một khung hình nhất định, chỉ process_capture_results có vùng đệm trong CAMERA3_BUFFER_STATUS_ERROR mới được phép. Không được phép gửi thêm thông báo hoặc process_capture_result có siêu dữ liệu khác rỗng.
  3. Đối với các yêu cầu đang chờ xử lý chưa hoàn tất một phần sẽ không có tất cả vùng đệm đầu ra hoặc có thể thiếu siêu dữ liệu, HAL phải tuân theo các bước sau:

    3.1. Gọi thông báo bằng CAMERA3_MSG_ERROR_RESULT nếu một số siêu dữ liệu kết quả dự kiến (tức là một hoặc nhiều siêu dữ liệu một phần) sẽ không có sẵn cho quá trình chụp.

    3.2. Gọi thông báo bằng CAMERA3_MSG_ERROR_BUFFER cho mọi vùng đệm sẽ không được tạo cho quá trình chụp.

    3.3 Gọi thông báo bằng CAMERA3_MSG_SHUTTER với dấu thời gian chụp trước khi bất kỳ vùng đệm/siêu dữ liệu nào được trả về bằng process_capture_result.

    3.4 Đối với các ảnh chụp sẽ tạo ra một số kết quả, HAL không được gọi CAMERA3_MSG_ERROR_REQUEST, vì điều đó cho biết lỗi hoàn toàn.

    3.5. Các vùng đệm/siêu dữ liệu hợp lệ phải được truyền vào khung như bình thường.

    3.6. Các vùng đệm không thành công phải được trả về khung như mô tả cho trường hợp 2. Tuy nhiên, các vùng đệm không thành công không nhất thiết phải tuân theo thứ tự nghiêm ngặt như các vùng đệm hợp lệ và có thể không theo thứ tự so với các vùng đệm hợp lệ. Ví dụ: nếu các vùng đệm A, B, C, D, E được gửi, D và E không thành công, thì A, E, B, D, C là thứ tự trả về được chấp nhận.

    3.7. Đối với siêu dữ liệu bị thiếu hoàn toàn, bạn chỉ cần gọi CAMERA3_MSG_ERROR_RESULT, không cần gọi process_capture_result bằng siêu dữ liệu NULL hoặc tương đương.

  4. Nếu lệnh gọi flush() được gọi trong khi lệnh gọi process_capture_request() đang hoạt động, thì lệnh gọi quy trình đó sẽ trả về sớm nhất có thể. Ngoài ra, nếu lệnh gọi process_capture_request() được thực hiện sau khi lệnh gọi flush() được gọi nhưng trước khi lệnh gọi flush() trả về, thì yêu cầu chụp do lệnh gọi process_capture_request muộn cung cấp sẽ được coi là yêu cầu đang chờ xử lý trong trường hợp #2 ở trên.

flush() chỉ nên trả về khi không còn vùng đệm hoặc yêu cầu nào còn tồn đọng trong HAL. Khung này có thể gọi configure_streams (vì trạng thái HAL hiện đang ở trạng thái yên tĩnh) hoặc có thể đưa ra các yêu cầu mới.

Xin lưu ý rằng bạn chỉ cần hỗ trợ các trường hợp kết quả hoàn toàn thành công và hoàn toàn không thành công. Tuy nhiên, bạn cũng nên hỗ trợ các trường hợp thất bại một phần vì điều này có thể giúp cải thiện hiệu suất tổng thể của lệnh gọi xả.

Yêu cầu về hiệu suất:

HAL sẽ trả về từ lệnh gọi này trong 100 mili giây và phải trả về từ lệnh gọi này trong 1000 mili giây. Ngoài ra, lệnh gọi này không được bị chặn lâu hơn độ trễ của quy trình (xem S7 để biết định nghĩa).

Thông tin phiên bản:

chỉ có nếu phiên bản thiết bị >= CAMERA_DEVICE_API_VERSION_3_1.

Giá trị trả về:

0: Khi đã thực hiện thành công việc xả HAL máy ảnh.

-EINVAL: Nếu dữ liệu đầu vào có định dạng không hợp lệ (thiết bị không hợp lệ).

-ENODEV: Nếu thiết bị máy ảnh gặp lỗi nghiêm trọng. Sau khi lỗi này được trả về, khung chỉ có thể gọi thành công phương thức close().

Định nghĩa tại dòng 3077 của tệp camera3.h .

void(* get_metadata_vendor_tag_ops)(const struct camera3_device *, vendor_tag_query_ops_t *ops)

get_metadata_vendor_tag_ops:

Nhận các phương thức để truy vấn thông tin thẻ siêu dữ liệu của tiện ích của nhà cung cấp. HAL phải điền vào tất cả các phương thức thao tác thẻ nhà cung cấp hoặc để các thao tác không thay đổi nếu không có thẻ nhà cung cấp nào được xác định.

Bạn có thể tìm thấy định nghĩa của vendor_tag_query_ops_t trong system/media/camera/include/system/camera_metadata.h.

>= CAMERA_DEVICE_API_VERSION_3_2: ĐÃ Ngừng sử dụng. Hàm này không còn được dùng nữa và phải được HAL đặt thành NULL. Thay vào đó, vui lòng triển khai get_vendor_tag_ops trong camera_common.h .

Định nghĩa tại dòng 2950 của tệp camera3.h .

int(* initialize)(const struct camera3_device *, const camera3_callback_ops_t *callback_ops)

khởi động:

Khởi chạy một lần để truyền con trỏ hàm gọi lại khung đến HAL. Sẽ được gọi một lần sau khi lệnh gọi open() thành công, trước khi bất kỳ hàm nào khác được gọi trên cấu trúc camera3_device_ops .

Yêu cầu về hiệu suất:

Đây phải là lệnh gọi không chặn. HAL phải trả về từ lệnh gọi này trong 5 mili giây và phải trả về từ lệnh gọi này trong 10 mili giây.

Giá trị trả về:

0: Khi khởi chạy thành công

-ENODEV: Nếu không khởi động được. Sau đó, khung chỉ có thể gọi thành công close().

Định nghĩa tại dòng 2530 của tệp camera3.h .

int(* process_capture_request)(const struct camera3_device *, camera3_capture_request_t *request)

process_capture_request:

Gửi yêu cầu chụp mới đến HAL. HAL không được trả về từ lệnh gọi này cho đến khi sẵn sàng chấp nhận yêu cầu tiếp theo để xử lý. Khung này chỉ thực hiện một lệnh gọi đến process_capture_request() tại một thời điểm và tất cả các lệnh gọi đều từ cùng một luồng. Lệnh gọi tiếp theo đến process_capture_request() sẽ được thực hiện ngay khi có yêu cầu mới và vùng đệm liên kết với yêu cầu đó. Trong trường hợp xem trước thông thường, điều này có nghĩa là khung sẽ gọi lại hàm gần như ngay lập tức.

Quá trình xử lý yêu cầu thực tế là không đồng bộ, với kết quả chụp được HAL trả về thông qua lệnh gọi process_capture_result(). Lệnh gọi này yêu cầu siêu dữ liệu kết quả phải có sẵn, nhưng vùng đệm đầu ra có thể chỉ cung cấp hàng rào đồng bộ hoá để chờ. Nhiều yêu cầu dự kiến sẽ được thực hiện cùng một lúc để duy trì tốc độ khung hình đầu ra đầy đủ.

Khung này giữ lại quyền sở hữu cấu trúc yêu cầu. Giá trị này chỉ được đảm bảo hợp lệ trong lệnh gọi này. Thiết bị HAL phải tạo bản sao của thông tin cần giữ lại để xử lý quá trình chụp. HAL chịu trách nhiệm chờ và đóng hàng rào của bộ đệm, đồng thời trả về các tay điều khiển bộ đệm cho khung.

HAL phải ghi chỉ số mô tả tệp cho hàng rào đồng bộ hoá phát hành của vùng đệm đầu vào vào input_buffer->release_fence, nếu input_buffer không phải là NULL. Nếu HAL trả về -1 cho hàng rào đồng bộ hoá phát hành bộ đệm đầu vào, thì khung này có thể tự do sử dụng lại bộ đệm đầu vào ngay lập tức. Nếu không, khung sẽ đợi hàng rào đồng bộ hoá trước khi nạp lại và sử dụng lại vùng đệm đầu vào.

>= CAMERA_DEVICE_API_VERSION_3_2:

Vùng đệm đầu vào/đầu ra do khung cung cấp trong mỗi yêu cầu có thể hoàn toàn mới (HAL chưa từng thấy).


Những điều cần cân nhắc về hiệu suất:

Việc xử lý bộ đệm mới phải cực kỳ nhẹ và không được làm giảm tốc độ khung hình hoặc gây hiện tượng giật khung hình.

Lệnh gọi này phải trả về đủ nhanh để đảm bảo có thể duy trì tốc độ khung hình được yêu cầu, đặc biệt là đối với các trường hợp truyền trực tuyến (chế độ cài đặt chất lượng xử lý hậu kỳ được đặt thành NHANH). HAL phải trả về lệnh gọi này trong khoảng thời gian 1 khung hình và phải trả về từ lệnh gọi này trong khoảng thời gian 4 khung hình.

Giá trị trả về:

0: Đã bắt đầu xử lý thành công yêu cầu chụp

-EINVAL: Nếu dữ liệu đầu vào có định dạng không chính xác (chế độ cài đặt là NULL khi không được phép, không có vùng đệm đầu ra, v.v.) và không thể bắt đầu xử lý quá trình chụp. Bạn nên xử lý các lỗi trong quá trình xử lý yêu cầu bằng cách gọi camera3_callback_ops_t.notify() . Trong trường hợp xảy ra lỗi này, khung sẽ giữ lại trách nhiệm đối với hàng rào của bộ đệm luồng và tay điều khiển bộ đệm; HAL không được đóng hàng rào hoặc trả về các bộ đệm này bằng process_capture_result.

-ENODEV: Nếu thiết bị máy ảnh gặp lỗi nghiêm trọng. Sau khi lỗi này được trả về, khung chỉ có thể gọi thành công phương thức close().

Định nghĩa tại dòng 2928 của tệp 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:

ĐÃ NGỪNG SỬ DỤNG. Phương thức này sẽ không được gọi và phải được đặt thành NULL.

<= CAMERA_DEVICE_API_VERSION_3_1:

Đăng ký vùng đệm cho một luồng nhất định bằng thiết bị HAL. Phương thức này được khung gọi sau khi một luồng mới được xác định bằng configure_streams và trước khi các vùng đệm từ luồng đó được đưa vào yêu cầu chụp. Nếu cùng một luồng được liệt kê trong lệnh gọi configure_streams() tiếp theo, thì register_stream_buffers sẽ không được gọi lại cho luồng đó.

Khung này không cần đăng ký vùng đệm cho tất cả các luồng đã định cấu hình trước khi gửi yêu cầu chụp đầu tiên. Điều này cho phép khởi động nhanh để xem trước (hoặc các trường hợp sử dụng tương tự) trong khi các luồng khác vẫn đang được phân bổ.

Phương thức này nhằm cho phép thiết bị HAL liên kết hoặc chuẩn bị vùng đệm để sử dụng sau này. Các vùng đệm được truyền vào sẽ được khoá để sử dụng. Khi kết thúc lệnh gọi, tất cả vùng đệm phải sẵn sàng được trả về luồng. Đối số buffer_set chỉ hợp lệ trong thời gian của lệnh gọi này.

Nếu định dạng luồng được đặt thành HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, thì HAL máy ảnh sẽ kiểm tra các vùng đệm đã truyền vào đây để xác định mọi thông tin về định dạng pixel riêng của nền tảng.

Yêu cầu về hiệu suất:

Đây phải là lệnh gọi không chặn. HAL phải trả về từ lệnh gọi này trong 1 mili giây và phải trả về từ lệnh gọi này trong 5 mili giây.

Giá trị trả về:

0: Khi đăng ký thành công vùng đệm luồng mới

-EINVAL: Nếu stream_buffer_set không tham chiếu đến một luồng đang hoạt động hợp lệ hoặc nếu mảng vùng đệm không hợp lệ.

-ENOMEM: Nếu xảy ra lỗi khi đăng ký vùng đệm. Khung này phải xem xét tất cả vùng đệm luồng chưa được đăng ký và có thể thử đăng ký lại sau.

-ENODEV: Nếu xảy ra lỗi nghiêm trọng và thiết bị không còn hoạt động. Khung chỉ có thể gọi thành công close() sau khi lỗi này được trả về.

Định nghĩa tại dòng 2823 của tệp camera3.h .

void* reserved[8]

Định nghĩa tại dòng 3080 của tệp camera3.h .


Tài liệu cho cấu trúc này được tạo từ tệp sau: