Stagefright (5) - Video Rendering

AwesomePlayer::onVideoEvent除了透過OMXCodec::read取得解碼後的資料外,還必須將這些資料 (mVideoBuffer)傳給video renderer,以便畫到螢幕上去。

(1) 要將mVideoBuffer中的資料畫出來之前,必須先建立mVideoRenderer

void AwesomePlayer::onVideoEvent()
{
  ...

  if (mVideoRenderer == NULL)
  {
    initRenderer_l();
  }

  ...
}

void AwesomePlayer::initRenderer_l()
{
  if (!strncmp("OMX.", component, 4))
  {
    mVideoRenderer = new AwesomeRemoteRenderer(
                           mClient.interface()->createRenderer(
                                                  mISurface,
                                                  component,
                                                  ...)); .......... (2)
  }
  else
  {
    mVideoRenderer = new AwesomeLocalRenderer(
                           ...,
                           component,
                           mISurface); ............................ (3)
  }
}


(2) 如果video decoder是OMX component,則建立一個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)(...); <----------------- Hardware Renderer
  }

  if (!impl)
  {
    impl = new SoftwareRenderer(...); <---- Software Renderer
  }
}



(3) 如果video decoder是software component,則建立一個AwesomeLocalRenderer作為mVideoRenderer

AwesomeLocalRenderer 的constructor會呼叫本身的init函式,其所做的事和OMX::createRenderer一模一樣。

void AwesomeLocalRenderer::init(...)
{
  mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);

  if (mLibHandle)
  {
    CreateRendererFunc func = dlsym(...);

    mTarget = (*func)(...); <---------------- Hardware Renderer
  }

  if (mTarget == NULL)
  {
    mTarget = new SoftwareRenderer(...); <--- Software Renderer
  }
}



(4) mVideoRenderer一經建立就可以開始將解碼後的資料傳給它

void AwesomePlayer::onVideoEvent()
{
  if (!mVideoBuffer)
  {
    mVideoSource->read(&mVideoBuffer, ...);
  }

  [Check Timestamp]

  if (mVideoRenderer == NULL)
  {
    initRenderer_l();

  }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值