首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于OpenMAX IL的安卓曲面HW渲染

基于OpenMAX IL的安卓曲面HW渲染
EN

Stack Overflow用户
提问于 2012-12-05 18:53:21
回答 1查看 5K关注 0票数 2

我想使用OMX渲染器,如下所述:http://www.slideshare.net/RaghavanVenkateswaran/iomx-in-android

操作系统:Android2.3.4

使用的系统库: libmedia,libbinder,libstagefright,libutils

我的设备上的OMX组件:

componentName: OMX.ITTIAM.AAC.decode,componentRole: audio_decoder.aac

componentName: OMX.ITTIAM.AAC.encode,componentRole: audio_encoder.aac

componentName: OMX.TI.720P.Decoder,componentRole: video_decoder.mpeg4

componentName: OMX.TI.720P.Decoder,componentRole: video_decoder.avc

componentName: OMX.TI.720P.Encoder,componentRole: video_encoder.mpeg4

componentName: OMX.TI.720P.Encoder,componentRole: video_encoder.avc

componentName: OMX.TI.AAC.decode,componentRole: audio_decoder.aac

componentName: OMX.TI.AAC.encode,componentRole: audio_encoder.aac

componentName: OMX.TI.AMR.decode,componentRole: audio_decoder.amrnb

componentName: OMX.TI.AMR.encode,componentRole: audio_encoder.amrnb

componentName: OMX.TI.Camera,componentRole: camera.yuv

componentName: OMX.TI.JPEG.decoder,componentRole: image_decoder.jpeg

componentName: OMX.TI.JPEG.encoder,componentRole: image_encoder.jpeg

componentName: OMXTI.MP3.解码器,componentRole: audio_decoder.mp3

componentName: OMX.TI.VPP,componentRole: iv_renderer.yuv.overlay

componentName: OMX.TI.Video.Decoder,componentRole: video_decoder.h263

componentName: OMX.TI.Video.Decoder,componentRole: video_decoder.avc

componentName: OMX.TI.Video.Decoder,componentRole: video_decoder.mpeg2

componentName: OMX.TI.Video.Decoder,componentRole: video_decoder.mpeg4

componentName: OMX.TI.Video.Decoder,componentRole: video_decoder.wmv

componentName: OMX.TI.Video.encoder,componentRole: video_encoder.mpeg4

componentName: OMX.TI.Video.encoder,componentRole: video_encoder.h263

componentName: OMX.TI.Video.encoder,componentRole: video_encoder.avc

componentName: OMX.TI.WBAMR.decode,componentRole: audio_decoder.amrwb

componentName: OMX.TI.WBAMR.encode,componentRole: audio_encoder.amrwb

componentName: OMX.TI.WMA.decode,componentRole: audio_decoder.wma

我已经完成了以下步骤:

1 )以这种方式通过JNI传递Android对象(与本机MediaPlayer完全相同):

JNI (C++):

代码语言:javascript
运行
复制
static void com_mautilus_media_MMediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz)
{
    __android_log_print(ANDROID_LOG_INFO, TAG, "setVideoSurface");

    MMediaPlayer *mp = getMediaPlayer(env, thiz);

    if (mp == NULL )
    {
        jniThrowException(env, "java/lang/IllegalStateException", NULL);
        return;
    }

    setVideoSurface(mp, env, thiz);

}
static void setVideoSurface(MMediaPlayer *mp, JNIEnv *env, jobject thiz)
{
    __android_log_print(ANDROID_LOG_INFO, TAG, "setVideoSurface");

    jobject surface = env->GetObjectField(thiz, fields.surface);

    if (surface != NULL && mp != NULL)
    {
        const android::sp<android::Surface> native_surface = get_surface(env, surface);
        mp->setVideoSurface(native_surface);

    }
}

MMediaPlayer中的表面变量声明为:

代码语言:javascript
运行
复制
android::sp<android::Surface> surface;

Java:

代码语言:javascript
运行
复制
private Surface mSurface; // accessed by native methods
private SurfaceHolder mSurfaceHolder;

public void setDisplay(SurfaceHolder sh)
{
    mSurfaceHolder = sh;

    if (sh != null)
    {
        mSurface = sh.getSurface();
    }
    else
    {
        mSurface = null;
    }

    setVideoSurface(); // Native function call
}

2,初始化IOMX节点:

注意:硬编码的值仅用于简单性和测试目的。

代码语言:javascript
运行
复制
android::sp<android::IServiceManager> serviceManager = android::defaultServiceManager();
android::sp<android::IBinder> binder = serviceManager>getService(android::String16("media.player"));
android::sp<android::IMediaPlayerService> mediaPlayerService = android::interface_cast<android::IMediaPlayerService>(binder);
android::sp<android::IOMX> iomx = mediaPlayerService->getOMX();


android::IOMX::node_id node;

// observer is instance of class derived from android::BnOMXObserver class
iomx->allocateNode("OMX.TI.VPP", observer, &mRendererNode->node);

OMX_PARAM_PORTDEFINITIONTYPE portDefn;
portDefn.nPortIndex = 1;

iomx->getParameter(node, OMX_IndexParamPortDefinition, &portDefn, sizeof(portDefn));

//portDefn.nBufferCountActual = mInBufCnt; // set some suitable value here or don’t update to
//use default value

portDefn.format.video.nFrameWidth = 256; // width of the video to be played
portDefn.format.video.nFrameHeight = 144; // height of video to be played
portDefn.format.video.nStride = 256;
portDefn.format.video.nSliceHeight = 144;
iomx->setParameter(node, OMX_IndexParamPortDefinition, &portDefn, sizeof(portDefn));


portDefn.nPortIndex = 2;
iomx->getParameter(node, OMX_IndexParamPortDefinition, &portDefn, sizeof(portDefn));
//portDefn.nBufferCountActual = iOutBufCnt; // set suitable value or leave to default.
portDefn.nBufferSize = (256 * 144 * 3) / 2;
portDefn.format.video.nFrameWidth = 256;
portDefn.format.video.nFrameHeight = 144;
portDefn.format.video.nStride = 256;
portDefn.format.video.nSliceHeight = 144;
iomx->setParameter(node, OMX_IndexParamPortDefinition, &portDefn, sizeof(portDefn));

3,尝试创建OMX:

代码语言:javascript
运行
复制
android::sp<android::IOMXRenderer> mOMXRenderer;

mOMXRenderer = omxContext->iomx->createRenderer(surface, "OMX.TI.VPP", OMX_COLOR_FormatYUV420Planar, 256, 144, displayWidth, displayHeight, 0);

它总是返回NULL。

有人知道这是怎么回事吗?我是否初始化了错误的组件?还是一定有一些特殊的呼叫顺序?还是别的什么?

EN

回答 1

Stack Overflow用户

发布于 2012-12-18 19:11:10

使用IOMX.h中定义的createRendererFromJavaSurface

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13730356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档