stagefright框架(五)-Video Rendering

本文详细介绍了在AwesomePlayer中如何通过AwesomeRemoteRenderer和AwesomeLocalRenderer将解码后的视频缓冲区mVideoBuffer渲染到屏幕的过程。根据video decoder类型的不同,选择了不同的renderer实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值