目录
[1 [ERROR] Send frame to vdec failed, errorno:507018](#1 [ERROR] Send frame to vdec failed, errorno:507018)
[2 bug解决尝试1](#2 bug解决尝试1)
[3 bug解决尝试2](#3 bug解决尝试2)
[4 最终解决方法](#4 最终解决方法)
1 [ERROR] Send frame to vdec failed, errorno:507018
某项目中的代码运行报错 [ERROR] Send frame to vdec failed, errorno:507018
cpp
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
在代码中增加这一行打印
cpp
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"就不报错,换成我自己的几个视频就报错。
4 最终解决方法
华为技术支持让试试:samples: CANN Samples - Gitee.com
https://gitee.com/ascend/samples/tree/master/cplusplus/level1_single_api/7_dvpp/vdec_sample
我试了下这个,发现是可以,没报错,那么需要将我的工程中的解码代码全都替换成这个sample的这些接口,需要把解码代码重写。
另外下图是这个sample对应的解码原理
参考文献:
samples: CANN Samples - Gitee.com