Files

278 lines
9.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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_configbit[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