stagefright框架(五)-Video Rendering

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

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

  
  
  
  
  1. void AwesomePlayer::onVideoEvent() 
  2.   ... 
  3.  
  4.   if (mVideoRenderer == NULL) 
  5.   { 
  6.     initRenderer_l(); 
  7.   } 
  8.  
  9.   ... 
  10.  
  11. void AwesomePlayer::initRenderer_l() 
  12.   if (!strncmp("OMX.", component, 4)) 
  13.   { 
  14.     mVideoRenderer = new AwesomeRemoteRenderer( 
  15.                            mClient.interface()->createRenderer( 
  16.                                                   mISurface, 
  17.                                                   component, 
  18.                                                   ...)); .......... (2) 
  19.   } 
  20.   else 
  21.   { 
  22.     mVideoRenderer = new AwesomeLocalRenderer( 
  23.                            ..., 
  24.                            component, 
  25.                            mISurface); ............................ (3) 
  26.   } 

(2) 如果video decoder是OMX component,則建立一個AwesomeRemoteRenderer作為mVideoRenderer

從上段的程式碼(1)來看,AwesomeRemoteRenderer的本質是由OMX::createRenderer所創建的。createRenderer會先建立一個hardware renderer -- SharedVideoRenderer (libstagefrighthw.so);若失敗,則建立software renderer -- SoftwareRenderer (surface)。

  
  
  
  
  1. sp<IOMXRenderer> OMX::createRenderer(...) 
  2.   VideoRenderer *impl = NULL; 
  3.  
  4.   libHandle = dlopen("libstagefrighthw.so", RTLD_NOW); 
  5.  
  6.   if (libHandle) 
  7.   { 
  8.     CreateRendererFunc func = dlsym(libHandle, ...); 
  9.  
  10.     impl = (*func)(...); <----------------- Hardware Renderer 
  11.   } 
  12.  
  13.   if (!impl) 
  14.   { 
  15.     impl = new SoftwareRenderer(...); <---- Software Renderer 
  16.   } 

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

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

  
  
  
  
  1. void AwesomeLocalRenderer::init(...) 
  2.   mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); 
  3.  
  4.   if (mLibHandle) 
  5.   { 
  6.     CreateRendererFunc func = dlsym(...); 
  7.  
  8.     mTarget = (*func)(...); <---------------- Hardware Renderer 
  9.   } 
  10.  
  11.   if (mTarget == NULL) 
  12.   { 
  13.     mTarget = new SoftwareRenderer(...); <--- Software Renderer 
  14.   } 
stagefright框架(五)-Video Rendering_第1张图片


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

  
  
  
  
  1. void AwesomePlayer::onVideoEvent() 
  2.   if (!mVideoBuffer) 
  3.   { 
  4.     mVideoSource->read(&mVideoBuffer, ...); 
  5.   } 
  6.  
  7.   [Check Timestamp] 
  8.  
  9.   if (mVideoRenderer == NULL) 
  10.   { 
  11.     initRenderer_l(); 
  12.   } 
  13.  
  14.   mVideoRenderer->render(mVideoBuffer); <----- Render Data 

stagefright框架(五)-Video Rendering_第2张图片

 

stagefright框架(五)-Video Rendering_第3张图片

你可能感兴趣的:(android,stagefright,OpenMax)