Stagefright 之 VideoRendering

Stagefright之五

                                                            ——VideoRendering      

AwesomePlayer::onVideoEvent通过OMXCodec::read取得解码后的数据,同时将这些数据 (mVideoBuffer)传给video renderer,以便显示到屏幕上去。

 

(1)   在mVideoBuffer中的数据显示出来之前,要先建立mVideoRenderer

*******************************************************************************

void AwesomePlayer::onVideoEvent()

{

  mVideoSource->read(&mVideoBuffer,&options);

 

  if(mVideoRenderer = = NULL)

  {

   initRenderer_l();

  }

mVideoRenderer->render(mVideoBuffer);

mLastVideoBuffer= mVideoBuffer;

postVideoEvent_l();

}

*******************************************************************************

void AwesomePlayer::initRenderer_l()

{

  if(!strncmp("OMX.", component, 4)) {

           mVideoRenderer = new AwesomeRemoteRenderer(

               mClient.interface()->createRenderer(

                        mISurface, component,

                       (OMX_COLOR_FORMATTYPE)format,

                        decodedWidth,decodedHeight,

                        mVideoWidth,mVideoHeight,

                        rotationDegrees));                  ... ... ...(2)

       } else {

           mVideoRenderer = new AwesomeLocalRenderer(

                false,  // previewOnly

                component,

                (OMX_COLOR_FORMATTYPE)format,

                mISurface,

                mVideoWidth, mVideoHeight,

                decodedWidth, decodedHeight,rotationDegrees);   ... ... ...(3)

       }

}

*****************************************************************************

(2)假如video decoder是一个OMX 组件,这样就必须建立一个AwesomeRemoteRenderer作为mVideoRenderer

       从上段的代码(1)来看,AwesomeRemoteRenderer的实际上是由OMX::createRenderer所创建的。createRenderer会先建立一个hardware renderer --SharedVideoRenderer (libstagefrighthw.so);若失败,则建立software renderer -- SoftwareRenderer (surface)。

*******************************************************************************

sp<IOMXRenderer>OMX::createRenderer(...)

{

  VideoRenderer *impl = NULL;

  libHandle= dlopen("libstagefrighthw.so", RTLD_NOW);

  if(libHandle)

  {

   CreateRendererFunc func = dlsym(libHandle, ...);

       impl= (*func)( ...);

    impl= new SharedVideoRenderer(libHandle, impl); ----------------- Hardware Renderer

  }

  if(!impl)

  {

    impl = new SoftwareRenderer(...);                              ----------------Software Renderer

  }

}

*******************************************************************************

(3)假如video decoder是一个software 组件,这样就必须建立一个AwesomeLocalRenderer作为mVideoRenderer

       AwesomeLocalRenderer 的构造函数constructor会调用自身的init()函数,功能与(2)所讲述的OMX::createRenderer是一模一样的。详见AwesomePlayer.cpp代码。

 

(4) 一旦mVideoRenderer建立,初始化后,就可以将解码后的data传送给它。

*******************************************************************************

void AwesomePlayer::onVideoEvent()

{

  mVideoRenderer->render(mVideoBuffer);            -------------- Render Data

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值