zoukankan      html  css  js  c++  java
  • android linphone中opengl显示的实现

    1,java层

    在界面中创建GL2JNIView(基类为GLSurfaceView)。

    创建对象AndroidVideoWindowImpl,将GL2JNIView作为参数传入构造函数。在该对象中监听GL2JNIView的surface事件(mVideoRenderingView.getHolder().addCallback)。

    当surface变化时(如显示窗口大小变化、activity被其他程序遮住),此时触发回调函数:

    public void surfaceChanged(SurfaceHolderholder, intformat,

                        int width, int height)

    在该函数中调用LinphoneManager.getLc().setVideoWindow(vw); 将AndroidVideoWindowImpl对象传到c代码层

    C代码中对应的函数在mediastreamer2srcandroidandroid-opengl-display.c中android_display_set_window,

    此函数中调用步骤如下:

    (1)      (*jenv)->CallVoidMethod(jenv,window,ad->set_opengles_display_id,ptr);

    其中window为java传过来的AndroidVideoWindowImpl对象;ad->set_opengles_display_id为java 类AndroidVideoWindowImpl成员函数setOpenGLESDisplay;ptr为结构体变量opengles_display,该结构体存储yuv数据,在后面每帧显示时会用到。

    (2)      将AndroidVideoWindowImpl赋值给ad->android_video_window

    该函数主要完成java和c互换对象指针。这主要是由于opengl刷新每帧视频必须由java层的onDrawFrame来完成,而linphone的视频流在c层接收解码,需要由c函数来触发刷新。

    2,c代码层

    在android-opengl-display.c的每帧处理函数android_display_process中,

    调用(*jenv)->CallVoidMethod(jenv,ad->android_video_window,ad->request_render_id);其中ad->android_video_window为setVideoWindow传过来的AndroidVideoWindowImpl对象;ad->request_render_id为java类AndroidVideoWindowImpl成员函数requestRender

    该函数触发opengl刷新一帧,在java层会调用onDrawFrame。

    在onDrawFrame函数中调用c代码层的render,参数为第(1)中传到java层的opengles_display结构体。

    C代码层对应代码在mediastreamer2srcutilsopengles_display.c中ogl_display_render函数,在此函数中将opengles_display中yuv数据绘制到opengl surface中。


  • 相关阅读:
    细心也是一种态度
    EDM数据访问的三种方式
    如何快速提交网站备案 ICP备案
    c# winform 关于给静态全局变量赋值的问题
    c#DIY随机数类winform 2010
    手把手教你如何用IIS搭建手机WAP网站(图文)
    admin密码对应的MD5值,16位和32位,admin解密自己留着方便.
    C#实现MD5加密,winform c#2005
    最全的c#日期函数 winform
    如何解决因网站备案号没下来而网站被迫关闭的办法
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3508835.html
Copyright © 2011-2022 走看看