diff --git a/src/core/processingUnit/CBStage.cpp b/src/core/processingUnit/CBStage.cpp index 34b6c751..d046e1de 100644 --- a/src/core/processingUnit/CBStage.cpp +++ b/src/core/processingUnit/CBStage.cpp @@ -402,10 +402,11 @@ int CBStage::allocateNode2SelfBuffers(const PSysLink& psysLink, uint32_t bufferS } int CBStage::setTerminalLinkAndAllocNode2SelfBuffers(const GraphLink** links, uint8_t numOfLink) { + CheckAndLogError(!links, UNKNOWN_ERROR, "%s: links is nullptr", __func__); for (uint8_t i = 0U; i < numOfLink; i++) { const GraphLink* link = links[i]; - if (!link->isActive) { + if (!link || !link->isActive) { continue; } const bool related = ((link->srcNode != nullptr) && @@ -416,7 +417,7 @@ int CBStage::setTerminalLinkAndAllocNode2SelfBuffers(const GraphLink** links, ui continue; } - PSysLink psysLink; + PSysLink psysLink = {}; switch (link->type) { case LinkType::Source2Node: psysLink.srcNodeCtxId = 0xFF; @@ -425,12 +426,12 @@ int CBStage::setTerminalLinkAndAllocNode2SelfBuffers(const GraphLink** links, ui psysLink.dstTermId = link->destTerminalId; break; case LinkType::Node2Node: - if (link->destNode->contextId == mOuterNodeCtxId) { + if (link->destNode && link->destNode->contextId == mOuterNodeCtxId) { psysLink.srcNodeCtxId = 0xFF; // can't know psys ctx id of other node psysLink.srcTermId = 0xFF; psysLink.dstNodeCtxId = mContextId; psysLink.dstTermId = link->destTerminalId; - } else if (link->srcNode->contextId == mOuterNodeCtxId) { + } else if (link->srcNode && link->srcNode->contextId == mOuterNodeCtxId) { psysLink.srcNodeCtxId = mContextId; psysLink.srcTermId = link->srcTerminalId; psysLink.dstNodeCtxId = 0xFF; @@ -454,10 +455,12 @@ int CBStage::setTerminalLinkAndAllocNode2SelfBuffers(const GraphLink** links, ui break; } - psysLink.streamingMode = link->linkConfiguration->streamingMode; + if (link->linkConfiguration) { + psysLink.streamingMode = link->linkConfiguration->streamingMode; + } psysLink.delayedLink = link->frameDelay; - if (link->type == LinkType::Node2Self) { + if (link->type == LinkType::Node2Self && link->linkConfiguration) { const int ret = allocateNode2SelfBuffers(psysLink, link->linkConfiguration->bufferSize); CheckAndLogError(ret != OK, NO_MEMORY, "Failed to alloc node2self buffer"); } diff --git a/src/core/processingUnit/PipeLine.cpp b/src/core/processingUnit/PipeLine.cpp index afd82f7b..f2eca5e2 100644 --- a/src/core/processingUnit/PipeLine.cpp +++ b/src/core/processingUnit/PipeLine.cpp @@ -331,12 +331,14 @@ status_t PipeLine::updateConfigurationSettingForPtz(bool isKeyResChanged) { } status_t PipeLine::createPSysGraph(int32_t numLinks, GraphLink** links) { + CheckAndLogError(!links, UNKNOWN_ERROR, "%s: links is nullptr", __func__); + mPSysGraph.links.clear(); std::map nodes; // for (int32_t i = 0; i < numLinks; i++) { const GraphLink* link = links[i]; - if (!link->isActive) { + if (!link || !link->isActive) { continue; } @@ -374,7 +376,7 @@ status_t PipeLine::createPSysGraph(int32_t numLinks, GraphLink** links) { if (link->type != LinkType::Node2Node && link->type != LinkType::Node2Self) { continue; } - if (link->srcNode->type == NodeTypes::Isys) { + if (!link->srcNode || !link->destNode || link->srcNode->type == NodeTypes::Isys) { continue; } diff --git a/src/platformdata/gc/GraphConfig.cpp b/src/platformdata/gc/GraphConfig.cpp index e4f2a001..0e24672a 100644 --- a/src/platformdata/gc/GraphConfig.cpp +++ b/src/platformdata/gc/GraphConfig.cpp @@ -676,6 +676,9 @@ void GraphConfig::getStaticGraphConfigData(const std::mapisActive) || (link->destNode == nullptr) || (link->destNode->type == NodeTypes::Isys)) { @@ -713,11 +716,11 @@ void GraphConfig::saveOuterNode(const GraphLink* link, StaticGraphInfo* graph) { void GraphConfig::saveLink(int32_t streamId, const GraphLink* link, std::map* streams, StaticGraphInfo* graph) { - if (!link->isActive) { + if (!link || !graph || !link->isActive) { return; } // Ignore link: src="-1:Sensor:0" dest="2:Isys:0" type="Source2Node" - if ((link->type == LinkType::Source2Node) && (link->destNode->type == NodeTypes::Isys)) { + if ((link->type == LinkType::Source2Node) && (link->destNode && link->destNode->type == NodeTypes::Isys)) { return; } @@ -727,7 +730,7 @@ void GraphConfig::saveLink(int32_t streamId, const GraphLink* link, // src="-1:LscBuffer:0" dest="0:LbffBayer:4" type="Source2Node" ipuLink.isEdge = true; hasNecessaryNode = link->destNode; - } else if ((link->type == LinkType::Node2Node) && (link->srcNode->type == NodeTypes::Isys)) { + } else if ((link->type == LinkType::Node2Node) && (link->srcNode && link->srcNode->type == NodeTypes::Isys)) { // src="2:Isys:1" dest="0:LbffBayer:3" type="Node2Node" ipuLink.isEdge = true; hasNecessaryNode = link->destNode; @@ -737,12 +740,14 @@ void GraphConfig::saveLink(int32_t streamId, const GraphLink* link, ipuLink.isEdge = true; hasNecessaryNode = link->srcNode; // Find output stream - for (auto& s : *streams) { - if (((link->dest == GraphElementType::ImageMp) && (s.first == HwSink::ImageMpSink)) || - ((link->dest == GraphElementType::ImageDp) && (s.first == HwSink::ImageDpSink))) { - ipuLink.stream = s.second; - streams->erase(s.first); - break; + if (streams) { + for (auto& s : *streams) { + if (((link->dest == GraphElementType::ImageMp) && (s.first == HwSink::ImageMpSink)) || + ((link->dest == GraphElementType::ImageDp) && (s.first == HwSink::ImageDpSink))) { + ipuLink.stream = s.second; + streams->erase(s.first); + break; + } } } }