目录
1 [ERROR] Send frame to vdec failed, errorno:507018
2 bug解决尝试1
3 bug解决尝试2
4 bug解决尝试3
附录:华为视频解码基本原理
1调用aclvdecCreateChannel接口创建视频码流数据处理的通道
2 调用aclvdecSendFrame接口将视频码流解码成YUV420SP格式的图片
3 调用aclvdecDestroyChannel接口销毁视频处理的通道
4 VDEC流程图
参考文献:
1 [ERROR] Send frame to vdec failed, errorno:507018
某项目中的代码运行报错 [ERROR] Send frame to vdec failed, errorno:507018
AclLiteError VdecHelper::Process(shared_ptr<FrameData> frameData, void* userData) {
// create input desc
AclLiteError atlRet = CreateInputStreamDesc(frameData);
if (atlRet != ACLLITE_OK) {
ACLLITE_LOG_ERROR("Create stream desc failed");
return atlRet;
}
if (!frameData->isFinished) {
// create out desc
atlRet = CreateOutputPicDesc(outputPicSize_.load());
if (atlRet != ACLLITE_OK) {
ACLLITE_LOG_ERROR("Create pic desc failed");
return atlRet;
}
}
else {
outputPicDesc_ = acldvppCreatePicDesc();
if (outputPicDesc_ == nullptr) {
ACLLITE_LOG_ERROR("Create vdec output pic desc failed");
return ACLLITE_ERROR_CREATE_PIC_DESC;
}
}
// send data to dvpp vdec to decode
ret = aclvdecSendFrame(vdecChannelDesc_, inputStreamDesc_,
outputPicDesc_, nullptr, userData);
if (ret != ACL_SUCCESS) {
ACLLITE_LOG_ERROR("Send frame to vdec failed, errorno:%d", ret);
return ACLLITE_ERROR_VDEC_SEND_FRAME;
}
return ACLLITE_OK;
}
void VdecHelper::SetOutputPicSize(uint32_t picSize) {
if (picSize < outputPicSize_.load()) {
outputPicSize_.store(picSize);
}
}
用vscode调试发现
发现正常和报错时的一些变量也没什么区别,
2 bug解决尝试1
然后网上搜507018的错误码,找到如下链接昇腾社区-官网丨昇腾万里 让智能无所不及
这上面就是说每次都要重新配置描述类型,但是我看了下我的代码里面已经是每次都重新配置描述类型了,该方法行不通。
3 bug解决尝试2
不知道怎么做了,去下载华为官方的sample,然后先跑demo试试,去下载samples: CANN Samples - Gitee.com
https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/0_data_process
然后编译运行这个samples-master/cplusplus/level2_simple_inference/0_data_process/vdec
在代码中增加这一行打印
while (restLen > 0) {
//INFO_LOG("------------------------- ");
// inBufferDev means the memory for input video data by Device, and inBufferSize means the memory size
ret = acldvppSetStreamDescData(streamInputDesc_, inBufferDev);
ret = acldvppSetStreamDescSize(streamInputDesc_, inBufferSize);
// Device memory g_picOutBufferDev is used to store output data decoded by VDEC
ret = acldvppMalloc(&g_picOutBufferDev, dataSize);
// Create output image description information, set the image description information properties
// picOutputDesc_ is acldvppPicDesc
picOutputDesc_ = acldvppCreatePicDesc();
ret = acldvppSetPicDescData(picOutputDesc_, g_picOutBufferDev);
ret = acldvppSetPicDescSize(picOutputDesc_, dataSize);
ret = acldvppSetPicDescFormat(picOutputDesc_, static_cast<acldvppPixelFormat>(format_));
/* Perform video stream decoding. After decoding each frame of data, the system automatically
calls callback callback function to write the decoded data to the file, and then timely release
relevant resources */
ret = aclvdecSendFrame(vdecChannelDesc_, streamInputDesc_, picOutputDesc_, nullptr, nullptr);
printf("ret =================%d\n", ret);
restLen = restLen - 1;
}
运行结果如下
demo报同样的错误,但是我发现如果原视频用华为的std::string filePath = "../data/vdec_h265_1frame_rabbit_1280x720.h265"就不报错,换成我自己的几个视频就报错。
附录:华为视频解码基本原理
1调用aclvdecCreateChannel接口创建视频码流数据处理的通道
1)创建视频码流数据处理通道前,需先执行以下操作:
A、调用aclvdecCreateChannelDesc接口创建通道描述信息。
B、调用aclvdecSetChannelDesc系列接口设置通道描述信息的属性,包括解码通道号、线程、回调函数、视频编码协议等,其中:
回调函数需由用户提前创建,用于在视频解码后,获取解码数据,并及时释放相关资源,回调函数的原型前参见aclvdecCallback。
线程需由用户提前创建,并自定义线程函数,在线程函数内调用aclrtProcessReport接口,等待指定时间后,触发回调函数
2)aclvdecCreateChannel接口内部封装了如下接口,无需用户单独调用:
A、aclrtCreateStream接口:显式创建Stream,VDEC内部使用。
B、aclrtSubscribeReport接口:指定处理Stream上回调函数的线程,回调函数和线程是由用户调用aclvdecSetChannelDesc系列接口时指定的。
2 调用aclvdecSendFrame接口将视频码流解码成YUV420SP格式的图片
1视频解码前,需先执行以下操作:
调用acldvppCreateStreamDesc接口创建输入视频码流描述信息,并调用acldvppSetStreamDesc系列接口设置输入视频的内存地址、内存大小、码流格式等属性。
调用acldvppCreatePicDesc接口创建输出图片描述信息,并调用acldvppSetPicDesc系列接口设置输出图片的内存地址、内存大小、图片格式等属性。
2 aclvdecSendFrame接口内部封装了aclrtLaunchCallback接口,用于在Stream的任务队列中增加一个需要在Host上执行的回调函数。用户无需单独调用aclrtLaunchCallback接口。
3 调用aclvdecDestroyChannel接口销毁视频处理的通道
1)系统会等待已发送帧解码完成且用户的回调函数处理完成后再销毁通道。
2)aclvdecDestroyChannel接口内部封装了如下接口,无需用户单独调用:
aclrtUnSubscribeReport接口:取消线程注册(Stream上的回调函数不再由指定线程处理)。
aclrtDestroyStream接口:销毁Stream。
4 VDEC流程图
参考文献:
华为云论坛_云计算论坛_开发者论坛_技术论坛-华为云
samples: CANN Samples - Gitee.com
samples: CANN Samples - Gitee.com