GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
#ifndef libalg_api_h
|
||||
#define libalg_api_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
// <summary>
|
||||
// 图像结构
|
||||
// </summary>
|
||||
typedef struct ALG_IMAGE_INFO
|
||||
{
|
||||
unsigned int image_width; //图像宽度
|
||||
unsigned int image_height; //图像高度
|
||||
unsigned int image_stride; //图像行宽
|
||||
unsigned int image_format; //预留,暂时只支持NV21
|
||||
unsigned char *image_buffer; //图像buff
|
||||
}C_ALG_IMAGE_INFO;
|
||||
|
||||
|
||||
// <summary>
|
||||
// 返回定义
|
||||
// </summary>
|
||||
typedef enum ALG_RESULT
|
||||
{
|
||||
// <summary>
|
||||
// 执行成功
|
||||
// </summary>
|
||||
ALG_SUCCESS = 0,
|
||||
// <summary>
|
||||
// 算法未定义
|
||||
// </summary>
|
||||
ERR_ALG_NULL = 1000,
|
||||
// <summary>
|
||||
// KEY校验失败
|
||||
// </summary>
|
||||
ERR_KEY = 1001,
|
||||
// <summary>
|
||||
// 算法初始化失败
|
||||
// </summary>
|
||||
ERR_ALG_INIT = 1002,
|
||||
// <summary>
|
||||
// 创建算法失败
|
||||
// </summary>
|
||||
ERR_ALG_CREAT = 1003,
|
||||
// <summary>
|
||||
// 算法使能模块错误。
|
||||
// </summary>
|
||||
ERR_ALG_CONFLICT = 1004,
|
||||
// <summary>
|
||||
// 检测算法执行错误
|
||||
// </summary>
|
||||
ERR_ALG_DETECT_EXEC = 1005,
|
||||
// <summary>
|
||||
// 口罩算法执行错误
|
||||
// </summary>
|
||||
ERR_ALG_MASK_EXEC = 1006,
|
||||
// <summary>
|
||||
// 提取特征执行错误
|
||||
// </summary>
|
||||
ERR_ALG_FEATURE_EXEC = 1007,
|
||||
// <summary>
|
||||
// 人脸比对执行错误
|
||||
// </summary>
|
||||
ERR_ALG_MATCH_EXEC = 1008,
|
||||
// <summary>
|
||||
// 人形检测执行错误
|
||||
// </summary>
|
||||
ERR_ALG_PROCESS_EXEC = 1009,
|
||||
// <summary>
|
||||
// 检测人脸为空
|
||||
// </summary>
|
||||
ERR_ALG_FACE_NULL = 1010,
|
||||
// <summary>
|
||||
// 不允许多个人脸
|
||||
// </summary>
|
||||
ERR_ALG_FACE_MULTI = 1010,
|
||||
// <summary>
|
||||
// 姿态分数过低
|
||||
// </summary>
|
||||
ERR_ALG_FACE_QUALITY = 1011,
|
||||
// <summary>
|
||||
// 人脸注册数量已满
|
||||
// </summary>
|
||||
ERR_ALG_FACE_FULL = 1012,
|
||||
// <summary>
|
||||
// 不存在的注册信息
|
||||
// </summary>
|
||||
ERR_ALG_FACE_NOTUSER = 1013,
|
||||
}C_ALG_RESULT;
|
||||
|
||||
|
||||
// @brief 从原图仿射变换得到人脸小图
|
||||
// @param src_img 原始YUV图像,注意:图像buff为虚拟地址
|
||||
// @param dst_img 输出仿射变换的YUV归一化图,注意:该地址请预先分配好。
|
||||
// @param targetpoints 进行仿射变换归一的5个标签点,长度为10。其内存排列为:xy xy xy xy xy
|
||||
// (targetpoints[0]为第一个标签点的x,targetpoints[9]为第五个标签点的y)
|
||||
// @param keypoints 人脸检测模块输出的5个关键点,长度为10。其内存排列为:xy xy xy xy xy
|
||||
// (keypoints[0]为第一个关键点的x,keypoints[9]为第五个关键点的y)
|
||||
// @return 成功返回ALG_RESULT,其他值参见C_ALG_RESULT的定义
|
||||
C_ALG_RESULT alg_api_face_feature_warpaffine( C_ALG_IMAGE_INFO *src_img, C_ALG_IMAGE_INFO *dst_img,
|
||||
float *targetpoints,float *keypoints);
|
||||
|
||||
// @brief 从原图仿射变换得到车牌小图
|
||||
// @param src_img 原始YUV图像,注意:图像buff为虚拟地址
|
||||
// @param dst_img 输出仿射变换的YUV归一化图,注意:该地址请预先分配好。
|
||||
// @param targetpoints 进行仿射变换归一的4个标签点,长度为8。其内存排列为:xy xy xy xy
|
||||
// (targetpoints[0]为第一个标签点的x,targetpoints[8]为第4个标签点的y)
|
||||
// @param keypoints 车牌检测模块输出的4个关键点,长度为8。其内存排列为:xy xy xy xy
|
||||
// (keypoints[0]为第一个关键点的x,keypoints[8]为第4个关键点的y)
|
||||
// @return 成功返回ALG_RESULT,其他值参见C_ALG_RESULT的定义
|
||||
C_ALG_RESULT alg_api_plate_warpaffine( C_ALG_IMAGE_INFO *src_img, C_ALG_IMAGE_INFO *dst_img,
|
||||
float *targetpoints,float *keypoints);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* End of #ifdef __cplusplus */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) XMEDIA. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __MKP_NPU_H__
|
||||
#define __MKP_NPU_H__
|
||||
|
||||
#include "math_fun.h"
|
||||
#include "xmedia_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SVP_TRACE(level, fmt, ...) \
|
||||
do { \
|
||||
MODULE_TRACE(level, MOD_ID_NPU_SVP, "[Func]:%s [Line]:%d [Info]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* End of #ifndef __MKP_NPU_H__ */
|
||||
@@ -0,0 +1,126 @@
|
||||
#ifndef __SVP_COMM__
|
||||
#define __SVP_COMM__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include "svp_nms.h"
|
||||
#include "svp_core.h"
|
||||
#include "svp_bytetracker.h"
|
||||
#include "libalg_api.h"
|
||||
#include "yolov5.h"
|
||||
#include "yolov8.h"
|
||||
|
||||
#include "xmedia_venc.h"
|
||||
#include "xmedia_sys.h"
|
||||
#include "xmedia_vgs.h"
|
||||
#include "xmedia_tde.h"
|
||||
#include "xmedia_isp.h"
|
||||
#include "xmedia_ive.h"
|
||||
#include "xmedia_svp.h"
|
||||
#include "xmedia_svp_std.h"
|
||||
#include "xmedia_svp_quantize.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// VGS大小限制
|
||||
#define VGS_LIMIT_BILINEAR_INIMG_W 8
|
||||
#define VGS_LIMIT_BILINEAR_INIMG_H 8
|
||||
#define VGS_LIMIT_MIN_INIMG_W 16
|
||||
#define VGS_LIMIT_MIN_INIMG_H 16
|
||||
#define VGS_LUMA_LIMIT 2
|
||||
#define SVP_SKIN_COLOR_MIN_V_VALUE 131
|
||||
#define SVP_SKIN_COLOR_MAX_V_VALUE 155
|
||||
#define SVP_SKIN_COLOR_MIN_U_VALUE 107
|
||||
#define SVP_SKIN_COLOR_MAX_U_VALUE 127
|
||||
#define SVP_MAX_CAL_LUMA_RECT_NUM 5 /* 最大支持计算5个框的亮度信息 */
|
||||
#define SVP_MIN_RECT_WIDTH 16
|
||||
#define SVP_MIN_RECT_HEIGHT 16
|
||||
#define SVP_MOV_ACCURACY_ONE 1
|
||||
// cal luma rate
|
||||
#define SVP_FACE_RECT_FD_X_COEF 4
|
||||
#define SVP_FACE_RECT_FD_Y_COEF 2
|
||||
#define SVP_FACE_RECT_FD_W_COEF 12
|
||||
#define SVP_FACE_RECT_FD_H_COEF 16
|
||||
#define SVP_FACE_RECT_PD_X_COEF 4
|
||||
#define SVP_FACE_RECT_PD_Y_COEF 5
|
||||
#define SVP_FACE_RECT_PD_W_COEF 12
|
||||
#define SVP_FACE_RECT_PD_H_COEF 10
|
||||
#define SVP_FACE_RECT_BASE_COEF 20
|
||||
// smartAE class
|
||||
#define SVP_SMART_CLASS_MAX 2
|
||||
#define SVP_MODEL_TYPE_PEOPLE 0
|
||||
#define SVP_MODEL_TYPE_FACE 1
|
||||
#define SVP_PEOPLE_INDEX 0
|
||||
#define SVP_FACE_INDEX 1
|
||||
#define RCNN_DEBUG_STRING 64
|
||||
// 模型大图分辨率
|
||||
#define INPUT_BIG_WIDE 1920
|
||||
#define INPUT_BIG_HIGH 1080
|
||||
/** 万分比坐标比例 */
|
||||
#define SVP_SCALE_RATIO 10000.0f
|
||||
#define XMEDIA_SVP_FR_KEYPOINT_CNT ((XMEDIA_SVP_FR_KEYPOINT_NUM) * (2)) // 人脸关键点总数[x和y]
|
||||
|
||||
#define SVP_DIV_0_TO_1(a) ((0 == (a)) ? 1 : (a))
|
||||
|
||||
typedef struct {
|
||||
xmedia_u64 img_addr; // 物理地址
|
||||
xmedia_void *vir_addr; // 虚拟地址
|
||||
xmedia_u32 width; // 宽度
|
||||
xmedia_u32 hight; // 长度
|
||||
} svp_ive_img;
|
||||
|
||||
typedef struct {
|
||||
xmedia_float targetpoints[XMEDIA_SVP_FR_KEYPOINT_CNT];
|
||||
xmedia_float keypoints[XMEDIA_SVP_FR_KEYPOINT_CNT];
|
||||
xmedia_char *warpaffine_output;
|
||||
} svp_warpaffine_pairpack;
|
||||
|
||||
typedef struct {
|
||||
xmedia_u32 left;
|
||||
xmedia_u32 top;
|
||||
xmedia_u32 right;
|
||||
xmedia_u32 bottom;
|
||||
} cal_svp_rect;
|
||||
|
||||
typedef struct {
|
||||
xmedia_u8 x_coef;
|
||||
xmedia_u8 y_coef;
|
||||
xmedia_u8 w_coef;
|
||||
xmedia_u8 h_coef;
|
||||
} svp_rect_cut_coef;
|
||||
|
||||
typedef struct {
|
||||
svp_warpaffine_pairpack warpaffine_pairpack[XMEDIA_SVP_MAX_TARGET_NUM];
|
||||
} svp_warpaffine_info;
|
||||
|
||||
xmedia_void softmax(xmedia_float *arr, xmedia_s32 size, xmedia_float *result_arr);
|
||||
xmedia_s32 svp_vgs_resize(const xmedia_video_frame_info *input_frame, xmedia_video_frame_info *output_frame);
|
||||
xmedia_s32 svp_ive_crop(const svp_ive_img *src_img, svp_ive_img *dst_img, xmedia_u32 w_offset, xmedia_u32 h_offset);
|
||||
xmedia_s32 svp_ive_dma_image_copy(const xmedia_video_frame_info *pst_frame_info, xmedia_ive_image_s *pst_dst);
|
||||
xmedia_s32 svp_ive_padding(svp_ive_img *src_img, svp_ive_img *dst_img, xmedia_u32 right, xmedia_u32 top);
|
||||
xmedia_s32 svp_send_info_to_venc(yolov5_detect_param *param, xmedia_svp_yolov5_output *result,
|
||||
const xmedia_svp_task_input *input_image);
|
||||
xmedia_s32 svp_update_luma(yolov5_detect_param *param, xmedia_svp_yolov5_output *result,
|
||||
const xmedia_svp_task_input *input_image);
|
||||
xmedia_s32 svp_padding_resize(xmedia_video_frame_info *ref_frame, xmedia_svp_rect *rect, xmedia_u64 resize_phyaddr,
|
||||
xmedia_void *resize_viraddr, xmedia_u32 dst_width, xmedia_u32 dst_height);
|
||||
xmedia_float svp_iou_with_box1(xmedia_svp_yolov8_result *box1, xmedia_svp_dms_result *box2);
|
||||
xmedia_s32 svp_detect_zone(const xmedia_svp_zone* zone, const xmedia_svp_rect* rect,
|
||||
const xmedia_u32 width, const xmedia_u32 height);
|
||||
xmedia_s32 clip_rect_to_frame(xmedia_svp_rect *rect, xmedia_u32 frame_width, xmedia_u32 frame_height);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
#ifndef __XMEDIA_SVP_QUANTIZE_H__
|
||||
#define __XMEDIA_SVP_QUANTIZE_H__
|
||||
|
||||
#include <math.h>
|
||||
#include "xmedia_svp.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
xmedia_float scale;
|
||||
xmedia_s32 zp;
|
||||
} quanlize_param;
|
||||
|
||||
/**
|
||||
* @brief 量化(浮点到定点)
|
||||
*
|
||||
* @param data
|
||||
* @param scale
|
||||
* @param zp
|
||||
* @return xmedia_u8
|
||||
*/
|
||||
static inline xmedia_u8 quantize(xmedia_float data, xmedia_float scale, xmedia_s32 zp)
|
||||
{
|
||||
return STD_MIN(255, STD_MAX(0, round(data / scale + zp)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 反量化(定点到浮点)
|
||||
*
|
||||
* @param data
|
||||
* @param scale
|
||||
* @param zp
|
||||
* @return xmedia_float
|
||||
*/
|
||||
static inline xmedia_float dequantize(xmedia_u8 data, xmedia_float scale, xmedia_s32 zp)
|
||||
{
|
||||
return (xmedia_float)(scale * (data - zp));
|
||||
}
|
||||
|
||||
static inline xmedia_float desigmoid(xmedia_float x)
|
||||
{
|
||||
return (-log((1.f / (x + 1e-8)) - 1.f));
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,224 @@
|
||||
#ifndef __XMEDIA_SVP_STD_H__
|
||||
#define __XMEDIA_SVP_STD_H__
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include "mkp_npu.h"
|
||||
#include "xmedia_sys.h"
|
||||
#include "xmedia_svp.h"
|
||||
#include "xmedia_mmz.h"
|
||||
|
||||
#define UNSIGNED_8_BIT_NUM 256 // U8类型最大限制
|
||||
#define SVP_MIN_ATTR_STILLNESS_THRES 0.6 // 静止状态阈值最小限制
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define CHECK_SVP_COND_GOTO_ERROR(cond, label, ...) \
|
||||
do { \
|
||||
if (cond) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
goto label; \
|
||||
} \
|
||||
} while(0); \
|
||||
|
||||
#define CHECK_SVP_COND_RETURN_ERROR(cond, ...) \
|
||||
do { \
|
||||
if (cond) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return XMEDIA_FAILURE; \
|
||||
} \
|
||||
} while(0); \
|
||||
|
||||
|
||||
#define CHECK_CALLOC_RETURN_ERROR(a) \
|
||||
if (NULL == a) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, "out of memory\n"); \
|
||||
return XMEDIA_FAILURE; \
|
||||
}
|
||||
|
||||
#define CHECK_CALLOC_RETURN_NULL(a) \
|
||||
if (NULL == a) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, "out of memory\n"); \
|
||||
return NULL; \
|
||||
}
|
||||
|
||||
#define CHECK_CALLOC_RETURN_VOID(a) \
|
||||
if (NULL == a) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, "out of memory\n"); \
|
||||
return; \
|
||||
}
|
||||
|
||||
#define CHECK_CALLOC_GOTO_ERROR(a, label) \
|
||||
do { \
|
||||
if (a == NULL) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, "out of memory\n"); \
|
||||
goto label; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define CFREE(a) \
|
||||
if (a) { \
|
||||
free(a); \
|
||||
a = NULL; \
|
||||
}
|
||||
|
||||
#define STD_MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define STD_MIN(a, b) ((a) > (b) ? (b) : (a))
|
||||
|
||||
#define SVP_CHECK_U8(src_data, ...) \
|
||||
do { \
|
||||
if ((src_data) < 0 || (src_data) > UNSIGNED_8_BIT_NUM) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return (XMEDIA_FAILURE); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define SVP_CHECK_ATTR_STILLNESS_THRES(src_data, ...) \
|
||||
do { \
|
||||
if ((src_data) <= SVP_MIN_ATTR_STILLNESS_THRES || (src_data) >= 1) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return (XMEDIA_FAILURE); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define SVP_CHECK_ATTR_THRESHOLD(src_data, ...) \
|
||||
do { \
|
||||
if ((src_data) <= 0 || (src_data) >= 1) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return (XMEDIA_FAILURE); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define SVP_CHECK_ATTR_NUM(src_data, ...) \
|
||||
do { \
|
||||
if ((src_data) <= 0 || (src_data) > XMEDIA_SVP_MAX_TARGET_NUM) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return (XMEDIA_FAILURE); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
#define SVP_CHECK_ATTR_ENABLE(src_data, ...) \
|
||||
do { \
|
||||
if ((src_data) != XMEDIA_FALSE && (src_data) != XMEDIA_TRUE) { \
|
||||
SVP_TRACE(MODULE_DBG_ERR, __VA_ARGS__); \
|
||||
return (XMEDIA_FAILURE); \
|
||||
} \
|
||||
} while (0);
|
||||
|
||||
static __inline__ xmedia_s32 check_file_exist(xmedia_char *filepath)
|
||||
{
|
||||
struct stat file_stat;
|
||||
|
||||
if (stat(filepath, &file_stat) != 0) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "error, model file path err or not exist\n");
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
return XMEDIA_SUCCESS;
|
||||
}
|
||||
|
||||
static __inline__ xmedia_s32 svp_mmz_alloc(xmedia_char *buf_name, xmedia_u64 *phy_addr, xmedia_u32 size)
|
||||
{
|
||||
xmedia_chn_info chn_info = { 0 };
|
||||
xmedia_s32 ret = XMEDIA_SUCCESS;
|
||||
xmedia_char mmz_name[MAX_MMZ_NAME_LEN] = { 0 };
|
||||
|
||||
chn_info.mod_id = MOD_ID_NPU_SVP;
|
||||
chn_info.chn_id = 0;
|
||||
chn_info.dev_id = 0;
|
||||
|
||||
ret = xmedia_sys_get_mem_config(&chn_info, mmz_name);
|
||||
if (ret != XMEDIA_SUCCESS) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_sys_get_mem_config failed %d \n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*phy_addr = xmedia_mmz_alloc(mmz_name, buf_name, size);
|
||||
if (*phy_addr == XMEDIA_NULL) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_mmz_alloc filed, size %d \n", size);
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
|
||||
return XMEDIA_SUCCESS;
|
||||
}
|
||||
|
||||
static __inline__ xmedia_s32 svp_mmz_alloc_and_map(xmedia_char *buf_name, xmedia_u64 *phy_addr,
|
||||
xmedia_void **virt_addr, xmedia_u32 size)
|
||||
{
|
||||
xmedia_chn_info chn_info = { 0 };
|
||||
xmedia_s32 ret = XMEDIA_SUCCESS;
|
||||
xmedia_char mmz_name[MAX_MMZ_NAME_LEN] = { 0 };
|
||||
|
||||
chn_info.mod_id = MOD_ID_NPU_SVP;
|
||||
chn_info.chn_id = 0;
|
||||
chn_info.dev_id =0;
|
||||
|
||||
ret = xmedia_sys_get_mem_config(&chn_info, mmz_name);
|
||||
if (ret != XMEDIA_SUCCESS) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_sys_get_mem_config failed %d \n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*phy_addr = xmedia_mmz_alloc(mmz_name, buf_name, size);
|
||||
if (*phy_addr != XMEDIA_NULL) {
|
||||
*virt_addr = xmedia_mmz_map(*phy_addr, size, XMEDIA_FALSE);
|
||||
if (*virt_addr == XMEDIA_NULL) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_mmz_map filed, size %d \n", size);
|
||||
xmedia_mmz_free(*phy_addr);
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
} else {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_mmz_alloc filed, size %d \n", size);
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
|
||||
return XMEDIA_SUCCESS;
|
||||
}
|
||||
|
||||
static __inline__ xmedia_s32 svp_mmz_alloc_and_map_cache(xmedia_char *buf_name, xmedia_u64 *phy_addr,
|
||||
xmedia_void **virt_addr, xmedia_u32 size)
|
||||
{
|
||||
xmedia_chn_info chn_info = { 0 };
|
||||
xmedia_s32 ret = XMEDIA_SUCCESS;
|
||||
xmedia_char mmz_name[MAX_MMZ_NAME_LEN] = { 0 };
|
||||
|
||||
chn_info.mod_id = MOD_ID_NPU_SVP;
|
||||
chn_info.chn_id = 0;
|
||||
chn_info.dev_id = 0;
|
||||
|
||||
ret = xmedia_sys_get_mem_config(&chn_info, mmz_name);
|
||||
if (ret != XMEDIA_SUCCESS) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_sys_get_mem_config failed %d \n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
*phy_addr = xmedia_mmz_alloc(mmz_name, buf_name, size);
|
||||
if (*phy_addr != XMEDIA_NULL) {
|
||||
*virt_addr = xmedia_mmz_map(*phy_addr, size, XMEDIA_TRUE);
|
||||
if (*virt_addr == XMEDIA_NULL) {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_mmz_map filed, size %d \n", size);
|
||||
xmedia_mmz_free(*phy_addr);
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
} else {
|
||||
SVP_TRACE(MODULE_DBG_ERR, "xmedia_mmz_alloc filed, size %d \n", size);
|
||||
return XMEDIA_FAILURE;
|
||||
}
|
||||
|
||||
return XMEDIA_SUCCESS;
|
||||
}
|
||||
|
||||
static __inline__ xmedia_void svp_mmz_unmap_and_free(xmedia_u64 phy_addr, xmedia_void *virt_addr)
|
||||
{
|
||||
|
||||
if (virt_addr != XMEDIA_NULL) {
|
||||
xmedia_mmz_unmap(virt_addr);
|
||||
}
|
||||
xmedia_mmz_free(phy_addr);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user