赞
踩
rockit 媒体框架借鉴Google MediaPipe的先进计算图理念, 完成了朴素版本的PIPELINE v1.0升级到基于TaskGraph的PIPELINE v2.0。
APP-->new RTTaskGraph // 创建图
-->RTTaskGraph::RTTaskGraph
-->RTScheduler::RTScheduler // 创建调度器Scheduler
-->RTSchedulerQueue::RTSchedulerQueue // 创建RTSchedulerQueue,并注册RTSchedulerShared结构体
-->RTSchedulerQueue::setIdleCallback // 注册回调RTScheduler::queueIdleStateChanged
-->RTSchedulerQueue::setPauseCallback // 注册回调RTScheduler::notifySchedulerPaused
-->RTThreadPoolExecutor::RTThreadPoolExecutor // 同时创建RTExecutor,RTThreadPoolExecutor是RTExecutor的子类
-->RTThreadPool::RTThreadPool // 设置线程名称、数量、模式等信息
-->RTThreadPoolExecutor::start // 执行器开始工作
-->RTThreadPool::startWorkers
-->RTThreadPool::RTWorkerThread::RTWorkerThread
-->RtThread::RtThread // 创建RtThread对象
-->RtThread::start // 创建线程
-->RTScheduler::setDefaultExecutor // 把执行器注册到调度器中
APP-->initialize // 加载json配置文件 -->RTTaskGraph::autoBuild -->RTNodeParser::RTNodeParser // 创建RTNodeParser对象 -->RTNodeParser::parseConfigFile // 读取配置文件 -->RTNodeParser::parseConfigText -->RTNodeParser::getNodeNum // 解析配置文件的node数量 -->RTNodeParser::getNodeIDByIndex // 读取配置文件的node id -->RTTaskGraph::buildTaskNode // 创建node -->RTNodeParser::initTaskNode // 初始化当前node, -->node_proxy_parse_stub_uid // 获取当前node的RTStubUid -->node_proxy_node_create // 创建RTInputStreamManager和RTOutputStreamManager -->RTInputStreamManager::RTInputStreamManager -->RTOutputStreamManager::RTOutputStreamManager -->RT_NODE_FACTORY_CREATE_NODE // 根据从配置中获取的RTStubUid创建RTTaskNode和插件node -->RTTaskNodeFactory::createNode -->RTTaskNode::RTTaskNode // RTTaskNodeContextManager是的RTTaskNode成员变量(非指针),构造的时候会创建分配 -->RTTaskNodeContextManager::RTTaskNodeContextManager -->RTInputStreamHandler::RTInputStreamHandler // mInputHandler -->RTOutputStreamHandler::RTOutputStreamHandler // mOutputHandler -->RtMetaData::RtMetaData // mOptions -->RTNodeParser::syncOptions // 同步配置文件的node的options:node_opts、stream_opts、node_opts_extra、stream_opts_extra -->RTInputStreamManager::initialize // 同步配置文件的inputStream -->RTInputStreamManager::setStreamType -->RTOutputStreamManager::initialize // 同步配置文件的outputStream -->RTOutputStreamManager::setStreamType -->RTTaskNode::initialize // 当前node初始化 -->inputStreamInfos // 创建RTStreamInfo用来保存inputStream信息 -->RTStreamInfo::RTStreamInfo -->RTStreamInfo::setStreamId -->RTStreamInfo::setStreamName -->RTStreamInfo::setStreamType -->RTInputStreamHandler::setInputStreamManager -->outputStreamInfos // 创建RTStreamInfo用来保存ouputStream信息 -->RTStreamInfo::RTStreamInfo -->RTStreamInfo::setStreamId -->RTStreamInfo::setStreamName -->RTStreamInfo::setStreamType -->RTOutputStreamHandler::setOutputStreamManager -->RTTaskNodeContextManager::initialize -->RTTaskNodeContext::RTTaskNodeContext -->RTOutputStreamShared::RTOutputStreamShared // 创建输出共享buffer -->RTBufferListener::RTBufferListener // buffer监听 -->RTMediaBufferPool::RTMediaBufferPool // 创建buffer pool -->RTTaskGraph::autoLinkSource // 连接source -->RTTaskNode::addStreamSource // -->RTOutputStreamManager::addMirror
APP-->prepare // prepare -->RTScheduler::flush -->RTTaskGraph::prepareNodeForRun // 每个node开始prepare -->TTaskNode::prepareRun // 注册回调RTScheduler::addNodeToOpenedQueue和RTScheduler::scheduleNode -->RTInputStreamHandler ::prepareForRun // 注册回调RTTaskNode::checkIfBecameReady()和RTScheduler::scheduleNode -->RTTaskNodeContextManager::prepareForRun -->RTTaskNodeContext::prepareForRun -->RTOutputStreamShared::prepareForRun -->RTOutputStreamShared::allocAndRegisterBuffer // 创建共享buffer -->RTTaskNode::open // 调用各插件open -->RTTaskNode::nodeOpened // 调用回调sourceNodeOpenedCallback, 即RTScheduler::addNodeToOpenedQueue -->RTScheduler::addNodeToOpenedQueue // -->RTTaskNode::setSchedulerQueue //设置schedulerqueue -->RTScheduler::tryToScheduleIdleNode // 当前图层所有的source添加到schedule队列中,以确保循环调度。暂停调度队列直到添加了所有的source. -->RTScheduler::setQueuesRunning(false) -->RTScheduler::scheduleUnthrottledNodes // 添加所有的节点到调度器队列, -->RTTaskNode::getDefaultNodeContext -->RTTaskNodeContextManager::getDefaultNodeContext -->RTTaskNodeContext::resume -->RTTaskNode::checkIfBecameReady // 检查SchedulingState -->RTTaskNode::schedulingLoop // 调度循环线程,通用调度逻辑EndScheduling()(结束调度)和CheckIfBecameReady()(开启调度), // 循环执行RTTaskNodeContext调度node,直到(1) 节点not ready (2)达到最大运行数 -->RTInputStreamHandler::scheduleInvocations // 开启inputstream调度 -->RTScheduler::scheduleNode // -->RTTaskNode::getSchedulerQueue -->RTSchedulerQueue::addNode // -->RTSchedulerQueue::addItemToQueue -->RTSchedulerQueue::getTasksToSubmitToExecutor -->mIdleCallback // RTScheduler::queueIdleStateChanged 回调 -->RTTaskQueue::addTask -->RTScheduler::setQueuesRunning(true) -->RTScheduler::submitWaitingTasksOnQueues -->RTSchedulerQueue::submitWaitingTasksToExecutor -->RTSchedulerQueue::getTasksToSubmitToExecutor -->RTTaskQueue::addTask -->RTTaskNode::isSource -->RTTaskNode::setQueueSizeCallbacks // 绑定RTTaskGraph::updateThrottledNodes为伪函数,注册到RTInputStreamManager中 -->RTInputStreamHandler::setQueueSizeCallbacks -->RTInputStreamManager::setQueueSizeCallbacks -->RTTaskNode::setMaxInputStreamQueueSize // TODO -->RTTaskNode::setMaxBatchPrcoessSize // TODO
APP-->start // start
-->RTTaskGraph::startRun
-->RTScheduler::start
-->mState = STATE_RUNNING
-->RTScheduler::setQueuesRunning(true)
-->RTSchedulerQueue::setRunning(true) // mRunningCount += running ? 1 : -1; mRunningCount为开关计数
-->RTPausedCallback // RTScheduler::notifySchedulerPaused的cb
-->RTScheduler::handleIdle // (Get the ball rolling)开始运作, while循环
-->RTScheduler::tryToScheduleIdleNode
APP-->stop
-->RTScheduler::stop // stop
-->sendInterrupt // RTScheduler::notifyHasError
-->RTScheduler::notifyHasError // mShared.hasError = true
-->mState = STATE_CANCELLING //
-->RTScheduler::handleIdle // Because we have interrupt, this will cause the graph to quit.
-->RTScheduler::submitWaitingTasksOnQueues
-->RTSchedulerQueue::submitWaitingTasksToExecutor // 如果调度器队列未执行时,有节点添加,不会立刻执行,先检查待等待执行的任务,并先执行先等待的任务。
mediapipe类关系图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。