/* * 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. * */ #ifndef SRC_RT_TASK_TASK_GRAPH_RTTASKNODEBASE_H_ #define SRC_RT_TASK_TASK_GRAPH_RTTASKNODEBASE_H_ #include "string.h" #include #include #include "rt_header.h" #include "RTTaskNodeContext.h" #include "RTTaskNodeContextManager.h" #include "RTTaskNodeOptions.h" #include "RTTaskNodeFactory.h" #include "RTNodeCommon.h" #include "RTStreamInfo.h" typedef struct _RTTaskNodeInfo { INT32 nodeId; std::string nodeName; } RTTaskNodeInfo; class RTBufferListener; class RTInputStreamHandler; class RTInputStreamManager; class RTOutputStreamHandler; class RTOutputStreamManager; class RTSchedulerQueue; class RTMediaBufferPool; class RTTaskNodeStat; class RTTaskNodeBase { public: RTTaskNodeBase(); virtual ~RTTaskNodeBase(); RT_RET prepareForRun(RtMetaData* options, std::function sourceNodeOpenedCallback, std::function scheduleCallback); RT_RET cleanupAfterRun(); INT32 getID() { return mNodeId; } RtMetaData* getOptions() { return mOptions; } RT_BOOL isSource() const; RT_BOOL isSink() const; RT_BOOL hasMirror(RT_BOOL nodeOnly = RT_FALSE) const; INT32 numInputStreams() const; INT32 numOutputStreams() const; RT_RET processNode(RTTaskNodeContext *packet); void nodeOpened(); bool closed(); RT_RET flush(); RT_RET reset(); RT_BOOL isDone(); RT_RET closeNode(); RT_RET closeInputStreams(); RT_RET closeOutputStreams(); void setMaxInputStreamQueueSize(INT32 maxQueueSize); void setMaxBatchPrcoessSize(INT32 maxBatchSize); void setQueueSizeCallbacks( std::function becomesFullCallback, std::function becomesNotFullCallback, std::function becomesEmptyCallback); RT_RET initialize(INT32 node_id, RTTaskNodeInfo *nodeInfo) { return RT_OK; } RT_RET initialize( INT32 nodeId, RTTaskNodeInfo *nodeInfo, RTInputStreamManager *inputManager, RTOutputStreamManager *outputManager); RT_RET initialize(INT32 nodeId, RTTaskNodeInfo *nodeInfo, const std::vector &inputManagers, const std::vector &outputManagers); RT_RET addStreamSource( INT32 streamId, RTOutputStreamManager *lastOutputManager); RT_RET addStreamSource(RTOutputStreamManager *lastOutputManager); RT_RET removeStreamSource(RTOutputStreamManager *outputManager); const std::vector &getStreamSource() { return mSourceNodes; } void checkIfBecameReady(); RT_BOOL tryToBeginScheduling(); void schedulingLoop(); void endScheduling(); // Returns a pointer to the default calculator context that is used for // sequential execution. A source node should always reuse its default // calculator context. RTTaskNodeContext* getDefaultNodeContext() const { return mNodeContextManager.getDefaultNodeContext(); } RTSchedulerQueue* getSchedulerQueue() const { return mSchedulerQueue; } // Sets the scheduler queue the node is assigned to. void setSchedulerQueue(RTSchedulerQueue* queue) { mSchedulerQueue = queue; } RT_RET sendInterrupt(std::string reason); RT_RET cancelInterrupt(std::string reason); RT_RET dump(); RT_RET attachOutStreamPool(RTMediaBufferPool *pool, std::string streamType = RT_NONE); RT_RET detachOutStreamPool(std::string streamType = RT_NONE); void setComponentUid(INT32 componentUid); INT32 getComponentUid(); public: virtual RT_RET open(RTTaskNodeContext *context) = 0; virtual RT_RET process(RTTaskNodeContext *context) = 0; virtual RT_RET close(RTTaskNodeContext *context) = 0; virtual RT_RET invoke(RtMetaData *meta); virtual RT_RET queryStat(RTTaskNodeStat *stat); virtual RT_RET queryStatInternal(RTTaskNodeStat *nodeStat) { return RT_ERR_UNSUPPORT; } protected: virtual RT_RET initSupportOptions() { return RT_OK; } virtual RT_RET invokeInternal(RtMetaData *meta) { return RT_ERR_UNSUPPORT; } private: RT_RET addInputStreams(RTInputStreamManager *inputManager); RT_RET addOutputStreams(RTOutputStreamManager *outputManager); RT_RET prepareOptionsForRun(); RT_RET processPassThrough(RTTaskNodeContext *nodeContext); protected: INT32 mNodeId; RTInputStreamHandler *mInputHandler; RTOutputStreamHandler *mOutputHandler; RtMutex mMutex; INT32 mCurrentInScheduling = 0; INT32 mMaxInScheduling = 1; // SchedulingState incidates the current state of the node scheduling process. // There are four possible transitions: // (a) From kIdle to kScheduling. // Any thread that makes this transition becomes the scheduling thread and // will be responsible for preparing and scheduling all possible invocations. // (b) From kScheduling to kSchedulingPending. // Any thread, except the scheduling thread, can make this transition. // kSchedulingPending indicates that some recent changes require the // scheduling thread to recheck the node readiness after current scheduling // iteration. // (c) From kSchedulingPending to kScheduling. // Made by the scheduling thread to indicate that it has already caught up // with all the recent changes that can affect node readiness. // (d) From kScheduling to kIdle. Made by the scheduling thread when there is // no more scheduling work to be done. enum RTSchedulingState { kIdle = 0, // kScheduling = 1, // kSchedulingPending = 2 }; RTSchedulingState mSchedulingState = kIdle; RTTaskNodeContextManager mNodeContextManager; RtMetaData *mOptions; std::function mSourceNodeOpenedCallback; // The status of the current Calculator that this CalculatorNode // is wrapping. kStateActive is currently used only for source nodes. enum RTNodeStatus { kStateUninitialized = 0, kStatePrepared = 1, kStateOpened = 2, kStateActive = 3, kStateClosed = 4 }; RTNodeStatus mStatus = kStateUninitialized; RTSchedulerQueue *mSchedulerQueue = NULL; std::map mSupportOptions; std::vector mSourceNodes; std::vector mInputStreamInfos; std::vector mOutputStreamInfos; RT_BOOL mIsPassThrough; RtReference *mProcRef; INT32 mComponentUid; }; #endif // SRC_RT_TASK_TASK_GRAPH_RTTASKNODEBASE_H_