stagefright框架(五)-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
}

 

 

你可能感兴趣的:(stagefright框架(五)-Video Rendering)