Android多媒体开发(3)——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。
从上面的程序来看,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
}
上一篇: iOS11 和 iPhone X 的适配
下一篇: 数据库层级关系转换为树结构的json
推荐阅读
-
Android多媒体开发(3)——Video Rendering
-
android MVVM开发框架——(3)DataBinding 应用于RecyclerView
-
3月24日,着手开发 CriminalIntent,Android 开发,每日20行,第15天。
-
Android开发 OpenGL ES绘制3D 图形实例详解
-
Android开发 OpenGL ES绘制3D 图形实例详解
-
Unity3D手机游戏开发 博客分类: 计算机图书 android
-
Android多媒体之画画板开发案例分享
-
Android—基于微信开放平台v3SDK开发(微信支付填坑)
-
Android多媒体之画画板开发案例分享
-
Android—基于微信开放平台v3SDK开发(微信支付填坑)