1,java层

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

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

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

public voidsurfaceChanged(SurfaceHolderholder, intformat,

int width, int height)

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

C代码中对应的函数在mediastreamer2\src\android\android-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代码层对应代码在mediastreamer2\src\utils\opengles_display.c中ogl_display_render函数,在此函数中将opengles_display中yuv数据绘制到opengl surface中。


更多相关文章

  1. Android(安卓)SDK Manager下载和更新失败方法详解
  2. 一起学android之选项菜单创建(4)
  3. 以修改字体为例谈Android的listView开发优化
  4. android 开发(备忘记录+问题累积)--- 不断更新
  5. Google Espresso 环境搭建以及简单使用教程
  6. Android培训班(22)
  7. Tensorflow:Android调用Tensorflow Mobile版本API(2)-基于Android的
  8. android中自定义标签ImageButton
  9. Android(安卓)AMS(三) App启动过程之onResume

随机推荐

  1. Android 学习路线
  2. android aidl详解
  3. 绕过身份检测,破解Android SU
  4. Android 事件拦截/分发机制 (图解+代码)
  5. Android之android:launchMode
  6. 在Android里完美实现基站和WIFI定位
  7. Android 调用微信登陆、支付、分享,出现
  8. Android 分区挂载
  9. 130292015012 陈月凤 第一章作业
  10. 【Android】显示网络图片代码分析