android Stagefright渲染器构造变化

在处理多媒体硬件码程序时,发现高通源代码中用于渲染解码数据的函数getIOMX()->createRendererFromJavaSurface以及renderer()->render已消失于Android源代码IOMX.h。通过分析旧版本stagefright中的调用过程,了解到如何通过JNI将Java层创建的surface传递给下层进行渲染。解析了旧版流程包括获取应用所创建的surface id、在Java层创建surface、使用surface id得到surface引用并传递给本地MediaPlayer。旧版本通过JNI得到surface对象,创建视频渲染器对象,最终使用渲染器渲染解码后的视频数据。Google移除这一简单调用过程的原因未知,但需修改代码以适应新流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在弄一个多媒体硬件码的程序,参考高通的源代码的时候发现,原来用来渲染的解码数据的渲染函数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

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_start(JNIEnv *env, jobject thiz)
{
    LOGV("start");
    //mediaplayertest *mp = new mediaplayertest();
    ...
    jobject surface = env->GetObjectField(thiz, fields.surface);
    mp->start(env, surface);
}
可以通过JNI得到应用传递下来的surface对象来创建视频渲染器对象

    sp mOMXRenderer = mOMX->createRenderer(surface, compName, 
    OMX_COLOR_FormatYUV420Planar,
    vidWidth, vidHeight,
    displayWidth, displayHeight,
    rotationDegrees);

最后就可以使用该渲染器来渲染解码好的视频数据了

mOMXRenderer->render(mVideoBuffer);

不知道Google基于什么原因把这个简单的调用过程给去掉了,导致我需要改代码来完成视频渲染过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值