StagefrightPlayer的OpenMax调用流程

硬件厂家的OMX:
libstagefrighthw.so            OMXPlugin.cpp       OMX插件     TCC_OMX_Plugin.cpp
libOMX_Core.so                 OMX_Core.c          OMX调度核心 tcc_omxcore.c
libOMX.TI.Video.Decoder.so     OMX_VideoDecoder.c  OMX组件
OMX适配层==》OMX插件 ==》OMX调度核心 ==》OMX组件
[AwesomePlayer-->OMXCodec-->new OMX-->new OMXMaster-->addPlugin("libstagefrighthw.so")-->createOMXPlugin-->new TIOMXPlugin-->dlopen("libOMX_Core.so", RTLD_NOW))-->TIOMX_Init]

OMXMaster构造函数中解析[dlopen dlsym]libstagefrighthw.so库创建createOMXPlugin硬件插件TIOMXPlugin【工厂模式】,硬件厂家的OMX是封装为插件后插入Android本地OMX适配层的。
@0AwesomePlayer::setSurfaceTexture-->setNativeWindow_l(new SurfaceTextureClient(surfaceTexture))-->SurfaceTextureClient::init()
 #1new SurfaceTextureClient(surfaceTexture)-->SurfaceTextureClient::init()&&setISurfaceTexture-->参数初始化mSurfaceTexture = surfaceTexture;
 #2mNativeWindow = native-->2mNativeWindow=SurfaceTextureClient
@1AwesomePlayer::onPrepareAsyncEvent()
 #1AwesomePlayer::initVideoDecoder
  ##1OMXCodec::Create
    ###1observer = new OMXCodecObserver;
   ###2OMX::allocateNode-->new OMXNodeInstance(this, observer)
                         -->mMaster->makeComponentInstance(name, &OMXNodeInstance::kCallbacks,instance, &handle)注册回调函数;-->OMXMaster::makeComponentInstance-->TIOMXPlugin::makeComponentInstance-->TIOMX_GetHandle[OMX_Core.c]根据组件名找到组件库并打开获取pComponentInit=OMX_ComponentInit-->初始化组件(*pComponentInit)(*pHandle)-->设置组件回调函数(componentType->SetCallbacks)(*pHandle, pCallBacks, pAppData);
                         -->mDispatchers.add(*node, new CallbackDispatcher(instance));-->new CallbackDispatcherThread创建事件分发线程-->OMX::CallbackDispatcher::loop()循环-->dispatch-->instance.onMessage
                         -->instance->setHandle(*node, handle)这个调用的确非常重要,保存组件handle和实例ID 关联OMX组件和本地OMX实例,后续两者直接调用
    ###3new OMXCodec(omx, node, quirks, flags,createEncoder, mime, componentName,source, nativeWindow);
    ###4observer->setCodec(codec);///建立OMXCodecObserver与OMXCodec的关系
    ###5codec->configureCodec(meta);
  ##2OMXCodec->start-->mVideoTrack.start 启动获取数据和解析数据并填入mPortBuffers[kPortIndexInput]待onVideoEvent处理
 
@2AwesomePlayer::onVideoEvent()
 #1OMXCodec::read(buffer)##1===>drainInputBuffers-->drainInputBuffer(BufferInfo *info)-->mVideoTrack.read&&OMX.emptyBuffer-->OMXNodeInstance::emptyBuffer-->OMX_EmptyThisBuffer-->hComponent->EmptyThisBuffer[OMX_ComponentInit=>pHandle->EmptyThisBuffer=VIDDEC_EmptyThisBuffer]-->VIDDEC_EmptyThisBuffer-->write(filled_inBuf_Q[1])====pthread&&pipe[filled_inBuf_Q]====VIDDEC_HandleDataBuf_FromApp(read(filled_inBuf_Q[0])-->LCML_QueueBuffer-->EmptyBufferDone)-->gobacknow
                                     VIDDEC_FreeBuffer<--OMX_FreeBuffer<--OMX::freeBuffer<--OMXCodec::freeBuffer<--OMXCodec::on_message<--OMXCodecObserver::onMessage <--OMXNodeInstance::onMessage<--dispatch<--loop<--Dispatcher(node)->post(msg)<--OMX::OnEmptyBufferDone<--OMXNodeInstance::OnEmptyBufferDone<--EmptyBufferDone
                         ##2===>fillOutputBuffers-->fillOutputBuffer(BufferInfo *info)-->OMX.fillBuffer-->OMXNodeInstance::fillBuffer()-->OMX_FillThisBuffer-->hComponent->FillThisBuffer[OMX_ComponentInit=>pHandle->FillThisBuffer=VIDDEC_FillThisBuffer]-->VIDDEC_FillThisBuffer-->write1-write2[cb.LCML_Callback=VIDDEC_LCML_Callback{write(filled_outBuf_Q[1])}]====pthread&&pipe[filled_outBuf_Q]====VIDDEC_HandleDataBuf_FromDsp{read(filled_outBuf_Q[0])}-->VIDDEC_FillBufferDone(pComponentPrivate, pBuffHead)-->gobacknow
                                      <--mBufferFilled.signal()<--mFilledBuffers.push_back(i)<--OMXCodec::on_message<--OMXCodecObserver::onMessage <--OMXNodeInstance::onMessage<--dispatch<--loop<--Dispatcher(node)->post(msg)<--OMX::OnFillBufferDone<--OMXNodeInstance::OnFillBufferDone<--调用回调函数pComponentPrivate->cbInfo.FillBufferDone<--VIDDEC_FillBufferDone
                         ##3===>buffer:*mFilledBuffers.begin()-->*info = &mPortBuffers[kPortIndexOutput].editItemAt(index);-->*buffer = info->mMediaBuffer;
 #2initRenderer_l()===Android4.0-->new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees)-->new AwesomeRenderer()
                   ===Android2.3-->IOMXRenderer native=OMX::createRenderer(mISurface, component,(OMX_COLOR_FORMATTYPE)format,decodedWidth, decodedHeight,mVideoWidth, mVideoHeight,rotationDegrees)-->createRendererWithRotation/createRenderer-->new TCCRendererOutHw-->initDevice/mSurface->createOverlay/
                                --> mVideoRenderer = new AwesomeRemoteRenderer(native)
 #3render-->native_window_set_buffers_timestamp--> mNativeWindow->queueBuffer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值