Tài liệu tham khảo về cấu trúc camera3_capture_result
#include <
camera3.h
>
Trường dữ liệu |
|
uint32_t | frame_number |
const camera_metadata_t * | kết quả |
uint32_t | num_output_buffers |
const camera3_stream_buffer_t * | output_buffers |
const camera3_stream_buffer_t * | input_buffer |
uint32_t | partial_result |
Nội dung mô tả chi tiết
camera3_capture_result_t:
Kết quả của một lần chụp/xử lý lại duy nhất do thiết bị HAL của máy ảnh thực hiện. Thông tin này được gửi đến khung không đồng bộ bằng process_capture_result(), để phản hồi một yêu cầu chụp duy nhất được gửi đến HAL bằng process_capture_request(). HAL có thể thực hiện nhiều lệnh gọi process_capture_result() cho mỗi yêu cầu.
Mỗi lệnh gọi, tất cả đều có cùng số khung, có thể chứa một số tập hợp con của vùng đệm đầu ra và/hoặc siêu dữ liệu kết quả. Bạn chỉ có thể cung cấp siêu dữ liệu một lần cho một số khung hình nhất định; tất cả các lệnh gọi khác phải đặt siêu dữ liệu kết quả thành NULL.
Cấu trúc kết quả chứa siêu dữ liệu đầu ra từ bản ghi này và tập hợp các vùng đệm đầu ra đã/sẽ được điền cho bản ghi này. Mỗi vùng đệm đầu ra có thể đi kèm với một hàng rào đồng bộ hoá bản phát hành mà khung sẽ chờ trước khi đọc, trong trường hợp vùng đệm chưa được HAL điền sẵn.
>= CAMERA_DEVICE_API_VERSION_3_2:
Bạn có thể cung cấp siêu dữ liệu nhiều lần cho một số khung hình. Khung này sẽ tích luỹ tập hợp kết quả cuối cùng bằng cách kết hợp từng kết quả riêng lẻ vào tập hợp kết quả tổng thể.
Nếu một vùng đệm đầu vào được cung cấp trong một yêu cầu, thì HAL phải trả về vùng đệm đó trong một trong các lệnh gọi process_capture_result và lệnh gọi có thể chỉ để trả về vùng đệm đầu vào mà không có siêu dữ liệu và vùng đệm đầu ra; các hàng rào đồng bộ hoá phải được xử lý giống như cách xử lý cho vùng đệm đầu ra.
Những điều cần cân nhắc về hiệu suất:
Các ứng dụng cũng sẽ nhận được kết quả một phần này ngay lập tức. Vì vậy, bạn nên gửi kết quả một phần để tối ưu hoá hiệu suất nhằm tránh tổng độ trễ của quy trình trước khi gửi kết quả cho những gì đã biết ngay từ đầu quy trình.
Một trường hợp sử dụng thông thường có thể là tính toán trạng thái AF ở giữa quy trình; bằng cách gửi trạng thái trở lại khung ngay lập tức, chúng ta có thể tăng hiệu suất thêm 50% và nhận thấy khả năng phản hồi của tính năng tự động lấy nét.
Tài liệu về trường
uint32_t frame_number |
Số khung là một số nguyên tăng dần do khung đặt trong yêu cầu đã gửi để xác định riêng ảnh chụp này. Mã này cũng được dùng để xác định yêu cầu trong thông báo không đồng bộ được gửi đến camera3_callback_ops_t.notify() .
const camera3_stream_buffer_t * input_buffer |
>= CAMERA_DEVICE_API_VERSION_3_2:
Tay cầm cho vùng đệm luồng đầu vào cho quá trình chụp này. Vùng đệm này có thể chưa được sử dụng tại thời điểm HAL gọi process_capture_result(); khung sẽ chờ các hàng rào đồng bộ hoá bản phát hành do HAL cung cấp trước khi sử dụng lại vùng đệm.
HAL sẽ xử lý các hàng rào đồng bộ hoá giống như cách xử lý cho output_buffers.
Mỗi yêu cầu chỉ được phép gửi một vùng đệm đầu vào. Tương tự như vùng đệm đầu ra, HAL phải duy trì thứ tự của vùng đệm đầu vào được trả về.
Những điều cần cân nhắc về hiệu suất:
Bộ đệm đầu vào phải được trả về càng sớm càng tốt. Nếu HAL hỗ trợ hàng rào đồng bộ hoá, thì HAL có thể gọi process_capture_result để trả về hàng rào đồng bộ hoá được đặt phù hợp. Nếu không hỗ trợ hàng rào đồng bộ hoá, bạn chỉ có thể trả về vùng đệm khi vùng đệm đó được sử dụng, điều này có thể mất nhiều thời gian; HAL có thể chọn sao chép vùng đệm đầu vào này để vùng đệm trả về sớm hơn.
uint32_t num_output_buffers |
Số lượng vùng đệm đầu ra được trả về trong cấu trúc kết quả này. Phải nhỏ hơn hoặc bằng số lượng của yêu cầu chụp trùng khớp. Nếu số lượng này ít hơn số lượng bộ đệm trong yêu cầu chụp, thì bạn phải thực hiện ít nhất một lệnh gọi khác đến process_capture_result với cùng một frame_number để trả về các bộ đệm đầu ra còn lại cho khung. Giá trị này chỉ có thể bằng 0 nếu cấu trúc bao gồm siêu dữ liệu kết quả hợp lệ hoặc bộ đệm đầu vào được trả về trong kết quả này.
const camera3_stream_buffer_t * output_buffers |
Các tay cầm cho vùng đệm luồng đầu ra cho quá trình chụp này. Các vùng đệm này có thể chưa được điền vào tại thời điểm HAL gọi process_capture_result(); khung sẽ đợi các hàng rào đồng bộ hoá bản phát hành do HAL cung cấp trước khi đọc các vùng đệm.
HAL phải đặt hàng rào đồng bộ hoá phát hành của bộ đệm luồng thành một fd đồng bộ hoá hợp lệ hoặc thành -1 nếu bộ đệm đã được lấp đầy.
Nếu HAL gặp lỗi trong khi xử lý vùng đệm và vùng đệm không được lấp đầy, thì bạn phải đặt trường trạng thái của vùng đệm thành CAMERA3_BUFFER_STATUS_ERROR. Nếu HAL không đợi hàng rào thu nạp trước khi gặp lỗi, thì hàng rào thu nạp phải được sao chép vào hàng rào phát hành để cho phép khung chờ hàng rào trước khi sử dụng lại vùng đệm.
Bạn phải đặt hàng rào thu nạp thành -1 cho tất cả vùng đệm đầu ra. Nếu num_output_buffers bằng 0, thì giá trị này có thể là NULL. Trong trường hợp đó, HAL phải thực hiện ít nhất một lệnh gọi process_capture_result khác để cung cấp vùng đệm đầu ra.
Khi process_capture_result được gọi bằng một bộ đệm mới cho một khung, tất cả bộ đệm của các khung trước đó cho luồng tương ứng đó phải đã được phân phối (không cần phải báo hiệu hàng rào).
>= CAMERA_DEVICE_API_VERSION_3_2:
Vùng đệm Gralloc cho một khung hình có thể được gửi đến khung trước khi có thông báo SHUTTER tương ứng.
Những điều cần cân nhắc về hiệu suất:
Các vùng đệm được phân phối đến khung sẽ không được gửi đến lớp ứng dụng cho đến khi nhận được dấu thời gian bắt đầu phơi sáng thông qua lệnh gọi SHUTTER notify(). Bạn nên gửi lệnh gọi đó càng sớm càng tốt.
uint32_t partial_result |
>= CAMERA_DEVICE_API_VERSION_3_2:
Để tận dụng kết quả một phần, HAL phải đặt siêu dữ liệu tĩnh android.request.partialResultCount thành số lượng kết quả một phần mà HAL sẽ gửi cho mỗi khung hình.
Mỗi kết quả chụp mới có kết quả một phần phải đặt trường này (partial_result) thành một giá trị bao gồm riêng biệt từ 1 đến android.request.partialResultCount.
Các HAL không muốn tận dụng tính năng này không được đặt android.request.partialResultCount hoặc partial_result thành một giá trị khác 1.
Bạn phải đặt giá trị này thành 0 khi kết quả chụp chỉ chứa vùng đệm và không có siêu dữ liệu.
const camera_metadata_t * result |
Siêu dữ liệu kết quả cho bản ghi này. Tệp này chứa thông tin về các tham số chụp cuối cùng, trạng thái của phần cứng chụp và xử lý hậu kỳ, trạng thái của thuật toán 3A (nếu được bật) và đầu ra của mọi đơn vị thống kê được bật.
Chỉ một lệnh gọi đến process_capture_result() với một frame_number nhất định mới có thể bao gồm siêu dữ liệu kết quả. Tất cả các lệnh gọi khác cho cùng một frame_number phải đặt giá trị này thành NULL.
Nếu xảy ra lỗi khi tạo siêu dữ liệu kết quả, thì kết quả phải là vùng đệm siêu dữ liệu trống và bạn phải gọi notify() bằng ERROR_RESULT.
>= CAMERA_DEVICE_API_VERSION_3_2:
Nhiều lệnh gọi đến process_capture_result() với một frame_number nhất định có thể bao gồm siêu dữ liệu kết quả.
Phần siêu dữ liệu được gửi không được chứa bất kỳ khoá siêu dữ liệu nào được trả về trong kết quả một phần trước đó cho một khung hình nhất định. Mỗi kết quả một phần mới cho khung đó cũng phải đặt một giá trị partial_result riêng biệt.
Nếu notify đã được gọi bằng ERROR_RESULT, thì khung sẽ bỏ qua tất cả các kết quả một phần khác cho khung đó.
Tài liệu cho cấu trúc này được tạo từ tệp sau:
- hardware/libhardware/include/hardware/ camera3.h