最近在弄一个多媒体硬件码的程序,参考高通的源代码的时候发现,原来用来渲染的解码数据的渲染函数getIOMX()->createRendererFromJavaSurface以及renderer()->render通通不见了,查看android 源代码IOMX.h,发现确实没有这些函数,Google了下,发现git dff给出了代码更新情况。这里把前后版本的渲染过程记录下来:
旧版本stagefright中,可以通过jni将java层创建的surface传递给下层
获取应用所创建的surface的id
在java层创建surface
public Surface mSurface; // accessed by native methods
public void setDisplay(SurfaceHolder sh) {
mSurfaceHolder = sh;
if (sh != null) {
mSurface = sh.getSurface();
}
}
获取应用所创建的surface的id
public Surface mSurface; // accessed by native methods
public void setDisplay(SurfaceHolder sh) {
mSurfaceHolder = sh;
if (sh != null) {
mSurface = sh.getSurface();
}
}
static void
com_vedio_player_MediaPlayerTest_native_init(JNIEnv *env)
{
....
jfieldID fields.surface = env->GetFieldID(jclass clazz, "mSurface", Landroid/view/Surface;");
}
使用获取的id来得到surface的引用,并将它传递到本地 MediaPlayer
static void
com_vedio_player_MediaPlayerTest_native_init(JNIEnv *env)
{
....
jfieldID fields.surface = env->GetFieldID(jclass clazz, "mSurface", Landroid/view/Surface;");
}
static void
com_vedio_player_MediaPlayerTest_start(JNIEnv *env, jobject thiz)
{
LOGV("start");
//mediaplayertest *mp = new mediaplayertest();
...
jobject surface = env->GetObjectField(thiz, fields.surface);
mp->start(env, surface);
}
可以通过JNI得到应用传递下来的surface对象来创建视频渲染器对象
static void
com_vedio_player_MediaPlayerTest_start(JNIEnv *env, jobject thiz)
{
LOGV("start");
//mediaplayertest *mp = new mediaplayertest();
...
jobject surface = env->GetObjectField(thiz, fields.surface);
mp->start(env, surface);
}
sp mOMXRenderer = mOMX->createRenderer(surface, compName,
OMX_COLOR_FormatYUV420Planar,
vidWidth, vidHeight,
displayWidth, displayHeight,
rotationDegrees);
mOMXRenderer->render(mVideoBuffer);
不知道Google基于什么原因把这个简单的调用过程给去掉了,导致我需要改代码来完成视频渲染过程
在处理多媒体硬件码程序时,发现高通源代码中用于渲染解码数据的函数getIOMX()->createRendererFromJavaSurface以及renderer()->render已消失于Android源代码IOMX.h。通过分析旧版本stagefright中的调用过程,了解到如何通过JNI将Java层创建的surface传递给下层进行渲染。解析了旧版流程包括获取应用所创建的surface id、在Java层创建surface、使用surface id得到surface引用并传递给本地MediaPlayer。旧版本通过JNI得到surface对象,创建视频渲染器对象,最终使用渲染器渲染解码后的视频数据。Google移除这一简单调用过程的原因未知,但需修改代码以适应新流程。
5509

被折叠的 条评论
为什么被折叠?



