/* * Copyright (c) XMEDIA. All rights reserved. */ #ifndef XMEDIA_VB_H #define XMEDIA_VB_H #include "xmedia_type.h" #include "xmedia_video_common.h" #include "defines.h" #ifdef __cplusplus extern "C" { #endif #define VB_INVALID_BLKID (-1U) #define VB_INVALID_POOLID (-1U) #define VB_INVALID_HANDLE (-1U) #define XMEDIA_VB_MAX_COMM_POOLS 16 #define XMEDIA_VB_SUPPLEMENT_ISP_INFO_ENABLE 1 #define XMEDIA_VB_SUPPLEMENT_VDEC_INFO_ENABLE (1 << 1) typedef enum { XMEDIA_VB_MAP_MODE_NONE = 0, /* no map */ XMEDIA_VB_MAP_MODE_NOCACHE = 1, /* no cache map */ XMEDIA_VB_MAP_MODE_CACHED = 2, /* cached map, if you use this mode, you should flush cache by yourself */ XMEDIA_VB_MAP_MODE_MAX } xmedia_vb_map_mode; typedef struct { xmedia_u32 block_size; xmedia_u32 block_cnt; xmedia_vb_map_mode map_mode; xmedia_char mmz_name[MAX_MMZ_NAME_LEN]; } xmedia_vb_pool_config; typedef struct { /* * supplement_config:bit[0] 和bit[1]有效,其余为非法值。 * bit[0]: 1表示打开ISP的内存申请开关,0表示关闭; * bit[1]: 1表示打开VDEC的内存申请开关,0表示关闭。 */ xmedia_u32 supplement_config; xmedia_u32 max_pool_cnt; xmedia_vb_pool_config common_pool[XMEDIA_VB_MAX_COMM_POOLS]; } xmedia_vb_config; /* * 函数功能:VB模块初始化以及公共内存池初始化 * 函数参数: * config - 输入参数,补充内存池、公共内存池的配置信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_INVALID_PARAM - 非法参数 * XMEDIA_ERRCODE_BUSY - 资源忙,已执行初始化 * XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 创建公共内存池失败 * 注意: * config->max_pool_cnt可以不配置 */ xmedia_s32 xmedia_vb_init(const xmedia_vb_config *config); /* * 函数功能:VB模块去初始化以及公共内存池去初始化 * 函数参数: * 无 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_BUSY - 还有vb未被释放,不能去初始化 */ xmedia_s32 xmedia_vb_exit(xmedia_void); /* * 函数功能:打开/关闭强制销毁vb功能 * 函数参数: * enable - 输入参数,打开或关闭强制销毁vb功能 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_vb_enable_force_destroy(xmedia_bool enable); /* * 函数功能:获取公共内存池、补充内存池属性 * 函数参数: * config - 输出参数,公共内存池配置信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NOT_READY - 没有配置公共内存池,未初始化 */ xmedia_s32 xmedia_vb_get_config(xmedia_vb_config *config); /* * 函数功能:创建模块私有内存池 * 函数参数: * pool_config - 输入参数,模块私有配置信息 * 返回值: * (-1U) - 无效pool_Id,函数执行失败 * others - 新建的内存池ID * 注意: * 需要先完成初始化,xmedia_vb_init,才能创建私有内存池 */ xmedia_u32 xmedia_vb_create_pool(xmedia_vb_pool_config *pool_config); /* * 函数功能:销毁指定pool_id的内存池资源 * 函数参数: * pool_id - 输入参数,需要销毁的内存池ID * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NOT_READY - VB没有初始化 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NOT_EXIST - 尝试销毁不存在的内存池 * XMEDIA_ERRCODE_NOT_PERMITTED - 非法操作,尝试销毁内核态申请的私有内存池或者VB还有模块在使用 */ xmedia_s32 xmedia_vb_destroy_pool(xmedia_u32 pool_id); /* * 函数功能:根据内存池ID或size获取内存块handle * 函数参数: * pool_id - 输入参数,需要申请的内存池ID * blk_size - 输入参数,需要申请的内存块大小 * mmz_name - 输入参数,内存块所属的mmz zone名称,在根据size申请内存块时需要设置 * 返回值: * (-1U) - 无效handle,函数执行失败 * others - 内存块handle * 注意: * 如果pool_id为非法值(-1U),则从公共内存池根据blk_size获取内存块 */ xmedia_handle xmedia_vb_get_block(xmedia_u32 pool_id, xmedia_u32 blk_size, xmedia_char *mmz_name); /* * 函数功能:根据handle释放内存块到free链表 * 函数参数: * handle - 输入参数,需要释放的内存块handle * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NOT_READY - VB没有初始化 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NOT_EXIST - 尝试释放不存在的内存块 */ xmedia_s32 xmedia_vb_release_block(xmedia_handle handle); /* * 函数功能:根据物理地址获取对应内存块handle * 函数参数: * phy_addr - 输入参数,目标内存的物理地址 * 返回值: * (-1U) - 无效handle,函数执行失败 * others - 内存块handle * 注意: * 找到的内存块的地址范围包含目标物理地址 */ xmedia_handle xmedia_vb_phy_addr_to_handle(xmedia_u64 phy_addr); /* * 函数功能:根据内存块handle获取对应的起始物理地址 * 函数参数: * handle - 输入参数,目标内存块handle * 返回值: * 非0 - 目标内存块对应的起始物理地址 * 0 - 函数执行失败 */ xmedia_u64 xmedia_vb_handle_to_phy_addr(xmedia_handle handle); /* * 函数功能:根据内存块handle获取对应内存池ID * 函数参数: * handle - 输入参数,目标内存块handle * 返回值: * (-1U) - 函数执行失败 * others - 目标内存池ID */ xmedia_u32 xmedia_vb_handle_to_pool_id(xmedia_handle handle); /* * 函数功能:根据内存块handle查询当前使用者个数 * 函数参数: * handle - 输入参数,目标内存块handle * 返回值: * (-1U) - 函数执行失败 * others - 目标内存块当前使用者个数 */ xmedia_s32 xmedia_vb_inquire_user_cnt(xmedia_handle handle); /* * 函数功能:根据句柄获取补充内存中内存块的信息 * 函数参数: * handle - 输入参数,内存块句柄 * info - 输出参数,内存块描述信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NOT_READY - VB没有初始化 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_COPY_DATA_ERROR - 拷贝补充内存池信息到用户态失败 */ xmedia_s32 xmedia_vb_get_supplement_info(xmedia_handle handle, xmedia_video_private_info *info); typedef enum { XMEDIA_VB_AINR_DIRECTION_INPUT, // npu输入 XMEDIA_VB_AINR_DIRECTION_OUTPUT, // npu输出 XMEDIA_VB_AINR_DIRECTION_MAX } xmedia_vb_ainr_direction; typedef struct { xmedia_bool ainr_en; xmedia_vb_ainr_direction ainr_direction; } xmedia_vb_ainr_attr; typedef struct { xmedia_video_format video_fmt; xmedia_video_pixel_format pixel_fmt; xmedia_video_compress_mode cmp_mode; xmedia_video_data_width bit_width; xmedia_u32 width; xmedia_u32 height; xmedia_u32 align; // 0:auto xmedia_vb_ainr_attr ainr_attr; } xmedia_vb_base_info; typedef struct { xmedia_u32 vb_size; xmedia_u32 head_size; //压缩头大小 xmedia_u32 head_y_size; xmedia_u32 head_y_stride; xmedia_u32 head_c_stride; xmedia_u32 main_size;//内容数据大小 xmedia_u32 main_y_size; xmedia_u32 main_stride; // y stride xmedia_u32 c_stride; } xmedia_vb_cal_cfg; /* * 函数功能:计算图像数据所需内存信息,包括内存大小,间距等 * 函数参数: * vb_base_info - 输入参数,图像数据描述信息 * vb_cal_cfg - 输出参数,计算得到的内存大小、间距等信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NOT_SUPPORT - 输入图像描述信息不支持 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_vb_get_buffer_config(xmedia_vb_base_info* vb_base_info, xmedia_vb_cal_cfg* vb_cal_cfg); /* * 函数功能:计算yuv格式图像数据卷绕模式下所需内存大小 * 函数参数: * vb_base_info - 输入参数,图像数据描述信息 * buffer_line - 输入参数,卷绕buffer行数 * 返回值: * 0 - 函数执行失败,返回0 * 其他值 - 函数执行成功,返回内存大小 */ xmedia_u32 xmedia_vb_get_wrap_buffer_size(xmedia_vb_base_info* vb_base_info, xmedia_u32 buffer_line); #ifdef __cplusplus } #endif #endif