Train_Identify_arm/nvidia_ascend_engine/common_engine/DataDealEngine/DataDealTwoEngine.cpp

607 lines
24 KiB
C++
Raw Normal View History

2024-06-19 06:35:05 +00:00
#include "DataDealTwoEngine.h"
using namespace ai_matrix;
extern bool g_bNoDealStepTwoFlag;
DataDealTwoEngine::DataDealTwoEngine() {}
DataDealTwoEngine::~DataDealTwoEngine() {}
APP_ERROR DataDealTwoEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
strPort2_ = engineName_ + "_" + std::to_string(engineId_) + "_2";
strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path");
iIntervalTime_ = 40 *1000;
iSplitSpanPX_ = MyYaml::GetIns()->GetIntValue("gc_split_frame_span_px");
dataSourceConfig_ = MyYaml::GetIns()->GetDataSourceConfigById(engineId_); //获取摄像机参数
mapUseDataSouceCfg_ = MyYaml::GetIns()->GetUseDataSourceConfig();
std::string delimiter(",");
for (auto iter = mapUseDataSouceCfg_.begin(); iter!=mapUseDataSouceCfg_.end(); iter++)
{
int iSourceId = iter->first;
std::vector<std::string> vecSplit = MyUtils::getins()->split(iter->second.strTarget, delimiter);
std::vector<std::string> vecPushPorts;
for (auto iter = vecSplit.begin(); iter != vecSplit.end(); iter++)
{
if (*iter == "NUM")
{
vecPushPorts.push_back(strPort0_);
}
else if (*iter == "CHKDATE")
{
vecPushPorts.push_back(strPort1_);
}
else if(*iter == "CONTAINER" || *iter == "CONTAINER_T")
{
vecPushPorts.push_back(strPort2_);
}
}
mapSourcePushPort_[iSourceId] = vecPushPorts;
}
InitParam();
LogInfo << "engineId_:" << engineId_ << " DataDealTwoEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR DataDealTwoEngine::DeInit()
{
LogInfo << "engineId_:" << engineId_ << " DataDealTwoEngine DeInit ok";
return APP_ERR_OK;
}
/**
* ()
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::InitParam()
{
iTrainIndex_ = 1;
iDirection_ = DIRECTION_UNKNOWN;
iDirectionAndFirst_ = DO_NOT_KNOW_DIRECTION;
iLastSpaceX_ = 0;
iLastSpaceFrameid_ = 0;
iSpaceType_ = 0;
}
/**
*
* inParam : RawData &rawData :
* outParam: std::shared_ptr<DecodedData> pDecodedData :
* return : true()/false()
*/
bool DataDealTwoEngine::GetJpegdOut(std::shared_ptr<DecodedData> pDecodedData, RawData &rawData)
{
int iRet = APP_ERR_OK;
return true;
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::GetPostSubDatas(std::vector<PostSubData> &vecPostSubData, Json::Value &jvFrameInfo,
Target tar, Json::Value &jvOneSplit)
{
std::string strKey;
switch (tar)
{
case NUM:
strKey = "step1Num";
break;
case PRO:
strKey = "step1Pro";
break;
case CHKDATE:
strKey = "step1ChkDate";
break;
case CONTAINER:
strKey = "step1Container";
break;
default:
break;
}
if (strKey.empty())
{
return;
}
if (!jvFrameInfo.isMember(strKey.c_str()))
{
return;
}
float fSplitCenterX = jvOneSplit["splitX"].asFloat();
int iValidType = jvOneSplit["validType"].asInt();
Json::Value &jsArray = jvFrameInfo[strKey.c_str()];
for (int i = 0; i < jsArray.size(); i++)
{
float fCenterX = jsArray[i]["ltx"].asFloat() + (jsArray[i]["rbx"].asFloat() - jsArray[i]["ltx"].asFloat()) / 2;
if (jvOneSplit["useY"].asBool())
{
fCenterX = jsArray[i]["lty"].asFloat() + (jsArray[i]["rby"].asFloat() - jsArray[i]["lty"].asFloat()) / 2;
}
bool bChkFlag = false;
if(iValidType == VALID_ALL)
{
bChkFlag = true;
}
else if(iValidType == VALID_LEFT && fCenterX < fSplitCenterX)
{
bChkFlag = true;
}
else if(iValidType == VALID_RIGHT && fCenterX > fSplitCenterX)
{
bChkFlag = true;
}
if (bChkFlag)
{
SingleData sdInfo;
sdInfo.iClassId = jsArray[i]["classid"].asInt();
sdInfo.fScore = jsArray[i]["score"].asFloat();
sdInfo.fLTX = jsArray[i]["ltx"].asFloat();
sdInfo.fLTY = jsArray[i]["lty"].asFloat();
sdInfo.fRBX = jsArray[i]["rbx"].asFloat();
sdInfo.fRBY = jsArray[i]["rby"].asFloat();
sdInfo.fClear = jsArray[i]["clear"].asFloat();
PostSubData postSubData;
postSubData.iBigClassId = sdInfo.iClassId;
postSubData.iTargetType = tar;
if (tar == NUM && postSubData.iBigClassId == 0)
{
postSubData.iTargetType = HEAD;
}
postSubData.vecSingleData.emplace_back(sdInfo);
postSubData.step1Location.fLTX = sdInfo.fLTX;
postSubData.step1Location.fLTY = sdInfo.fLTY;
postSubData.step1Location.fRBX = sdInfo.fRBX;
postSubData.step1Location.fRBY = sdInfo.fRBY;
vecPostSubData.emplace_back(postSubData);
}
}
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::GetMainSplitInfo(Json::Value &jvMainSplit, std::shared_ptr<ProcessData> pProcessData,
Json::Value &jvFrameInfo, std::shared_ptr<TrainRange> pTrainRange)
{
if (pProcessData->iDataSource != 0)
{
return;
}
Json::Value jvModelSpace;
if (jvFrameInfo.isMember("step1Space"))
{
jvModelSpace = jvFrameInfo["step1Space"][0];
}
int iValidType = VALID_ALL; //图像上大框有效类型 {0-全部有效; 1-左边有效; 2-右边有效}
int iSpaceX = 0; //图像上车厢间隔位置
bool bNeedNum = true; //图像上车号框是否有效
bool bNeedPro = true; //图像上属性框是否有效
bool bNeedChkDate = true; //图像定检期框是否有效
bool bNeedContainer = true; //图像集装箱框是否有效
bool bOtherSideNeedNum = true; //另一侧图像上车号框是否有效
bool bOtherSideNeedPro = true; //另一侧图像上属性框是否有效
bool bOtherSideNeedChkDate = true; //另一侧图像上定检期框是否有效
bool bOtherSideNeedContainer = true; //另一侧图像上集装箱框是否有效
if (!jvModelSpace.empty())
{
iSpaceX = jvModelSpace["ltx"].asFloat() + (jvModelSpace["rbx"].asFloat() - jvModelSpace["ltx"].asFloat()) / 2;
/*
;
;
*/
bool bIntervalFlag = ((int)(pProcessData->iFrameId - iLastSpaceFrameid_) > dataSourceConfig_.iSkipInterval * 2);
if (iTrainIndex_ == 1)
{
iSpaceType_ = 2;
}
else if (pTrainRange->iStartFrameId == pProcessData->iFrameId)
{
iSpaceType_ = 1;
}
else if ((pProcessData->iDirection == DIRECTION_LEFT && (iLastSpaceX_ < iSpaceX - iSplitSpanPX_) && bIntervalFlag) ||
(pProcessData->iDirection == DIRECTION_RIGHT && (iLastSpaceX_ - iSplitSpanPX_ > iSpaceX) && bIntervalFlag))
{
iSpaceType_ = 2;
}
if (iSpaceType_ == 1)
{
iValidType = pProcessData->iDirection == DIRECTION_LEFT ? VALID_RIGHT : VALID_LEFT;
}
else if (iSpaceType_ == 2)
{
iValidType = pProcessData->iDirection == DIRECTION_LEFT ? VALID_LEFT : VALID_RIGHT;
}
LogDebug << " frameid:" << pProcessData->iFrameId
<< " 车节:" << pProcessData->iTrainIndex << " iSpaceType_:" << iSpaceType_
<< " iSpaceX:" << iSpaceX << " iLastSpaceX_:" << iLastSpaceX_
<< " iLastSpaceFrameid_:" << iLastSpaceFrameid_ << " bIntervalFlag:" << bIntervalFlag;
iLastSpaceX_ = iSpaceX;
iLastSpaceFrameid_ = pProcessData->iFrameId;
}
jvMainSplit["validType"] = iValidType;
jvMainSplit["splitX"] = iSpaceX;
jvMainSplit["needNum"] = bNeedNum;
jvMainSplit["needPro"] = bNeedPro;
jvMainSplit["needChkDate"] = bNeedChkDate;
jvMainSplit["needContainer"] = bNeedContainer;
jvMainSplit["otherSideNeedNum"] = bOtherSideNeedNum;
jvMainSplit["otherSideNeedPro"] = bOtherSideNeedPro;
jvMainSplit["otherSideNeedChkDate"] = bOtherSideNeedChkDate;
jvMainSplit["otherSideNeedContainer"] = bOtherSideNeedContainer;
jvMainSplit["mainWidth"] = pProcessData->iWidth;
jvMainSplit["mainHeight"] = pProcessData->iHeight;
if (pProcessData->bIsEnd)
{
iLastSpaceX_ = 0;
iLastSpaceFrameid_ = 0;
iSpaceType_ = 0;
}
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::GetSubSplitInfoByMain(Json::Value &jvOneSplit, std::shared_ptr<ProcessData> pProcessData, Json::Value &jvFrameInfo)
{
if (pProcessData->iDataSource == 1)
{
if (pProcessData->iDirection == DIRECTION_RIGHT)
{
//向右行驶时,间隔坐标尽可能小一些,把未完全对其的定检期信息包含进来。
jvOneSplit["splitX"] = jvOneSplit["splitX"].asInt() - 100;
}
}
else if (pProcessData->iDataSource == 2)
{
//顶部集装箱的重设splitX相关逻辑
if (jvOneSplit["rotate"].asInt() == 90)
{
jvOneSplit["useY"] = true;
if (pProcessData->iHeight != jvOneSplit["mainWidth"].asInt())
{
jvOneSplit["splitX"] = jvOneSplit["splitX"].asInt() * pProcessData->iHeight / jvOneSplit["mainWidth"].asInt();
}
//顶部有间隔时,使用顶部间隔。
if (jvFrameInfo.isMember("step1TopSpace"))
{
Json::Value jvModelSpace = jvFrameInfo["step1TopSpace"][0];
int iSpaceX = jvModelSpace["lty"].asFloat() + (jvModelSpace["rby"].asFloat() - jvModelSpace["lty"].asFloat()) / 2;
LogDebug << "sourceid" << pProcessData->iDataSource << " frameid:" << pProcessData->iFrameId << " use TopSpace splitX:"
<< jvOneSplit["splitX"].asInt() << " newsplitX:" << iSpaceX;
jvOneSplit["splitX"] = iSpaceX;
//如果validType为0则说明主摄像头间隔还未识别到结束间隔则按顶部摄像头设置validType
if (jvOneSplit["validType"] == VALID_ALL)
{
jvOneSplit["validType"] = pProcessData->iDirection == DIRECTION_LEFT ? VALID_LEFT : VALID_RIGHT;
LogDebug << "sourceid" << pProcessData->iDataSource << " frameid:" << pProcessData->iFrameId
<< "reset validType:" << jvOneSplit["validType"].asInt();
}
}
}
}
else if (pProcessData->iDataSource == 3 || pProcessData->iDataSource == 4)
{
jvOneSplit["splitX"] = (int)(pProcessData->iWidth - jvOneSplit["splitX"].asInt());
int iValidType = jvOneSplit["validType"].asInt();
iValidType = iValidType == VALID_ALL ? iValidType : (iValidType == VALID_LEFT ? VALID_RIGHT : VALID_LEFT);
jvOneSplit["validType"] = iValidType;
jvOneSplit["needNum"] = jvOneSplit["otherSideNeedNum"].asBool();
jvOneSplit["needPro"] = jvOneSplit["otherSideNeedPro"].asBool();
jvOneSplit["needChkDate"] = jvOneSplit["otherSideNeedChkDate"].asBool();
jvOneSplit["needContainer"] = jvOneSplit["otherSideNeedContainer"].asBool();
if (pProcessData->iDataSource == 4 && pProcessData->iDirection == DIRECTION_LEFT)
{
jvOneSplit["splitX"] = jvOneSplit["splitX"].asInt() + 100;
}
}
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::GetValidTypeAndSplit(Json::Value &jvOneSplit, Json::Value &jvMainSplit,
std::shared_ptr<ProcessData> pProcessData, Json::Value &jvFrameInfo,
std::shared_ptr<TrainRange> pTrainRange)
{
if (pProcessData->iDataSource == 0)
{
GetMainSplitInfo(jvMainSplit, pProcessData, jvFrameInfo, pTrainRange);
jvOneSplit = jvMainSplit;
}
else
{
GetSubSplitInfoByMain(jvOneSplit, pProcessData, jvFrameInfo);
}
// LogDebug << "sourceid:" << pProcessData->iDataSource << " frameid:" << pProcessData->iFrameId
// << " trainIndex:" << pProcessData->iTrainIndex
// << " validType:" << jvOneSplit["validType"].asInt() << " splitX:" << jvOneSplit["splitX"].asInt()
// << " needNum:" << jvOneSplit["needNum"].asBool() << " needPro:" << jvOneSplit["needPro"].asBool()
// << " needChkDate:" << jvOneSplit["needChkDate"].asBool() << " needContainer:" << jvOneSplit["needContainer"].asBool();
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
int DataDealTwoEngine::GetPostData(std::shared_ptr<ProcessData> pProcessData, Json::Value &jvFrameInfo, Json::Value &jvOneSplit)
{
std::shared_ptr<PostData> pPostData = std::make_shared<PostData>();
pProcessData->pVoidData = std::static_pointer_cast<void>(pPostData);
if (jvOneSplit["needNum"].asBool())
{
GetPostSubDatas(pPostData->vecPostSubData, jvFrameInfo, NUM, jvOneSplit);
}
if (jvOneSplit["needPro"].asBool())
{
GetPostSubDatas(pPostData->vecPostSubData, jvFrameInfo, PRO, jvOneSplit);
}
if (jvOneSplit["needChkDate"].asBool())
{
/*
1
1
*/
int iValidTypeTemp = jvOneSplit["validType"].asInt();
if ((iValidTypeTemp == VALID_RIGHT && pProcessData->iDataSource == 1 && pProcessData->iDirection == DIRECTION_RIGHT) ||
(iValidTypeTemp == VALID_RIGHT && pProcessData->iDataSource == 4 && pProcessData->iDirection == DIRECTION_LEFT) ||
(iValidTypeTemp == VALID_LEFT && pProcessData->iDataSource == 1 && pProcessData->iDirection == DIRECTION_LEFT) ||
(iValidTypeTemp == VALID_LEFT && pProcessData->iDataSource == 4 && pProcessData->iDirection == DIRECTION_RIGHT))
{
jvOneSplit["validType"] = 0;
}
GetPostSubDatas(pPostData->vecPostSubData, jvFrameInfo, CHKDATE, jvOneSplit);
jvOneSplit["validType"] = iValidTypeTemp;
}
if (jvOneSplit["needContainer"].asBool())
{
GetPostSubDatas(pPostData->vecPostSubData, jvFrameInfo, CONTAINER, jvOneSplit);
}
return pPostData->vecPostSubData.size();
}
/**
* push
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void DataDealTwoEngine::MakeProcessData(std::shared_ptr<TrainRange> pTrainRange)
{
int iRet = APP_ERR_OK;
int iDataNO = 1;
std::string strDataDir = strResultPath_ + pTrainRange->strTrainDate + "/" + pTrainRange->strTrainName + "/";
for (int iFrameId = pTrainRange->iStartFrameId; iFrameId <= pTrainRange->iEndFrameId; iFrameId += dataSourceConfig_.iSkipInterval)
{
Json::Value jvMainSplit; //主摄像头车厢间隔坐标信息
int iStatus = TRAINSTATUS_RUN;
int iTagTotalCnt = 0;
for (auto iter = mapUseDataSouceCfg_.begin(); iter != mapUseDataSouceCfg_.end(); iter++)
{
int iSourceId = iter->first;
char szCameraNo[5] = {0};
sprintf(szCameraNo, "%03d/", iSourceId + 1);
bool bIsEndFlag = (pTrainRange->iEndFrameId == iFrameId);
// LogInfo << "sourceid:" << iSourceId << " StepTwo MakeProcessData trainIndex:" << pTrainRange->iTrainIndex
// << " iFrameId:" << iFrameId << " bIsEndFlag:" << bIsEndFlag;
std::string strImgName = strDataDir + szCameraNo + std::to_string(iFrameId);
strImgName += (iter->second.iRotate != 0) ? "_rotate.jpg" : ".jpg";
std::string strFileName = strDataDir + szCameraNo + std::to_string(iFrameId) + ".txt";
// 获取大框信息
Json::Value jvFrameInfo;
bool bReadFlag = MyUtils::getins()->ReadJsonInfo(jvFrameInfo, strFileName, 0);
if (!bIsEndFlag && !bReadFlag)
{
//非车厢结束帧且没有txt信息时不处理。
continue;
}
iStatus = (iSourceId == 0 ? jvFrameInfo["status"].asInt() : iStatus);
// 构造处理数据信息
std::shared_ptr<ProcessData> pProcessData = std::make_shared<ProcessData>();
pProcessData->iDataSource = iSourceId;
pProcessData->iFrameId = iFrameId;
pProcessData->strTrainDate = pTrainRange->strTrainDate;
pProcessData->strTrainName = pTrainRange->strTrainName;
pProcessData->bIsEnd = bIsEndFlag;
pProcessData->iStatus = iStatus;
pProcessData->iDirection = iDirection_;
pProcessData->iDataNO = iDataNO;
pProcessData->iTrainIndex = pTrainRange->iTrainIndex;
pProcessData->bIsTrainEnd = pTrainRange->bIsEnd;
pProcessData->strPicFilePath = strImgName;
pProcessData->i64TimeStamp = jvFrameInfo["timeStamp"].asUInt64();
pProcessData->iWidth = jvFrameInfo["width"].asInt();
pProcessData->iHeight = jvFrameInfo["height"].asInt();
Json::Value jvOneSplit;
jvOneSplit = jvMainSplit;
jvOneSplit["rotate"] = iter->second.iRotate;
GetValidTypeAndSplit(jvOneSplit, jvMainSplit, pProcessData, jvFrameInfo, pTrainRange);
// 获取有效的大框信息
int iRetCnt = GetPostData(pProcessData, jvFrameInfo, jvOneSplit);
iTagTotalCnt += iRetCnt;
if (iRetCnt > 0 && iStatus == TRAINSTATUS_RUN)
{
cv::Mat cvframe = cv::imread(pProcessData->strPicFilePath);
int iBufferSize = pProcessData->iWidth * pProcessData->iHeight * 3;
void *pBGRBufferobj = nullptr;
pBGRBufferobj = new uint8_t[iBufferSize];
memcpy(pBGRBufferobj, cvframe.data, iBufferSize);
pProcessData->pData.reset(pBGRBufferobj, [](void *data){if(data) {delete[] data; data = nullptr;}});
pProcessData->iSize = iBufferSize;
}
std::vector<std::string> vecPushPorts = mapSourcePushPort_[iSourceId];
for (int iPort = 0; iPort < vecPushPorts.size(); iPort++)
{
if (iPort == vecPushPorts.size() - 1)
{
2024-06-19 06:41:40 +00:00
iRet = outputQueMap_[vecPushPorts[iPort]]->push(std::static_pointer_cast<void>(pProcessData), true);
// PushData(vecPushPorts[iPort], pProcessData);
2024-06-19 06:35:05 +00:00
continue;
}
std::shared_ptr<ProcessData> pNewProcessData = std::make_shared<ProcessData>();
*pNewProcessData = *pProcessData;
2024-06-19 06:41:40 +00:00
iRet = outputQueMap_[vecPushPorts[iPort]]->push(std::static_pointer_cast<void>(pNewProcessData), true);
// PushData(vecPushPorts[iPort], pNewProcessData);
2024-06-19 06:35:05 +00:00
}
}
iDataNO++;
//每组处理数据需间隔一定时间 (运行状态且有第一步结果需休眠,否则直接处理后面的数据)
if (iStatus == TRAINSTATUS_RUN && iTagTotalCnt != 0)
{
usleep(iIntervalTime_);
}
while (g_bNoDealStepTwoFlag)
{
usleep(iIntervalTime_);
}
}
}
APP_ERROR DataDealTwoEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
//获取主摄像头车厢划分结果
std::shared_ptr<void> pVoidData0 = nullptr;
iRet = inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr == pVoidData0)
{
usleep(1000); // 1ms
continue;
}
std::shared_ptr<TrainRange> pTrainRange = std::static_pointer_cast<TrainRange>(pVoidData0);
LogInfo << "step2 start traindate:" << pTrainRange->strTrainDate << " trainname:" << pTrainRange->strTrainName
<< " trainindex:" << pTrainRange->iTrainIndex << " startframeid:" << pTrainRange->iStartFrameId
<< " endframeid:" << pTrainRange->iEndFrameId << " isEnd:" << pTrainRange->bIsEnd;
if (iDirection_ == DIRECTION_UNKNOWN)
{
/*获取该车辆行驶方向
.()
*/
std::string strFilePath = strResultPath_ + pTrainRange->strTrainDate + "/" + pTrainRange->strTrainName + "/" + "direction.txt";
int iCnt = 0;
while (!isStop_ && iCnt < 10)
{
Json::Value jvDirectionInfo;
if (MyUtils::getins()->ReadJsonInfo(jvDirectionInfo, strFilePath))
{
iDirection_ = jvDirectionInfo["direction"].asInt();
//按行驶方向获取车号在前还是属性在前
if (iDirectionAndFirst_ == DO_NOT_KNOW_DIRECTION && iDirection_ != DIRECTION_UNKNOWN)
{
iDirectionAndFirst_ = iDirection_ == DIRECTION_LEFT ? dataSourceConfig_.iLeftFirst : dataSourceConfig_.iRightFirst;
}
break;
}
usleep(500 * 1000); // 500ms
iCnt++;
}
}
/*重置开始帧,结束帧
: [50, 125][52, 124]
*/
int iSkipInterval = dataSourceConfig_.iSkipInterval;
pTrainRange->iStartFrameId = (pTrainRange->iStartFrameId + iSkipInterval - 1) / iSkipInterval * iSkipInterval;
pTrainRange->iEndFrameId = pTrainRange->iEndFrameId / iSkipInterval * iSkipInterval;
if (pTrainRange->iStartFrameId > pTrainRange->iEndFrameId)
{
pTrainRange->iStartFrameId = pTrainRange->iEndFrameId;
}
//判断第一步是否处理完毕
char szCameraNo[5] = {0};
sprintf(szCameraNo, "%03d/", engineId_ + 1);
std::string strFilePath = strResultPath_ + pTrainRange->strTrainDate + "/" + pTrainRange->strTrainName + "/" +
szCameraNo + std::to_string(pTrainRange->iEndFrameId) + ".txt";
int iReadCnt = 0;
bool bRet = false;
while (!isStop_ && iReadCnt < 30)
{
Json::Value jvFrameInfo;
bRet = MyUtils::getins()->ReadJsonInfo(jvFrameInfo, strFilePath);
if (jvFrameInfo["step1Finish"].asBool())
{
break;
}
usleep(500 * 1000); // 500ms
iReadCnt++;
}
//处理当车厢的每帧信息
MakeProcessData(pTrainRange);
// push结果汇总
2024-06-19 06:41:40 +00:00
iRet = outputQueMap_[engineName_ + "_" + std::to_string(engineId_) + "_9"]->push(std::static_pointer_cast<void>(pTrainRange), true);
2024-06-19 06:35:05 +00:00
iTrainIndex_++;
if (pTrainRange->bIsEnd)
{
InitParam();
}
}
return APP_ERR_OK;
}