最近在弄一个多媒体硬件码的程序,参考高通的源代码的时候发现,原来用来渲染的解码数据的渲染函数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基于什么原因把这个简单的调用过程给去掉了,导致我需要改代码来完成视频渲染过程