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
}