/* * Copyright 2020 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * author: and * date: 2020-04-03 * module: RTTaskGraph */ #ifndef SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_ #define SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_ #include #include #include #include #include #include "rt_header.h" #include "rt_metadata.h" #include "RTGraphCommon.h" typedef enum ExecutorMode { EXECUTOR_THREAD_POOL, EXECUTOR_THREAD_LOCAL, } RTExecutorMode; typedef enum GraphCmd { GRAPH_CMD_PREPARE = 100, GRAPH_CMD_START, GRAPH_CMD_STOP, GRAPH_CMD_RESUME, GRAPH_CMD_PAUSE, GRAPH_CMD_FLUSH, // for graph private command GRAPH_CMD_PRIVATE_CMD, // for task node command GRAPH_CMD_TASK_NODE_PRIVATE_CMD, GRAPH_CMD_MAX, } RTGraphCmd; class RTInputStreamManager; class RTOutputStreamManager; class RTTaskNode; class RTGraphInputStream; class RTGraphOutputStream; class RTExecutor; class RTScheduler; class RTMediaBuffer; class RTGraphParser; class RTTaskGraphConfig; class RTTaskGraphStat; class RTTaskGraph { public: explicit RTTaskGraph(const char* tagName); explicit RTTaskGraph(UINT64 uid, const char* tagName); virtual ~RTTaskGraph(); public: // external common api UINT64 getUid(); std::string getName(); RT_RET autoBuild(const char* config, RT_BOOL isFileType = RT_TRUE); RT_RET prepare(RtMetaData *params = RT_NULL); RT_RET start(); RT_RET stop(RT_BOOL block = RT_TRUE); RT_RET resume(); RT_RET pause(RT_BOOL block = RT_FALSE); RT_RET flush(); RT_RET reset(); RT_RET release(); RT_RET invoke(INT32 cmd, RtMetaData *params); RT_RET waitForObservedOutput(INT64 timeoutUs = -1); RT_RET waitUntilDone(INT64 timeoutUs = -1); RT_RET waitUntilEos(INT64 timeoutUs = -1); RT_RET queryStat(RTTaskGraphStat *stat); RT_RET dump(); RTCBHandle observeOutputStream( const std::string streamName, std::function streamCallback); RT_RET cancelObserveOutputStream(RTCBHandle handle); public: // deprecated api RT_RET observeOutputStream(const std::string& streamName, INT32 streamId, std::function streamCallback); RT_RET cancelObserveOutputStream(INT32 streamId); RT_RET addSubGraph(const char *graphConfigFile); RT_RET removeSubGraph(const char *graphConfigFile); RT_BOOL hasMirror(INT32 nodeId, RT_BOOL nodeOnly = RT_FALSE); RT_RET setExternalExecutor(RTExecutor *executor); public: // external link graph api RTLinkHandle addDownGraph(RTTaskGraph *graph, std::string srcName, std::string dstName); RT_RET removeDownGraph(RTLinkHandle handle); RT_RET setGraphOutputStreamAddMode(RTGraphIOStreamMode mode); public: // external link node api RTTaskNode* createNode(std::string nodeConfig, std::string streamConfig); RT_RET linkNode(RTTaskNode *srcNode, RTTaskNode *dstNode); template RT_RET linkNode(T src, T dst, Args... rest) { return linkMultiNode(src, dst, rest...); } RT_RET unlinkNode(RTTaskNode *srcNode, RTTaskNode *dstNode); RT_BOOL hasLinkMode(std::string mode); RT_RET selectLinkMode(std::string mode); template RT_RET selectLinkMode(T arg1, T arg2, Args... rest) { return selectMultiMode(arg1, arg2, rest...); } RT_RET clearLinkShips(); public: // internal api void sendInterrupt(std::string reason); RT_BOOL unthrottleSources(); protected: RT_RET addPacketToInputStream(std::string streamName, INT64 timeoutUs, RTMediaBuffer *packet); RTCBHandle addOutputStreamPoller(const std::string streamName); RT_RET removeOutputStreamPoller(RTCBHandle handle); RT_RET checkInputStreamFull(std::string streamName); virtual RT_RET onReceiveOutputStreams(RTGraphOutputStream *graphOutputStream) { return RT_OK; } private: template RT_RET linkMultiNode(T src, T dst, Args... rest) { RT_RET ret = linkNode(src, dst); if (ret != RT_OK) { RT_LOGE("src node %d dst node %d link failed", src->getID(), dst->getID()); } else { linkMultiNode(dst, rest...); } return ret; } template RT_RET linkMultiNode(T end) { return RT_OK; } template RT_RET selectMultiMode(T arg1, T arg2, Args... rest) { RT_RET ret = selectLinkMode(arg1); if (ret != RT_OK) { RT_LOGE("select mode %s failed", arg1); } else { selectMultiMode(arg2, rest...); } return ret; } template RT_RET selectMultiMode(T end) { RT_RET ret = selectLinkMode(end); if (ret != RT_OK) { RT_LOGE("select mode %s failed", end); } return ret; } private: RT_RET autoLinkSource(); RT_RET autoUnlinkSource(INT32 nodeId); RT_RET prepareForRun(RtMetaData *options); RT_RET prepareNodeForRun(RTTaskNode *node, RtMetaData *options); RT_RET cleanupAfterRun(); void updateThrottledNodes(RTInputStreamManager* stream, bool *streamWasFull); void updateThrottledNodesNoLock(RTInputStreamManager* stream, bool *streamWasFull); RT_RET buildTaskNode(INT32 pipeId, INT32 nodeId, RTGraphParser* nodeParser); RT_RET buildExecutors(RTGraphParser *parser); RT_RET buildNodes(RTGraphParser *parser); RT_RET buildLinkModes(RTGraphParser *parser); RT_RET buildSubGraph(RTGraphParser *graphParser); RT_RET notifyOutputStreams(RTGraphOutputStream *graphOutputStream); RTTaskNode *createNodeByText(const char *graphConfig); std::vector> parseLinkShip(std::string linkShip); RT_RET linkNode(INT32 srcNodeId, INT32 dstNodeId); RT_RET unlinkNode(INT32 srcNodeId, INT32 dstNodeId); RT_RET setupGraphInputStream(std::string streamName); protected: UINT64 mGraphUid; std::string mTagName; RT_BOOL mHasError; RtMutex mFullInputStreamsMutex; RtMutex mErrorMutex; RTScheduler *mScheduler; RtMutex *mLock; RTTaskGraphConfig *mGraphConfig; RTGraphIOStreamMode mIoStreamMode; INT32 mThreadNum; std::map mExecutors; RTExecutor *mExtExecutor; std::map mNodes; std::map> mFullInputStreams; std::map mInputManagers; std::map mOutputManagers; // The graph output streams. std::map mGraphOutputStreams; std::map mGraphInputStreams; // Maps graph input streams to their virtual node ids. std::map mGraphInputStreamIds; std::map mLinkShips; std::vector mLinkModes; // Compatible with old interfaces std::map mOutputStreamCompMaps; std::map mGraphOutCompMaps; }; #endif // SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_