android OMX相关2: allocateNode流程详解

转载请注明:https://www.jianshu.com/p/0cb16c896c36

以RK3399为例

相关数据结构:


中心主题.png

OMX::allocateNode -> new OMXNodeInstance
-> OMXMaster::makeComponentInstance -> 从名称插件map中查到名字对应的插件 OMXPluginBase *plugin = mPluginByComponentName.valueAt(index) -> plugin->makeComponentInstance
-> RKOMXPlugin::makeComponentInstance  如果用到了插件libstagefrighthw.so
    ->对Vector<RKOMXCore*> mCores循环  mCores存着编码器和解码器各一
    -> 调用core->mGetHandle句柄
    -> Rockchip_OMX_Core: RKOMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks)
        创建ROCKCHIP_OMX_COMPONENT *loadComponent 对象, 
        loadComponent->libName = "libomxvpu_enc.so", loadComponent->componentName = "rk.omx_enc"
    -> Rockchip_OMX_Component_Register: Rockchip_OMX_ComponentLoad(loadComponent)
    -> dlopen(libomxvpu_enc.so) -> dlsym("Rockchip_OMX_ComponentConstructor")  对应代码位于hardware_rockchip\omx_il\component\video\enc
        -> Rkvpu_OMX_Venc: Rockchip_OMX_ComponentConstructor
            -> Rockchip_OMX_Basecomponent: Rockchip_OMX_BaseComponent_Constructor(OMX_HANDLETYPE hComponent)
                ->构建变量ROCKCHIP_OMX_BASECOMPONENT *pRockchipComponent,  pOMXComponent->pComponentPrivate=pRockchipComponent
                ->创建互斥量:Rockchip_OSAL_SemaphoreCreate(&pRockchipComponent->msgSemaphoreHandle),
                    Rockchip_OSAL_MutexCreate(&pRockchipComponent->compMutex),
                    Rockchip_OSAL_SignalCreate(&pRockchipComponent->abendStateEvent)
                ->Rockchip_OSAL_QueueCreate(&pRockchipComponent->messageQ, MAX_QUEUE_ELEMENTS);创建消息队列
                -> Rockchip_OSAL_ThreadCreate(&pRockchipComponent->hMessageHandler, Rockchip_OMX_MessageHandlerThread, pOMXComponent);  创建消息处理线程Rockchip_OMX_MessageHandlerThread
                -> 设置几个函数指针
                        pOMXComponent->GetComponentVersion = &Rockchip_OMX_GetComponentVersion;
                        pOMXComponent->SendCommand         = &Rockchip_OMX_SendCommand;   //用于给消息队列发送指令
                        pOMXComponent->GetState            = &Rockchip_OMX_GetState;
                        pOMXComponent->SetCallbacks        = &Rockchip_OMX_SetCallbacks;
                        pOMXComponent->UseEGLImage         = &Rockchip_OMX_UseEGLImage;
            ->>>>>>Rockchip_OMX_Basecomponent: Rockchip_OMX_BaseComponent_Constructor end            
            ->Rockchip_OMX_Baseport: Rockchip_OMX_Port_Constructor(pOMXComponent)
                -> pRockchipComponent = (ROCKCHIP_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate
                -> 设置版本号,port数量为ALL_PORT_NUM = 2, INPUT_PORT_INDEX = 1
                    INIT_SET_SIZE_VERSION(&pRockchipComponent->portParam, OMX_PORT_PARAM_TYPE);
                    pRockchipComponent->portParam.nPorts = ALL_PORT_NUM;
                    pRockchipComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
                    pRockchipPort = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_BASEPORT) * ALL_PORT_NUM);
                ->  构建input port: pRockchipInputPort
                    pRockchipComponent->pRockchipPort = pRockchipPort; 利用中间变量创建两个队列
                    pRockchipInputPort = &pRockchipPort[INPUT_PORT_INDEX];
                    Rockchip_OSAL_QueueCreate(&pRockchipInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
                    Rockchip_OSAL_QueueCreate(&pRockchipInputPort->securebufferQ, MAX_QUEUE_ELEMENTS);
                    pRockchipInputPort->extendBufferHeader = Rockchip_OSAL_Malloc(sizeof(ROCKCHIP_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
                    ...
                ->  构建output buffer : pRockchipOutputPort
                -> 给返回参数设置函数指针
                    pOMXComponent->EmptyThisBuffer = &Rockchip_OMX_EmptyThisBuffer;
                    pOMXComponent->FillThisBuffer  = &Rockchip_OMX_FillThisBuffer;
            ->>>>>>  Rockchip_OMX_Baseport: Rockchip_OMX_Port_Constructor end
            ->构建对象 RKVPU_OMX_VIDEOENC_COMPONENT *pVideoEnc
                ->pVideoEnc->hSharedMemory 这个字段存着"/dev/ion" 这个文件的句柄
            ->设置 pRockchipComponent 的各种版本信息
                pRockchipComponent->hComponentHandle = pVideoEnc(把上一步的共享内存句柄赋值到这里)
                pRockchipComponent->bMultiThreadProcess = OMX_TRUE;
                pRockchipComponent->codecType = HW_VIDEO_ENC_CODEC;
            -> 设置pVideoEnc的信息
                pVideoEnc->bFirstFrame = OMX_TRUE;
                pVideoEnc->bFirstInput = OMX_TRUE;
                pVideoEnc->bFirstOutput = OMX_TRUE;
                pVideoEnc->configChange = OMX_FALSE;
                pVideoEnc->bStoreMetaData = OMX_FALSE;
                pVideoEnc->bPrependSpsPpsToIdr = OMX_FALSE;
                pVideoEnc->bRkWFD = OMX_FALSE;
                pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter
                pVideoEnc->quantization.nQpP = 5; // P frame quantization parameter
                pVideoEnc->quantization.nQpB = 5; // B frame quantization parameter
                //add by xlm for use mpp or vpuapi
                pVideoEnc->bIsUseMpp = OMX_FALSE;
                pVideoEnc->bIsNewVpu = OMX_TRUE;        
            -> 初始化input port: pRockchipComponent->pRockchipPort[INPUT_PORT_INDEX]
                一堆赋值操作
            -> 初始化output port: pRockchipComponent->pRockchipPort[OUTPUT_PORT_INDEX]
                一堆赋值操作
            -> pOMXComponent 设置一堆函数指针
                pOMXComponent->UseBuffer              = &Rkvpu_OMX_UseBuffer;
                pOMXComponent->AllocateBuffer         = &Rkvpu_OMX_AllocateBuffer;
                pOMXComponent->FreeBuffer             = &Rkvpu_OMX_FreeBuffer;
                pOMXComponent->ComponentTunnelRequest = &Rkvpu_OMX_ComponentTunnelRequest;
                pOMXComponent->GetParameter           = &Rkvpu_OMX_GetParameter;
                pOMXComponent->SetParameter           = &Rkvpu_OMX_SetParameter;
                pOMXComponent->GetConfig              = &Rkvpu_OMX_GetConfig;
                pOMXComponent->SetConfig              = &Rkvpu_OMX_SetConfig;
                pOMXComponent->GetExtensionIndex      = &Rkvpu_OMX_GetExtensionIndex;
                pOMXComponent->ComponentRoleEnum      = &Rkvpu_OMX_ComponentRoleEnum;
                pOMXComponent->ComponentDeInit        = &Rockchip_OMX_ComponentDeInit;
            -> pRockchipComponent设置一堆函数指针
                pRockchipComponent->rockchip_codec_componentInit      = &Rkvpu_Enc_ComponentInit;
                pRockchipComponent->rockchip_codec_componentTerminate = &Rkvpu_Enc_Terminate;
                pRockchipComponent->rockchip_AllocateTunnelBuffer = &Rkvpu_OMX_AllocateTunnelBuffer;
                pRockchipComponent->rockchip_FreeTunnelBuffer     = &Rkvpu_OMX_FreeTunnelBuffer;
                pRockchipComponent->rockchip_BufferProcessCreate    = &Rkvpu_OMX_BufferProcess_Create;  //注意这个函数指针,会启动两个线程
                pRockchipComponent->rockchip_BufferProcessTerminate = &Rkvpu_OMX_BufferProcess_Terminate;
                pRockchipComponent->rockchip_BufferFlush          = &Rkvpu_OMX_BufferFlush;
            -> 为pVideoEnc中的AVCComponent数组设置参数,????这里比较可疑,没有生效
                INIT_SET_SIZE_VERSION(&pVideoEnc->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE);
                pVideoEnc->AVCComponent[i].nPortIndex = i;
                pVideoEnc->AVCComponent[i].eProfile   = OMX_VIDEO_AVCProfileBaseline;
                pVideoEnc->AVCComponent[i].eLevel     = OMX_VIDEO_AVCLevel31;
                pVideoEnc->AVCComponent[i].nPFrames = 20;
                pVideoEnc->codecId = OMX_VIDEO_CodingAVC;
                pRockchipPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
            ->设置状态机:     pRockchipComponent->currentState = OMX_StateLoaded;
            ->>>>>>Rkvpu_OMX_Venc: Rockchip_OMX_ComponentConstructor end
    ->>>>>>Rockchip_OMX_Component_Register: Rockchip_OMX_ComponentLoad(loadComponent)  end
        rockchip_component 就是调用者传进的参数loadComponent
        rockchip_component->libHandle = libHandle;
        rockchip_component->pOMXComponent = pOMXComponent;
        rockchip_component->rkversion = OMX_COMPILE_INFO;
    -> loadComponent->pOMXComponent->SetCallbacks(loadComponent->pOMXComponent, pCallBacks, pAppData)
        这里会设置一个回调,回调函数是从OMX中创建的 OMXNodeInstance 对象的 kCallbacks
    ->>>>>> Rockchip_OMX_Core: RKOMX_GetHandle(pHandle, cComponentName, pAppData, pCallBacks)  end
        返回给调用者的 pHandle = loadComponent->pOMXComponent
    -> 构建 RKOMXComponent comp
        comp.mComponent = *component //这里的component就是上一步RKOMX_GetHandle的参数pHandle
        comp.mCore = mCores[i];
    -> mComponents.push_back(comp); 把组件加入队列
->>>> 循环结束
->>>> RKOMXPlugin::makeComponentInstance结束
-> instance->setHandle(handle) // instance是OMXNodeInstance对象,
    这里把上面创建的OMX_COMPONENTTYPE *handle给赋值到OMXNodeInstance:mHandle
->>>> OMX::allocateNode结束
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,242评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,953评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 171,299评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,709评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,723评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,236评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,629评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,594评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,135评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,156评论 3 345
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,285评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,914评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,600评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,073评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,203评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,798评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,339评论 2 365

推荐阅读更多精彩内容