1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2020 Rockchip Electronics Co. LTD 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License"); 5*4882a593Smuzhiyun * you may not use this file except in compliance with the License. 6*4882a593Smuzhiyun * You may obtain a copy of the License at 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software 11*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS, 12*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4882a593Smuzhiyun * See the License for the specific language governing permissions and 14*4882a593Smuzhiyun * limitations under the License. 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun * author: <rimon.xu@rock-chips.com> and <martin.cheng@rock-chips.com> 17*4882a593Smuzhiyun * date: 2020-04-03 18*4882a593Smuzhiyun * module: RTTaskGraph 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #ifndef SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_ 22*4882a593Smuzhiyun #define SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #include <vector> 25*4882a593Smuzhiyun #include <memory> 26*4882a593Smuzhiyun #include <map> 27*4882a593Smuzhiyun #include <functional> 28*4882a593Smuzhiyun #include <stdarg.h> 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #include "rt_header.h" 31*4882a593Smuzhiyun #include "rt_metadata.h" 32*4882a593Smuzhiyun #include "RTGraphCommon.h" 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun typedef enum ExecutorMode { 35*4882a593Smuzhiyun EXECUTOR_THREAD_POOL, 36*4882a593Smuzhiyun EXECUTOR_THREAD_LOCAL, 37*4882a593Smuzhiyun } RTExecutorMode; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun typedef enum GraphCmd { 40*4882a593Smuzhiyun GRAPH_CMD_PREPARE = 100, 41*4882a593Smuzhiyun GRAPH_CMD_START, 42*4882a593Smuzhiyun GRAPH_CMD_STOP, 43*4882a593Smuzhiyun GRAPH_CMD_RESUME, 44*4882a593Smuzhiyun GRAPH_CMD_PAUSE, 45*4882a593Smuzhiyun GRAPH_CMD_FLUSH, 46*4882a593Smuzhiyun // for graph private command 47*4882a593Smuzhiyun GRAPH_CMD_PRIVATE_CMD, 48*4882a593Smuzhiyun // for task node command 49*4882a593Smuzhiyun GRAPH_CMD_TASK_NODE_PRIVATE_CMD, 50*4882a593Smuzhiyun GRAPH_CMD_MAX, 51*4882a593Smuzhiyun } RTGraphCmd; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun class RTInputStreamManager; 54*4882a593Smuzhiyun class RTOutputStreamManager; 55*4882a593Smuzhiyun class RTTaskNode; 56*4882a593Smuzhiyun class RTGraphInputStream; 57*4882a593Smuzhiyun class RTGraphOutputStream; 58*4882a593Smuzhiyun class RTExecutor; 59*4882a593Smuzhiyun class RTScheduler; 60*4882a593Smuzhiyun class RTMediaBuffer; 61*4882a593Smuzhiyun class RTGraphParser; 62*4882a593Smuzhiyun class RTTaskGraphConfig; 63*4882a593Smuzhiyun class RTTaskGraphStat; 64*4882a593Smuzhiyun class RTTaskGraph { 65*4882a593Smuzhiyun public: 66*4882a593Smuzhiyun explicit RTTaskGraph(const char* tagName); 67*4882a593Smuzhiyun explicit RTTaskGraph(UINT64 uid, const char* tagName); 68*4882a593Smuzhiyun virtual ~RTTaskGraph(); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun public: 71*4882a593Smuzhiyun // external common api 72*4882a593Smuzhiyun UINT64 getUid(); 73*4882a593Smuzhiyun std::string getName(); 74*4882a593Smuzhiyun RT_RET autoBuild(const char* config, RT_BOOL isFileType = RT_TRUE); 75*4882a593Smuzhiyun RT_RET prepare(RtMetaData *params = RT_NULL); 76*4882a593Smuzhiyun RT_RET start(); 77*4882a593Smuzhiyun RT_RET stop(RT_BOOL block = RT_TRUE); 78*4882a593Smuzhiyun RT_RET resume(); 79*4882a593Smuzhiyun RT_RET pause(RT_BOOL block = RT_FALSE); 80*4882a593Smuzhiyun RT_RET flush(); 81*4882a593Smuzhiyun RT_RET reset(); 82*4882a593Smuzhiyun RT_RET release(); 83*4882a593Smuzhiyun RT_RET invoke(INT32 cmd, RtMetaData *params); 84*4882a593Smuzhiyun RT_RET waitForObservedOutput(INT64 timeoutUs = -1); 85*4882a593Smuzhiyun RT_RET waitUntilDone(INT64 timeoutUs = -1); 86*4882a593Smuzhiyun RT_RET waitUntilEos(INT64 timeoutUs = -1); 87*4882a593Smuzhiyun RT_RET queryStat(RTTaskGraphStat *stat); 88*4882a593Smuzhiyun RT_RET dump(); 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun RTCBHandle observeOutputStream( 91*4882a593Smuzhiyun const std::string streamName, 92*4882a593Smuzhiyun std::function<RT_RET(RTMediaBuffer *)> streamCallback); 93*4882a593Smuzhiyun RT_RET cancelObserveOutputStream(RTCBHandle handle); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun public: 96*4882a593Smuzhiyun // deprecated api 97*4882a593Smuzhiyun RT_RET observeOutputStream(const std::string& streamName, 98*4882a593Smuzhiyun INT32 streamId, 99*4882a593Smuzhiyun std::function<RT_RET(RTMediaBuffer *)> streamCallback); 100*4882a593Smuzhiyun RT_RET cancelObserveOutputStream(INT32 streamId); 101*4882a593Smuzhiyun RT_RET addSubGraph(const char *graphConfigFile); 102*4882a593Smuzhiyun RT_RET removeSubGraph(const char *graphConfigFile); 103*4882a593Smuzhiyun RT_BOOL hasMirror(INT32 nodeId, RT_BOOL nodeOnly = RT_FALSE); 104*4882a593Smuzhiyun RT_RET setExternalExecutor(RTExecutor *executor); 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun public: 107*4882a593Smuzhiyun // external link graph api 108*4882a593Smuzhiyun RTLinkHandle addDownGraph(RTTaskGraph *graph, std::string srcName, std::string dstName); 109*4882a593Smuzhiyun RT_RET removeDownGraph(RTLinkHandle handle); 110*4882a593Smuzhiyun RT_RET setGraphOutputStreamAddMode(RTGraphIOStreamMode mode); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun public: 113*4882a593Smuzhiyun // external link node api 114*4882a593Smuzhiyun RTTaskNode* createNode(std::string nodeConfig, std::string streamConfig); 115*4882a593Smuzhiyun RT_RET linkNode(RTTaskNode *srcNode, RTTaskNode *dstNode); 116*4882a593Smuzhiyun template <class T, class... Args> linkNode(T src,T dst,Args...rest)117*4882a593Smuzhiyun RT_RET linkNode(T src, T dst, Args... rest) { 118*4882a593Smuzhiyun return linkMultiNode(src, dst, rest...); 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun RT_RET unlinkNode(RTTaskNode *srcNode, RTTaskNode *dstNode); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun RT_BOOL hasLinkMode(std::string mode); 123*4882a593Smuzhiyun RT_RET selectLinkMode(std::string mode); 124*4882a593Smuzhiyun template <class T, class... Args> selectLinkMode(T arg1,T arg2,Args...rest)125*4882a593Smuzhiyun RT_RET selectLinkMode(T arg1, T arg2, Args... rest) { 126*4882a593Smuzhiyun return selectMultiMode(arg1, arg2, rest...); 127*4882a593Smuzhiyun } 128*4882a593Smuzhiyun RT_RET clearLinkShips(); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun public: 131*4882a593Smuzhiyun // internal api 132*4882a593Smuzhiyun void sendInterrupt(std::string reason); 133*4882a593Smuzhiyun RT_BOOL unthrottleSources(); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun protected: 136*4882a593Smuzhiyun RT_RET addPacketToInputStream(std::string streamName, INT64 timeoutUs, RTMediaBuffer *packet); 137*4882a593Smuzhiyun RTCBHandle addOutputStreamPoller(const std::string streamName); 138*4882a593Smuzhiyun RT_RET removeOutputStreamPoller(RTCBHandle handle); 139*4882a593Smuzhiyun RT_RET checkInputStreamFull(std::string streamName); onReceiveOutputStreams(RTGraphOutputStream * graphOutputStream)140*4882a593Smuzhiyun virtual RT_RET onReceiveOutputStreams(RTGraphOutputStream *graphOutputStream) { return RT_OK; } 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun private: 143*4882a593Smuzhiyun template <class T, class... Args> linkMultiNode(T src,T dst,Args...rest)144*4882a593Smuzhiyun RT_RET linkMultiNode(T src, T dst, Args... rest) { 145*4882a593Smuzhiyun RT_RET ret = linkNode(src, dst); 146*4882a593Smuzhiyun if (ret != RT_OK) { 147*4882a593Smuzhiyun RT_LOGE("src node %d dst node %d link failed", src->getID(), dst->getID()); 148*4882a593Smuzhiyun } else { 149*4882a593Smuzhiyun linkMultiNode(dst, rest...); 150*4882a593Smuzhiyun } 151*4882a593Smuzhiyun return ret; 152*4882a593Smuzhiyun } 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun template <class T> linkMultiNode(T end)155*4882a593Smuzhiyun RT_RET linkMultiNode(T end) { 156*4882a593Smuzhiyun return RT_OK; 157*4882a593Smuzhiyun } 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun template <class T, class... Args> selectMultiMode(T arg1,T arg2,Args...rest)160*4882a593Smuzhiyun RT_RET selectMultiMode(T arg1, T arg2, Args... rest) { 161*4882a593Smuzhiyun RT_RET ret = selectLinkMode(arg1); 162*4882a593Smuzhiyun if (ret != RT_OK) { 163*4882a593Smuzhiyun RT_LOGE("select mode %s failed", arg1); 164*4882a593Smuzhiyun } else { 165*4882a593Smuzhiyun selectMultiMode(arg2, rest...); 166*4882a593Smuzhiyun } 167*4882a593Smuzhiyun return ret; 168*4882a593Smuzhiyun } 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun template <class T> selectMultiMode(T end)171*4882a593Smuzhiyun RT_RET selectMultiMode(T end) { 172*4882a593Smuzhiyun RT_RET ret = selectLinkMode(end); 173*4882a593Smuzhiyun if (ret != RT_OK) { 174*4882a593Smuzhiyun RT_LOGE("select mode %s failed", end); 175*4882a593Smuzhiyun } 176*4882a593Smuzhiyun return ret; 177*4882a593Smuzhiyun } 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun private: 180*4882a593Smuzhiyun RT_RET autoLinkSource(); 181*4882a593Smuzhiyun RT_RET autoUnlinkSource(INT32 nodeId); 182*4882a593Smuzhiyun RT_RET prepareForRun(RtMetaData *options); 183*4882a593Smuzhiyun RT_RET prepareNodeForRun(RTTaskNode *node, RtMetaData *options); 184*4882a593Smuzhiyun RT_RET cleanupAfterRun(); 185*4882a593Smuzhiyun void updateThrottledNodes(RTInputStreamManager* stream, bool *streamWasFull); 186*4882a593Smuzhiyun void updateThrottledNodesNoLock(RTInputStreamManager* stream, bool *streamWasFull); 187*4882a593Smuzhiyun RT_RET buildTaskNode(INT32 pipeId, INT32 nodeId, RTGraphParser* nodeParser); 188*4882a593Smuzhiyun RT_RET buildExecutors(RTGraphParser *parser); 189*4882a593Smuzhiyun RT_RET buildNodes(RTGraphParser *parser); 190*4882a593Smuzhiyun RT_RET buildLinkModes(RTGraphParser *parser); 191*4882a593Smuzhiyun RT_RET buildSubGraph(RTGraphParser *graphParser); 192*4882a593Smuzhiyun RT_RET notifyOutputStreams(RTGraphOutputStream *graphOutputStream); 193*4882a593Smuzhiyun RTTaskNode *createNodeByText(const char *graphConfig); 194*4882a593Smuzhiyun std::vector<std::vector<INT32>> parseLinkShip(std::string linkShip); 195*4882a593Smuzhiyun RT_RET linkNode(INT32 srcNodeId, INT32 dstNodeId); 196*4882a593Smuzhiyun RT_RET unlinkNode(INT32 srcNodeId, INT32 dstNodeId); 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun RT_RET setupGraphInputStream(std::string streamName); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun protected: 201*4882a593Smuzhiyun UINT64 mGraphUid; 202*4882a593Smuzhiyun std::string mTagName; 203*4882a593Smuzhiyun RT_BOOL mHasError; 204*4882a593Smuzhiyun RtMutex mFullInputStreamsMutex; 205*4882a593Smuzhiyun RtMutex mErrorMutex; 206*4882a593Smuzhiyun RTScheduler *mScheduler; 207*4882a593Smuzhiyun RtMutex *mLock; 208*4882a593Smuzhiyun RTTaskGraphConfig *mGraphConfig; 209*4882a593Smuzhiyun RTGraphIOStreamMode mIoStreamMode; 210*4882a593Smuzhiyun INT32 mThreadNum; 211*4882a593Smuzhiyun std::map<INT32, RTExecutor *> mExecutors; 212*4882a593Smuzhiyun RTExecutor *mExtExecutor; 213*4882a593Smuzhiyun std::map<INT32/* node id */, RTTaskNode *> mNodes; 214*4882a593Smuzhiyun std::map<INT32, std::vector<RTInputStreamManager *>> mFullInputStreams; 215*4882a593Smuzhiyun std::map<INT32/* node id */, RTInputStreamManager *> mInputManagers; 216*4882a593Smuzhiyun std::map<INT32/* node id */, RTOutputStreamManager *> mOutputManagers; 217*4882a593Smuzhiyun // The graph output streams. 218*4882a593Smuzhiyun std::map<INT32, RTGraphOutputStream *> mGraphOutputStreams; 219*4882a593Smuzhiyun std::map<INT32, RTGraphInputStream *> mGraphInputStreams; 220*4882a593Smuzhiyun // Maps graph input streams to their virtual node ids. 221*4882a593Smuzhiyun std::map<std::string, INT32> mGraphInputStreamIds; 222*4882a593Smuzhiyun std::map<std::string, std::string> mLinkShips; 223*4882a593Smuzhiyun std::vector<std::string> mLinkModes; 224*4882a593Smuzhiyun // Compatible with old interfaces 225*4882a593Smuzhiyun std::map<INT32/* old stream id */, std::string> mOutputStreamCompMaps; 226*4882a593Smuzhiyun std::map<INT32/* old stream id */, RTCBHandle> mGraphOutCompMaps; 227*4882a593Smuzhiyun }; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun #endif // SRC_RT_TASK_APP_GRAPH_RTTASKGRAPH_H_ 230