昇腾社区首页
中文
注册

DCMI_MAIN_CMD_DVPP命令说明

函数原型

int dcmi_get_device_info(int card_id, int device_id, enum dcmi_main_cmd main_cmd, unsigned int sub_cmd, void *buf, unsigned int *size)

功能说明

获取dvpp相关状态,配置信息。

参数说明

参数名称

输入/输出

类型

描述

card_id

输入

int

指定NPU管理单元的ID,当前实际支持的ID通过dcmi_get_card_list接口获取。

device_id

输入

int

指定设备编号,通过dcmi_get_device_id_in_card接口获取。取值范围如下:

NPU芯片:[0, device_id_max-1]。

main_cmd

输入

enum dcmi_main_cmd

DCMI_MAIN_CMD_DVPP

sub_cmd

输入

unsigned int

sub_cmd 获取对应模块下子属性信息。

/* DCMI sub command for DVPP module */
#define DCMI_SUB_CMD_DVPP_STATUS 0  // dvpp状态,buf为0表示状态正常,非0表示状态异常
#define DCMI_SUB_CMD_DVPP_VDEC_RATE 1  // vdec利用率,正常值范围0-100
#define DCMI_SUB_CMD_DVPP_VPC_RATE 2 // vpc利用率,正常值范围0-100
#define DCMI_SUB_CMD_DVPP_VENC_RATE 3 // venc利用率,正常值范围0-100
#define DCMI_SUB_CMD_DVPP_JPEGE_RATE 4 // jpege利用率,正常值范围0-100
#define DCMI_SUB_CMD_DVPP_JPEGD_RATE 5 // jpegd利用率,正常值范围0-100

目前不支持DCMI_SUB_CMD_DVPP_VENC_RATE命令的查询。

buf

输出

void *

用于接收设备信息的返回值。

size

输入/输出

unsigned int *

buf数组的输入/输出长度。

返回值

类型

描述

int

处理结果:

  • 成功:返回0。
  • 失败:返回码请参见返回码

异常处理

无。

约束说明

获取dvpp设备时sub_cmd,buf和size之间必须要满足以下关系,如果不满足会导致接口调用失败。

表1 sub_cmd对应的buf格式

sub_cmd

buf对应的数据类型

size

DCMI_SUB_CMD_DVPP_STATUS

unsigned int

长度为:sizeof(unsigned int)

DCMI_SUB_CMD_DVPP_VDEC_RATE

DCMI_SUB_CMD_DVPP_VPC_RATE

DCMI_SUB_CMD_DVPP_VENC_RATE

DCMI_SUB_CMD_DVPP_JPEGE_RATE

DCMI_SUB_CMD_DVPP_JPEGD_RATE

unsigned int

长度为:sizeof(unsigned int)

表2 部署场景

Linux物理机

Linux物理机容器

root用户

运行用户组(非root用户)

root用户

Y

Y

Y

调用示例

int ret;
int ratio = 0;
int ratio_size = sizeof(int);
int dev_cnt = 0;
int dev_id[64] = {0};
ret = dcmi_get_device_count(&dev_cnt);
if (ret != 0) {
printf("[%s] get dev_cnt test_fail value = %d \n", __func__, ret);
return -1;
}
if (dev_cnt <= 0) {
printf("[%s] get dev_cnt test_fail value = -1 , dev_cnt:%d \n", __func__, dev_cnt);
return -1;
}
printf("[%s] dev_cnt:%d \n", __func__, dev_cnt);
ret = dcmi_list_device(dev_id, dev_cnt);
if (ret != 0) {
printf("[%s] list device test_fail value = %d \n", __func__, ret);
return -1;
}
for (int i = 0; i < dev_cnt; i++) {
printf("---------devid:%d dvpp ratio:---------\n", dev_id[i]);
ret = dcmi_get_device_info(dev_id[i], DCMI_MAIN_CMD_DVPP, DCMI_SUB_CMD_DVPP_VDEC_RATE, (void*)&ratio, &ratio_size);
if (ret != 0) {
printf("[%s %d] dev_id:%d sub_cmd:0x%x, ratio:(0x%x,%d)  test_fail value = %d\n", __func__, __LINE__, dev_id[i], DCMI_SUB_CMD_DVPP_VDEC_RATE, ratio, ratio, ret);
return -1;
}
printf("----vdec:%d \n",  ratio);
ratio = 0;
ret = dcmi_get_device_info(dev_id[i], DCMI_MAIN_CMD_DVPP, DCMI_SUB_CMD_DVPP_VENC_RATE, (void*)&ratio, &ratio_size);
if (ret != 0) {
printf("[%s %d] dev_id:%d sub_cmd:0x%x, ratio:(0x%x,%d)  test_fail value = %d\n", __func__, __LINE__, dev_id[i], DCMI_SUB_CMD_DVPP_VENC_RATE, ratio, ratio, ret);
return -1;
}
ratio = 0;
ret = dcmi_get_device_info(dev_id[i], DCMI_MAIN_CMD_DVPP, DCMI_SUB_CMD_DVPP_VPC_RATE, (void*)&ratio, &ratio_size);
if (ret != 0) {
printf("[%s %d] dev_id:%d sub_cmd:0x%x, ratio:(0x%x,%d)   test_fail value = %d\n", __func__, __LINE__, dev_id[i], DCMI_SUB_CMD_DVPP_VPC_RATE, ratio, ratio, ret);
return -1;
}
ratio = 0;
ret = dcmi_get_device_info(dev_id[i], DCMI_MAIN_CMD_DVPP, DCMI_SUB_CMD_DVPP_JPEGE_RATE, (void*)&ratio, &ratio_size);
if (ret != 0) {
printf("[%s %d] dev_id:%d sub_cmd:0x%x, ratio:(0x%x,%d)   test_fail value = %d\n", __func__, __LINE__, dev_id[i], DCMI_SUB_CMD_DVPP_JPEGE_RATE, ratio, ratio, ret);
return -1;
}
ratio = 0;
ret = dcmi_get_device_info(dev_id[i], DCMI_MAIN_CMD_DVPP, DCMI_SUB_CMD_DVPP_JPEGD_RATE, (void*)&ratio, &ratio_size);
if (ret != 0) {
printf("[%s %d] dev_id:%d sub_cmd:0x%x, ratio:(0x%x,%d)  test_fail value = %d\n", __func__, __LINE__, dev_id[i], DCMI_SUB_CMD_DVPP_JPEGD_RATE, ratio, ratio, ret);
return -1;
}
}