Siêu dữ liệu của khung hình

Siêu dữ liệu khung được ra mắt trong Android 11 dưới dạng một thành phần của dữ liệu BufferDesc cấu trúc. Trường mới này được khai báo là vec<uint8_t> để chứa cả trường định dạng dữ liệu do khách hàng xác định và không rõ ràng đối với người quản lý EVS.

struct BufferDesc {
    /**
     * HIDL counterpart of AHardwareBuffer_Desc. Please see
     * hardware/interfaces/graphics/common/1.2/types.hal for more details.
     */
    HardwareBuffer buffer;
    ...

    /**
     * Time that this buffer is being filled.
     */
    int64_t timestamp;

    /**
     * Frame metadata field. This is opaque to EVS manager.
     */
    vec<uint8_t> metadata;
};

HIDL vec<T> biểu thị các mảng có kích thước động bằng dữ liệu được lưu trữ trong một bộ đệm riêng. Những trường hợp như vậy được biểu thị bằng một thực thể của vec<T> theo cấu trúc, điều đó có nghĩa là việc triển khai trình điều khiển HAL EVS Camera sở hữu siêu dữ liệu này và sẽ dọn dẹp nó lên đúng cách. Có hai cách để điền siêu dữ liệu:

  • Đổi kích thước vùng chứa và điền dữ liệu bằng cách sử dụng operator[]
        struct BufferDesc desc = {};
        ...
        desc.metadata.resize(10);
        for (auto i = 0; i < 10; ++i) {
            desc.metadata[i] = frameInfo[i];
        }
        ...
        
  • Sử dụng setToExternal() để tạo vec<T> trỏ đến cấu trúc dữ liệu tuỳ chỉnh.
    struct BufferDesc desc = {};
    struct FrameMetadata metadata = {
       ...
    }; // this is in vendor-defined format.
    
    desc.metadata.setToExternal(&metadata, sizeof(metadata)); ...