aclvdecSendFrame
函数功能
将待解码的输入内存和解码输出内存一起传到解码器进行解码,异步接口。
约束说明
- 本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功。调用该接口后,需调用同步等待接口(例如,aclrtSynchronizeStream)确保任务已执行完成。
- 发送数据前必须保证通道已经被创建,否则返回错误。
- 发送码流时须按帧发送,一次只发送完整的一帧码流。
- 不能发送eos为0的空码流包(码流长度为0或码流地址为空)。
- 发送完所有码流后,可以发送eos为1的帧,表示当前码流文件结束。发送eos后,本接口会等待已发送帧全部解码并且用户的回调函数处理完成后才返回。
- 由于码流异常、解码超时等原因,可能导致aclvdecSendFrame接口发送帧或发送eos失败,建议用户在编写代码时,获取该接口的返回码,当该接口调用失败时,进行异常处理。
- aclvdecSendFrame接口内部封装了aclrtLaunchCallback接口,用于在Stream的任务队列中增加一个需要执行的回调函数。用户在实现VDEC功能时,无需再单独调用aclrtLaunchCallback接口。
函数原型
aclError aclvdecSendFrame(aclvdecChannelDesc *channelDesc,
acldvppStreamDesc *input,
acldvppPicDesc *output,
aclvdecFrameConfig *config,
void* userData)
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
channelDesc |
输入 |
通道描述信息的指针。 与调用aclvdecCreateChannel接口创建通道时指定的channelDesc保持一致。 调用aclvdecSetChannelDesc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等。
说明:
在Atlas 200/300/500 推理产品上,由于软件约束,不支持调用aclvdecSetChannelDescRefFrameNum接口设置通道描述信息的对应属性,若调用,则会返回报错。 在Atlas 训练系列产品上,由于软件约束,不支持调用aclvdecSetChannelDescRefFrameNum接口设置通道描述信息的对应属性,若调用,则会返回报错。 在Atlas 推理系列产品(Ascend 310P处理器)上,支持调用aclvdecSetChannelDescRefFrameNum接口设置通道描述信息的对应属性。 |
input |
输入 |
输入码流描述信息的指针,输入内存用户需提前申请。
|
output |
输入&输出 |
输出图片描述信息的指针,输出内存用户需提前申请。 output参数作为输入时,需要用户调用如下接口:
output参数作为输出时,用户需在回调函数中调用acldvppGetPicDesc系列接口获取解码后的输出图片数据。隔行码流场景下,隔行码流每帧发送两场,解码时其中一场无图像输出,属于正常现象,会返回ERR_DECODE_NOPIC = 0x20000错误码;隔行码流的解码输出数据都在奇数场对应的输出buffer中。 |
config |
输入 |
解码配置的指针,预留,当前可填NULL。 |
userData |
输入 |
用户自定义数据的指针。 如果用户需要获取解码的帧序号,则可以在userData参数处定义,然后解码的帧序号可以通过userData参数传递给VDEC的回调函数,用于确定回调函数中处理的是第几帧数据。 |
返回值说明
返回0表示成功,返回非0表示失败。
参考资源
- 接口调用流程及示例,参见VDEC视频解码。
- Device内存不足,VDEC解码任务异常的案例请参见VDEC视频解码异常导致进程卡死,无法退出。